Ingress是Kubernetes中的一個資來源物件,用來管理叢集外部存取叢集內部服務的方式。您可以通過Ingress資源來配置不同的轉寄規則,從而根據轉寄規則訪問叢集內Pod。本文介紹如何通過控制台和kubectl方式建立、查看、更新和刪除Nginx Ingress。
前提條件
已建立Kubernetes叢集。具體操作,請參見建立ACK託管叢集。
注意事項
在您使用Nginx Ingress Controller時,請遵循以下注意事項。
使用組件時,請通過組件管理的方式或者OpenAPI的方式配置組件的自訂參數。通過其他渠道修改組件配置可能會導致組件功能異常,且會影響組件後續的升級過程。
請勿刪除Nginx Ingress Controller預設使用的Service(
kube-system/nginx-ingress-lb
)。將其刪除將會導致組件運行不穩定,嚴重時出現崩潰。請優先考慮使用相關註解或者設定項來實現所需功能,不建議您使用Snippet或Lua代碼等方式對組件進行額外配置。對於您使用Snippet等方式配置所出現的與預期功能不符等問題,將無法給予有效支援。
受上遊社區版組件影響,Nginx Ingress Controller可能存在Bug或漏洞,請注意及時升級組件,以避免開源組件Bug或漏洞導致您的業務受損。
在高負載情景下,推薦您使用獨立部署的方式將Nginx Ingress Controller部署在單獨的Node上。詳情請參見部署高可靠的Nginx Ingress Controller。
關於更多使用Nginx Ingress Controller的建議,請參見Nginx。
操作步驟
方式一:控制台操作步驟
建立Nginx Ingress
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在路由頁面,單擊建立 Ingress,在建立 Ingress對話方塊配置路由。
配置項
說明
樣本值
網關類型
可按需選擇ALB Ingress、MSE Ingress和Nginx Ingress三種網關類型。
關於三種網關的差異,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比。
Nginx Ingress
名稱
自訂路由名稱。
nginx-ingress
Ingress Class
自訂Ingress的類。
nginx
規則
單擊+ 添加規則可新增多個路由規則。
網域名稱:自訂網域名。
路徑映射:配置如下配置項。
路徑:指定服務訪問的URL路徑。本例中不做配置,保留根路徑/。
匹配規則:支援首碼匹配(Prefix)、完整匹配(Exact)和預設(ImplementationSpecific)。
服務名稱:選擇目標服務,即K8s內的Service。
連接埠:選擇服務需要暴露的連接埠。
Ingress支援同一個網域名稱下配置多條路徑。單擊+ 添加路徑新增路徑。
網域名稱:test.example.com
路徑映射:
路徑:/
匹配規則:預設(ImplementationSpecific)
服務名稱:nginx-ingress-lb
連接埠:80
TLS配置
開啟TLS配置開關,配置安全的路由服務。
網域名稱:自訂網域名。
保密字典:根據需要選擇對應的保密字典。
如果您需要建立Secret,請執行如下操作。
在保密字典右側,單擊建立。
在建立 Secret對話方塊,自訂保密字典的名稱、Cert、Key,然後單擊確定。
在保密字典的下拉框,選擇已建立的Secret。
單擊+ 新增TLS配置,可配置多條TLS。
Ingress的更多用法,請參見Ingress支援。
開啟TLS配置。
網域名稱:test.example.com
保密字典:cert
更多配置
灰階發布:開啟灰階發布開關。灰階規則可按照要求標頭、Cookie 、權重三個維度進行設定。
說明要求標頭、Cookie 、權重可以只設定一種,若同時設定生效規則按要求標頭、Cookie、權重順序匹配。
按要求標頭:基於Request Header的流量切分,設定後會添加註解
nginx.ingress.kubernetes.io/canary-by-header
、nginx.ingress.kubernetes.io/canary-by-header-value
或nginx.ingress.kubernetes.io/canary-by-header-pattern
。按Cookie:基於Cookie的流量切分,設定後會添加註解
nginx.ingress.kubernetes.io/canary-by-cookie
。按權重:佈建要求到指定服務的百分比(值為0~100的整數),設定後會添加註解
nginx.ingress.kubernetes.io/canary-weight
。
協議:指定後端服務的協議,設定後會添加註解
nginx.ingress.kubernetes.io/backend-protocol
。支援HTTP、HTTPS、gRPC、gRPCS四種服務合約。
重寫路徑:將用戶端請求中的路徑重寫後發送到後端服務,設定後會添加註解
nginx.ingress.kubernetes.io/rewrite-target
。
開啟灰階發布。
生效規則選擇按要求標頭
要求標頭名稱:foo
匹配規則:按值匹配
匹配值:bar
協議:GRPC
重寫路徑:設定為空白
註解
您可自訂註解名稱和值,也可根據名稱選擇或搜尋要配置的註解。Ingress的註解請參見Annotations。
單擊+添加註解,可對Ingress無上限地添加註解。
名稱:nginx.ingress.kubernetes.io/proxy-body-size
值:10m
標籤
標籤的作用是為Ingress添加對應的標籤,標示該Ingress的特點。
單擊+添加標籤,可對Ingress無上限地添加標籤。
名稱:foo
值:bar
配置成功後,單擊確定。
在路由頁面,可以查看路由已成功建立。
相關操作
您可以在路由頁面,單擊目標路由操作列的更新、YAML編輯、監控,以及中的刪除,完成刪、改、查相關操作。
方式二:kubectl操作步驟
建立Nginx Ingress
建立Deployment和Service。
在建立Ingress資源之前,必須建立外部存取Kubernetes叢集中的服務。
使用以下內容,建立test-deployment-service.yaml。
以下YAML檔案中包含了一個名為test-web1的Deployment和一個名為web1-service的Service。
apiVersion: apps/v1 kind: Deployment metadata: name: test-web1 labels: app: test-web1 spec: replicas: 1 selector: matchLabels: app: test-web1 template: metadata: labels: app: test-web1 spec: containers: - name: test-web1 imagePullPolicy: IfNotPresent image: registry.cn-hangzhou.aliyuncs.com/yilong/ingress-test:web1 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: web1-service spec: type: ClusterIP selector: app: test-web1 ports: - port: 8080 targetPort: 8080
執行以下命令,建立Deployment和Service。
kubectl apply -f test-deployment-service.yaml
建立Ingress。
使用以下內容,建立test-ingress.yaml。
1.19版本之前叢集
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: test-ingress namespace: default spec: rules: - host: test-ingress.com http: paths: - path: /foo backend: serviceName: web1-service servicePort: 8080 - path: /bar backend: serviceName: web1-service servicePort: 8080
1.19及之後版本叢集
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress namespace: default spec: rules: - host: test-ingress.com http: paths: - path: /foo backend: service: name: web1-service port: number: 8080 pathType: ImplementationSpecific - path: /bar backend: service: name: web1-service port: number: 8080 pathType: ImplementationSpecific
name
:Ingress的名稱,本例為test-ingress。host
:指定服務訪問網域名稱。path
:指定訪問的URL路徑。SLB將流量轉寄到backend
之前,所有的入站請求都要先匹配host
和path
。backend
:由服務名稱和服務連接埠組成。服務名稱:Ingress轉寄的
backend
服務名稱。服務連接埠:服務暴露的連接埠。
執行以下命令,建立Ingress。
kubectl apply -f test-ingress.yaml
查看Nginx Ingress
執行以下命令,查看Ingress。
kubectl get ingress
更新Nginx Ingress
執行以下命令,更新Ingress。
kubectl edit ingress <ingress名稱>
刪除Nginx Ingress
執行以下命令,刪除Ingress。
kubectl delete ingress <ingress名稱>