在 Kubernetes 常見的 API 中,Ingress 能夠暴露 HTTP 和 HTTPS 服務,並支持負載均衡,路由請求流量到後端 Service。默認情況下,所有 Ingress 對象都能夠訪問同一條 Ingress Controller 路徑。為了更好地控制入站請求,可以通過 Ingress Class 在多個 Ingress Controller 中切換。
一、Ingress Class查詢
你可以通過命令來查詢可用的 Ingress Class 列表:
kubectl get ingressclass
你會看到輸出類似下面這樣:
NAME CONTROLLER PARAMETERS AGE
nginx nginx-ingress-controller 69d
traefik traefik-ingress-controller 71d
example custom-ingress-controller api.example.com/metrics 5d
可以看出,名稱機制與 K8s 對象命名相一致。在 Ingress Class 中,可以有多個 Class,使用 `NAME` 欄位來區分。 `CONTROLLER` 欄位表示哪個 Ingress Controller 實例會處理該 Ingress Class。 另外,`PARAMETERS` 就是該 Ingress Controller 支持的參數,例如上面的示例, `custom-ingress-controller` 支持 `api.example.com/metrics` 作為特殊參數。
二、Ingress Class 控制超時時間
在有些情況下,你需要控制所有 Ingress 對象的超時時間,此時,可以使用 Ingress Class 去創建一個默認的 Ingress Class,從而影響所有的 Ingress 類型的超時時間。
在這裡,我們舉例說明這一過程:
我們需要在全局控制 Ingress 的超時時間,可以通過以下配置完成:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: global-timeout
spec:
controller: example-ingress-class
parameters:
timeout: "30s"
這裡我們定義了一個 Ingress Class 來控制所有 Ingress 的超時時間為 30 秒。 `controller` 指定了哪個 Ingress Controller 會處理該 Ingress Class,並且 `parameters` 用於傳遞自定義參數給 Ingress Controller。
三、Ingress Class 部署
Ingress Class 像大多數 Kubernetes 對象一樣,也可以通過 YAML 文件來部署。
下面的例子展示了如何使用 YAML 文件來創建一個 Ingress Class:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: special
spec:
controller: ingress-nginx-controller
parameters:
api-version: "networking.k8s.io/v2beta1"
kind: "Ingress"
name: "nginx-ingress"
在這裡,我們指定了 `ingress-nginx-controller` 作為該 Ingress Class 的 Ingress Controller, 並附帶了三個參數 `api-version` 表示使用的 Networking API 版本, `kind` 表示使用的對象類型, `name` 表示其他要使用該 Ingress Class 的對象。
四、Ingress Class Name
IngressClass 對象的名稱應該標識出 Ingress Class 的用途,以及與之關聯的 Ingress Controller。也就是說,名稱應該遵循以下格式:
{INGRESS_CONTROLLER_NAME}-{CLASS_NAME}
以下是一些合法的名稱示例:
example-ingress-class # Ingress Controller 名稱是 example
traefik-traefik # Ingress Controller 名稱是 traefik
nginx-internal # Ingress Controller 名稱是 nginx
五、Ingress Classes False
在 Kubernetes 1.21 之前,使用 Ingress Object 要求集群必須有一個 Ingress Controller。為了解決這一問題,Kubernetes 引入了 Ingress Classes 概念。通過 Ingress Classes, Ingress 對象可以具有與 Ingress Controller 相關的特殊屬性,然後由 Ingress Controller 處理適當的請求。
但是,在某些情況下,Ingress Controller 的選擇會失敗,也就是從 Ingress Controller 獲取響應時出錯會導致 Selection 失敗,因此 Ingress Controller 將不會使用該 Ingress。如果你希望暫時禁用 Ingress Controller 的選擇,可以通過在 Ingress Class 中設置 `ingressclass.kubernetes.io/is-default-class` 標籤為 false 實現。
以下是一個示例,標記 IngressClass 為非默認 Ingress Class:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: non-defaultclass
annotations:
ingressclass.kubernetes.io/is-default-class: "false"
spec:
controller: nginx-internal
六、Ingress Controller選取
要選擇特定的 Ingress Controller,請在 Ingress Class YAML 中設置 `controller` 欄位。這個值是 Ingress Controller 的名稱,該名稱必須與與那個 Ingress Controller 的使用匹配。
我們可以通過以下命令進行設置:
kubectl apply -f ingress-class.yaml
下面是一個使用 Ingress Controller 的示例:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: example-ingress-class
spec:
controller: ingress-nginx-controller # 設置 Ingress Controller
parameters:
api-version: "networking.k8s.io/v1"
kind: "Ingress"
name: "nginx-ingress"
七、總結
在 Kubernetes 中,IngressClass 可以使用多個 IngressController 來切換連接,默認 IngressController 可以處理所有的 Ingress。一個 Ingress Class 包含一個 controller 和一組參數,用於與之關聯的 Ingress 對象。IngressClasses 可以使得應用抽象化更好,更好地組織和擴展應用程序中的不同部分。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/247741.html