ALB Ingress基于阿里云應用型負載均衡ALB(Application Load Balancer)之上提供更為強大的Ingress流量管理方式,兼容Nginx Ingress,具備處理復雜業務路由和證書自動發現的能力,支持HTTP、HTTPS和QUIC協議,滿足在云原生應用場景下對超強彈性和大規模七層流量處理能力的需求。您可以參考本文在ACS集群中部署服務并通過配置ALB Ingress實現Ingress流量管理。
ALB Ingress工作原理
ALB Ingress涉及到以下基本概念:
ALB Ingress Controller:負責管理Ingress資源的組件。它通過API Server動態地獲取Ingress資源和AlbConfig資源的變化,然后更新ALB實例。與Nginx Ingress Controller不同,ALB Ingress Controller 是 ALB 實例的控制面,負責管理 ALB 實例,但不直接處理用戶流量。用戶流量的轉發由 ALB 實例來實現。ALB Ingress Controller會通過集群API Server動態地獲取Ingress資源的變化,并依照Ingress所描述的轉發規則動態地更新ALB實例。
AlbConfig(CRD):AlbConfig是由ALB Ingress Controller創建的一種CRD (Custom Resource Definition) 。AlbConfig中的參數決定了ALB實例的配置。一個AlbConfig對應一個ALB實例。ALB實例是用戶請求流量的入口,負責將用戶請求轉發到后端Service中。它由應用型負載均衡ALB完全托管。相比起Nginx Ingress Controller,ALB Ingress免于運維,并且擁有更強大的彈性。
IngressClass:IngressClass定義了某一個Ingress與某一個AlbConfig的關聯。
Ingress:Ingress是Kubernetes中用于定義外部流量路由規則和訪問規則的資源對象,ALB Ingress Controller通過監測Ingress資源的變化并更新ALB實例以實現流量轉發。
Service:在Kubernetes中,Pod被認為是臨時資源,是不穩定而多變的。Service為具有相同功能的Pod提供了一個穩定、統一的入口。其他應用程序或服務可以通過訪問Service的虛擬IP和端口來與后端Pod進行通信,而無需關注Pod可能發生的變化。
您可參照下圖,理解ALB實例與ALB Ingress之間的邏輯關系:
使用限制
AlbConfig、Namespace、Ingress和Service這些資源的名稱不能以aliyun開頭。
場景示例
本教程以四個部署了Nginx的Pod為例,演示如何通過配置ALB Ingress,實現相同域名不同URL路徑的流量轉發。
前端請求 | 流量轉發至 |
|
|
|
|
前提條件
步驟一:部署后端服務
使用控制臺部署
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇
。在無狀態頁面,單擊右上角的使用YAML創建資源。
進入創建頁面。
示例模板:選擇自定義。
模板:輸入YAML配置文件代碼。該配置文件用于部署兩個名稱分別為
coffee
和tea
的Deployment,以及兩個名稱分別為coffee-svc
和tea-svc
的Service。apiVersion: apps/v1 kind: Deployment metadata: name: coffee spec: replicas: 2 selector: matchLabels: app: coffee template: metadata: labels: app: coffee spec: containers: - name: coffee image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: coffee-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: coffee type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 2 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: ClusterIP
配置完成后單擊創建,頁面將提示創建成功。
檢查Deployment和Service創建成功:
在左側導航欄,選擇工作負載 > 無狀態。可以查看到名稱為coffee和tea的Deployment已部署。
在左側導航欄,選擇網絡 > 服務。可查看到名稱為coffee-svc和tea-svc的Service已部署。
使用kubectl部署
使用以下內容創建cafe-service.yaml,用于部署兩個名稱分別為
coffee
和tea
的Deployment,以及兩個名稱分別為coffee-svc
和tea-svc
的Service。apiVersion: apps/v1 kind: Deployment metadata: name: coffee spec: replicas: 2 selector: matchLabels: app: coffee template: metadata: labels: app: coffee spec: containers: - name: coffee image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: coffee-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: coffee type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 2 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: ClusterIP
執行以下命令,部署兩個Deployment和兩個Service。
kubectl apply -f cafe-service.yaml
預期輸出:
deployment "coffee" created service "coffee-svc" created deployment "tea" created service "tea-svc" created
執行以下命令,查看應用和服務的狀態。
執行以下命令,查看應用的狀態。
kubectl get deployment
預期輸出:
NAME READY UP-TO-DATE AVAILABLE AGE coffee 2/2 2 2 2m26s tea 2/2 2 2 2m26s
執行以下命令,查看服務的狀態。
kubectl get svc
預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE coffee-svc ClusterIP 172.16.XX.XX <none> 80/TCP 9m38s tea-svc ClusterIP 172.16.XX.XX <none> 80/TCP 9m38s
步驟二:創建ALBConfig
通過控制臺創建ALBConfig
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇工作負載 > 自定義資源。
單擊右上角使用YAML創建資源。
示例模板:選擇自定義。
模板:輸入YAML配置文件代碼。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** #替換為實際的交換機ID - vSwitchId: vsw-uf6nun9tql5t8nh15**** #替換為實際的交換機ID listeners: - port: 80 protocol: HTTP
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
ALBConfig的名稱。
說明ALBConfig的名稱在集群中必須是唯一的。因此,在創建ALBConfig時,您需要確保ALBConfig名稱的唯一性,以避免命名沖突。
spec.config.name
否
ALB實例的名稱。
spec.config.addressType
否
ALB實例的網絡類型。取值如下:
Internet(默認值):公網類型。面向公網提供應用型負載均衡服務,公網可訪問。
說明應用型負載均衡通過綁定彈性公網IP進行公網服務,使用公網類型ALB實例將收取彈性公網IP的實例費與帶寬、流量費用,詳情參見按量付費。
Intranet:私網類型。面向VPC內部提供應用型負載均衡服務,公網不可訪問。
spec.config.zoneMappings
是
設置ALB交換機ID。創建交換機具體操作請參見創建和管理交換機。
說明指定的交換機必須在ALB當前所支持的可用區內,且與集群處于同一VPC。關于ALB支持的地域與可用區,請參見ALB支持的地域與可用區。
應用型負載均衡支持多可用區部署,若當前地域支持2個及以上可用區,為保障業務高可用,請至少選擇2個或以上不同可用區的交換機。
spec.listeners
否
配置ALB的監聽端口和協議。本文配置示例為端口80的HTTP監聽。
監聽定義了流量進入負載均衡的方式和規則,此處建議保留該配置,否則您需要另行創建監聽才可使用ALB Ingress。
配置完成后單擊創建,頁面將提示創建成功。
檢查ALB實例創建成功:
在頂部菜單欄,選擇實例所屬的地域。
在實例頁面,可以在實例列表中查看到名稱為alb-test的ALB實例,表示實例創建成功。
通過kubectl創建ALBConfig
拷貝以下內容到alb-test.yaml文件中,用于創建ALBConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** #替換為實際的交換機ID - vSwitchId: vsw-uf6nun9tql5t8nh15**** #替換為實際的交換機ID listeners: - port: 80 protocol: HTTP
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
ALBConfig的名稱。
說明ALBConfig的名稱在集群中必須是唯一的。因此,在創建ALBConfig時,您需要確保ALBConfig名稱的唯一性,以避免命名沖突。
spec.config.name
否
ALB實例的名稱。
spec.config.addressType
否
ALB實例的網絡類型。取值如下:
Internet(默認值):公網類型。面向公網提供應用型負載均衡服務,公網可訪問。
說明應用型負載均衡通過綁定彈性公網IP進行公網服務,使用公網類型ALB實例將收取彈性公網IP的實例費與帶寬、流量費用,詳情參見按量付費。
Intranet:私網類型。面向VPC內部提供應用型負載均衡服務,公網不可訪問。
spec.config.zoneMappings
是
設置ALB交換機ID。創建交換機具體操作請參見創建和管理交換機。
說明指定的交換機必須在ALB當前所支持的可用區內,且與集群處于同一VPC。關于ALB支持的地域與可用區,請參見ALB支持的地域與可用區。
應用型負載均衡支持多可用區部署,若當前地域支持2個及以上可用區,為保障業務高可用,請至少選擇2個或以上不同可用區的交換機。
spec.listeners
否
配置ALB的監聽端口和協議。本文的配置示例為端口80的HTTP監聽。
監聽定義了流量進入負載均衡的方式和規則,此處建議保留該配置,否則您需要另行創建監聽才可使用ALB Ingress。
執行以下命令,創建ALBConfig。
kubectl apply -f alb-test.yaml
預期輸出:
albconfig.alibabacloud.com/alb-demo created
可以看到ALBConfig已經創建成功。
步驟三:創建IngressClass
IngressClass建議與ALBConfig一一對應。
通過控制臺創建IngressClass
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇工作負載 > 自定義資源。
單擊右上角使用YAML創建資源。
示例模板:選擇自定義。
模板:輸入YAML配置文件代碼。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
IngressClass的名稱。
說明IngressClass的名稱在集群中必須是唯一的。因此,在創建IngressClass時,您需要確保IngressClass名稱的唯一性,以避免命名沖突。
spec.parameters.name
是
關聯的ALBConfig的名稱。
配置完成后單擊創建,頁面將提示創建成功。
檢查IngressClass創建成功:
在左側導航欄,選擇工作負載 > 自定義資源。
選擇資源對象瀏覽器頁簽。
在API組搜索欄中,輸入IngressClass進行搜索,可查看到對應的IngressClass已創建。
通過kubectl創建IngressClass
創建并拷貝以下內容到alb.yaml文件中,用于創建IngressClass。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
IngressClass的名稱。
說明IngressClass的名稱在集群中必須是唯一的。因此,在創建IngressClass時,您需要確保IngressClass名稱的唯一性,以避免命名沖突。
spec.parameters.name
是
關聯的ALBConfig的名稱。
執行以下命令,創建IngressClass。
kubectl apply -f alb.yaml
預期輸出:
ingressclass.networking.k8s.io/alb created
步驟四:創建Ingress
通過控制臺創建Ingress
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇網絡 > 路由。
在路由頁面,單擊創建 Ingress,在創建 Ingress對話框配置路由。
配置項
說明
示例值
網關類型
可按需選擇ALB和MSE兩種應用負載均衡網關類型。
ALB應用負載均衡
名稱
自定義路由名稱。
cafe-ingress
Ingress Class
自定義Ingress的類。
alb
規則
單擊+ 添加規則可新增多個路由規則。
域名:自定義域名。
路徑映射:配置如下配置項。
路徑:指定服務訪問的URL路徑。本例中不做配置,保留根路徑/。
匹配規則:支持前綴匹配(Prefix)、完整匹配(Exact)和默認(ImplementationSpecific)。
服務名稱:選擇目標服務,即K8s內的Service。
端口:選擇服務需要暴露的端口。
Ingress支持同一個域名下配置多條路徑。單擊+ 添加路徑新增路徑。
域名:demo.domain.ingress.top
路徑映射:
路徑:/tea
匹配規則:默認(ImplementationSpecific)
服務名稱:tea-svc
端口:80
路徑映射:
路徑:/coffee
匹配規則:默認(ImplementationSpecific)
服務名稱:coffee-svc
端口:80
TLS配置
開啟TLS配置開關,配置安全的路由服務。
域名:自定義域名。
保密字典:根據需要選擇對應的保密字典。
如果您需要創建Secret,請執行如下操作。
在保密字典右側,單擊創建。
在創建 Secret對話框,自定義保密字典的名稱、Cert、Key,然后單擊確定。
在保密字典的下拉框,選擇已創建的Secret。
單擊+ 新增TLS配置,可配置多條TLS。
更多詳情,請參見配置HTTPS證書以實現加密通信。
關閉TLS配置,此示例中不需要配置TLS。
更多配置
灰度發布:開啟灰度發布開關。灰度規則可按照請求頭、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
。
關閉灰度發布,協議和重寫路徑保持默認。此示例中不需要配置灰度發布、協議、重新路徑。
自定義轉發規則
開啟自定義轉發規則,可精細化管理入站流量。
說明轉發規則的條件條目上限為10個。
在轉發條件下拉框中選擇:
域名:
匹配請求域名,如果設置了多個域名,則域名之間是或的關系。設置后會添加注釋
alb.ingress.kubernetes.io/conditions.host-example
。路徑:
匹配請求路徑,如果設置了多個路徑,則路徑之間是或的關系。設置后會添加注釋
alb.ingress.kubernetes.io/conditions.path-example
。HTTP標頭:
以鍵值對形式匹配請求的頭部信息。例如,鍵是:
headername
值是:headervalue1
。如果設置了多個Header值,則Header之間是或的關系。設置后會添加注釋alb.ingress.kubernetes.io/conditions.http-header-example
。
在轉發動作下拉框中選擇:
轉發至
轉發到后端多服務器組。在服務名稱中,請選擇目標服務。在端口中,選擇目標端口號。然后自定義配置權重值。
說明選擇轉發至,就不需要配置規則中的路徑映射。
返回固定響應
設置通過ALB給客戶端返回固定響應內容,可以設置響應狀態碼,正文內容和正文類型。按需求配置響應狀態碼,響應正文類型(可選)、響應正文(可選)。
響應正文類型:
text/plain:表示無格式的內容類型。
text/css:表示XML格式的內容。
text/html:表示HTML格式的內容。
application/javascript:表示JavaScript格式的內容。
application/json:表示JSON格式內容類型。
自定義轉發規則支持多種轉發條件及轉發動作,您可以配置域名、路徑、HTTP標頭轉發條件,轉發至、返回固定響應的轉發動作。了解更多配置,請參見自定義ALB Ingress的轉發規則。
關閉自定義轉發規則。此示例中不需要配置自定義轉發規則。
注解
您可自定義注解名稱和值,也可根據名稱選擇或搜索要配置的注解。Ingress的注解請參見Annotations。
單擊+添加注解,可對Ingress無上限地添加注解。
無需配置,此示例不需要配置注解。
標簽
標簽的作用是為Ingress添加對應的標簽,標示該Ingress的特點。
單擊+添加標簽,可對Ingress無上限地添加標簽。
無需配置,此示例不需要配置標簽。
配置完成,在創建Ingress頁面的左下角,單擊確定。
檢查Ingress創建成功:
在左側導航欄,選擇網絡 > 路由。可查看到名稱為cafe-ingress的Ingress已部署。
在cafe-ingress的端點列,可查看到端點信息。
通過kubectl創建Ingress
創建并拷貝以下內容到cafe-ingress.yaml文件中,用于創建Ingress。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top http: paths: # 配置Context Path - path: /tea pathType: ImplementationSpecific backend: service: name: tea-svc port: number: 80 # 配置Context Path - path: /coffee pathType: ImplementationSpecific backend: service: name: coffee-svc port: number: 80
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
Ingress的名稱。
說明Ingress的名稱在集群中必須是唯一的。因此,在創建Ingress時,您需要確保Ingress名稱的唯一性,以避免命名沖突。
spec.ingressClassName
是
關聯的IngressClass的名稱。
spec.rules.host
否
HTTP頭部host字段域名信息,需要配置為您的自有域名。
當您在瀏覽器中訪問您的自有域名時,例如“http://demo.domain.ingress.top”,瀏覽器會在發送HTTP請求時自動添加一個“Host: demo.domain.ingress.top”的頭部字段。這樣,服務器就可以根據該頭部字段來識別請求的目標主機名。在Kubernetes中,Ingress規則中的host字段會與來自請求的Host頭部字段進行匹配。當匹配成功時,Ingress規則就會將請求路由到相應的后端服務進行處理。
說明此處如果配置了自有域名,需要確保該自有域名完成備案,否則可能訪問時無法解析。具體操作,請參見ICP備案流程。
此處如果未配置,那么該Ingress規則將匹配所有到達Ingress Controller的請求。
spec.rules.http.paths.path
是
轉發路徑URL。
spec.rules.http.paths.pathType
是
URL匹配規則。詳情可參考基于URL路徑轉發請求。
spec.rules.http.paths.backend.service.name
是
填寫您此前創建的Service名稱。
spec.rules.http.paths.backend.service.port.number
是
填寫您此前創建的Service的服務端口號。
這個端口號的設置非常重要,因為它決定了在路由到后端服務時使用的端口。確保端口號正確設置,以確保請求可以正確路由到后端服務并被處理。
執行以下命令,配置
coffee
和tea
服務對外暴露的域名和path
路徑。kubectl apply -f cafe-ingress.yaml
預期輸出:
ingress.networking.k8s.io/cafe-ingress created
(可選)執行以下命令獲取ALB實例DNS地址。
kubectl get ingress
預期輸出:
NAME CLASS HOSTS ADDRESS PORTS AGE cafe-ingress alb demo.domain.ingress.top alb-m551oo2zn63yov****.cn-hangzhou.alb.aliyuncs.com 80 50s
(可選)步驟五:配置域名解析
如果您在創建Ingress時配置了spec.rules.host
字段為您的自有域名,您需要將您的域名添加CNAME記錄解析到ALB DNS名稱。后續通過你的自有域名訪問服務。
登錄容器計算服務控制臺。
單擊集群名稱,進入集群管理頁面。
在左側導航欄,選擇網絡 > 路由。
在cafe-ingress的端點列,復制其對應的DNS名稱。
完成以下步驟來添加CNAME解析記錄。
登錄域名解析控制臺。
在域名解析頁面單擊添加域名。
在添加域名對話框中輸入您的主機域名,然后單擊確認。
重要您的主機域名需已完成TXT記錄驗證。
在目標域名的操作列單擊解析設置。
在解析設置頁面單擊添加記錄。
在添加記錄面板配置以下信息完成CNAME解析配置,然后單擊確認。
配置
說明
記錄類型
在下拉列表中選擇CNAME。
主機記錄
您的域名的前綴,例如
www
。解析請求來源
選擇默認。
記錄值
輸入域名對應的CNAME地址,即您復制的DNS名稱。
TTL
全稱Time To Live,表示DNS記錄在DNS服務器上的緩存時間,本文使用默認值。
步驟六:測試流量轉發
在瀏覽器中輸入“測試域名+URL路徑”,測試流量轉發是否正確。
如果您配置了自有域名,則“測試域名”為您的自有域名。
如果您未配置自有域名,則“測試域名”為cafe-ingress的端點DNS名稱。
測試域名以demo.domain.ingress.top
為例:
在瀏覽器中輸入
demo.domain.ingress.top/coffee
,將返回coffee-svc對應的后端服務界面。在瀏覽器中輸入
demo.domain.ingress.top/tea
,將返回tea-svc對應的后端服務界面。
相關文檔
如需了解ALB Ingress服務的高級用法,例如如何將來自不同域名或URL路徑的請求轉發給不同的后端服務器組、配置健康檢查、將HTTP訪問重定向至HTTPS、灰度發布、配置自定義監聽端口等,請參見ALB Ingress服務高級用法。
如需自定義ALB Ingress的轉發規則,請自行配置轉發條件和動作,請參見自定義ALB Ingress的轉發規則。
如需讓HTTPS監聽轉發來自HTTPS協議的請求,請參見配置HTTPS證書以實現加密通信。
如果您在使用ALB Ingress過程中遇到問題,可先參見ALB Ingress異常問題排查、ALB Ingress FAQ自助排查問題。