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
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在路由頁面,單擊創建 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名稱>