ALB Ingress基于阿里云應用型負載均衡ALB(Application Load Balancer)之上提供更為強大的Ingress流量管理方式,兼容Nginx Ingress,具備處理復雜業務路由和證書自動發現的能力,支持HTTP、HTTPS和QUIC協議,滿足在云原生應用場景下對超強彈性和大規模七層流量處理能力的需求。當您希望在ACK集群中配置ALB Ingress實現Ingress流量管理,您可以參考本文部署服務并通過ALB Ingress訪問服務。
背景信息
ALB Ingress涉及到的概念介紹如下:
ALB Ingress Controller:Ingress Controller是Kubernetes中負責管理Ingress資源的組件。它充當集群內的入口點,將外部流量路由到適當的服務。ALB Ingress Controller通過API Server獲取Ingress資源的變化,動態地生成AlbConfig,然后依次創建ALB實例、監聽、路由轉發規則以及后端服務器組。
AlbConfig CRD:CRD (Custom Resource Definition) 是 Kubernetes 中的一種機制,用于擴展 Kubernetes API,并允許用戶自定義資源類型。一個AlbConfig對應一個ALB實例。
Ingress Class:Ingress Class是Kubernetes Ingress資源的一個屬性,用于定義Ingress Controller的類別或標識。它允許在集群中同時使用多個Ingress Controller,并為每個Ingress資源指定使用的特定Controller。
Ingress:Ingress是Kubernetes中用于定義外部流量路由規則和訪問規則的資源對象,通過Ingress Controller來實現流量轉發功能。ALB Ingress可以通過注解項配置轉發規則,配置完成后,HTTP/HTTPS請求可以通過注解項配置的轉發規則轉發到對應的Service上。
Service:在Kubernetes中,Service是一種抽象的資源對象,用于定義一組具有相同邏輯功能的Pod實例,并為它們提供穩定的虛擬IP地址和端口。
Service為應用程序提供了一個穩定的入口,允許其他應用程序或服務通過訪問Service的虛擬IP和端口來與后端Pod進行通信,而無需了解具體的Pod IP地址和端口。Service是后端真實服務的抽象,一個Service可以代表多個相同的后端服務。
您可參照下圖,理解ALB網絡實例與ALB Ingress之間的邏輯關系。
使用限制
如果您使用的是Flannel網絡插件,則ALB Ingress后端Service服務僅支持NodePort和LoadBalancer類型。
AlbConfig、Namespace、Ingress和Service這些資源的名稱不能以aliyun開頭。
低版本Nginx Ingress Controller無法識別Ingress資源中的
spec:ingressClassName
字段。如果集群中同時存在Nginx Ingress和ALB Ingress,會存在ALB Ingress被低版本Nginx Ingress Controller調諧的風險。因此,請及時升級Nginx Ingress Controller版本,或通過Annotation注解項指定ALB Ingress對應的ingressClass。具體操作,請參見升級Nginx Ingress Controller組件或ALB Ingress服務高級用法。
場景示例
本教程以四個部署了Nginx的Pod為例,演示如何通過配置ALB Ingress,實現相同域名不同URL路徑的流量轉發。
前端請求 | 流量轉發至 |
|
|
|
|
前提條件
步驟一:安裝ALB Ingress Controller組件
使用ALB Ingress前,請安裝ALB Ingress Controller組件。
創建集群時安裝
創建ACK托管集群或ACK專有集群時,在Ingress參數配置區域,選擇安裝ALB Ingress。
您可以為ALB云原生網關實例來源選擇新建,使用已有或暫不創建選項。這三種選項的對比如下:
如果選擇新建或使用已有,則會在安裝ALB Ingress Controller組件后自動創建AlbConfig以及與之匹配的IngressClass資源,在AlbConfig中會自動配置端口為80,協議為HTTP的listener
。
對比項 | 新建 | 使用已有 | 暫不創建 |
適用場景 | 在集群中第一次使用ALB Ingress,集群中不存在AlbConfig的場景。 | 希望使用已有ALB實例的場景。 | 希望在安裝組件后配置AlbConfig的場景。 |
工作原理 | 新建AlbConfig后,會使用其中的配置自動創建一個ALB實例。 | 會自動創建一個AlbConfig,其中的 | 只安裝ALB Ingress Controller,而不創建AlbConfig。 |
后續操作 | 在網絡類型中選擇ALB實例的網絡類型,然后在虛擬交換機中選擇ALB實例關聯的虛擬交換機。 重要 為保障業務高可用,推薦您選擇2個或以上不同可用區的交換機。 | 在ALB云原生網關實例中選擇希望使用的ALB實例。如果您需要使用AlbConfig關聯該ALB實例,請參見復用已有ALB實例。 重要 不支持使用基礎版ALB實例。 | 使用已有AlbConfig,或后續完成AlbConfig的配置。 |
在已有集群中安裝
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在組件管理頁面,單擊網絡頁簽,在網絡組件區域,在ALB Ingress Controller組件卡片的右下角單擊安裝。
在安裝組件 ALB Ingress Controller對話框,為選擇ALB 云原生網關實例來源選擇新建,使用已有或暫不創建選項。這三種選項的對比如下:
重要如果選擇新建或使用已有,則會在安裝ALB Ingress Controller組件后自動創建AlbConfig以及與之匹配的IngressClass資源,在AlbConfig中會自動配置端口為80,協議為HTTP的
listener
。對比項
新建
使用已有
暫不創建
適用場景
在集群中第一次使用ALB Ingress,集群中不存在AlbConfig的場景。
希望使用已有ALB實例的場景。
希望在安裝組件后配置AlbConfig的場景。
工作原理
新建AlbConfig后,會使用其中的配置自動創建一個ALB實例。
會自動創建一個AlbConfig,其中的
id
字段會填入被選擇的ALB實例的ID。只安裝ALB Ingress Controller,而不創建AlbConfig。
后續操作
在網絡類型中選擇ALB實例的網絡類型,然后在虛擬交換機中選擇ALB實例關聯的虛擬交換機。
重要為保障業務高可用,推薦您選擇2個或以上不同可用區的交換機。
在ALB云原生網關實例中選擇希望使用的ALB實例。如果您需要使用AlbConfig關聯該ALB實例,請參見復用已有ALB實例。
重要不支持使用基礎版ALB實例。
使用已有AlbConfig,或后續完成AlbConfig的配置。
單擊確定。
若需要在ACK專有集群中通過ALB Ingress訪問服務,在部署服務前需要為ALB Ingress Controller授權。具體操作,請參見為ACK專有集群授予ALB Ingress Controller訪問權限。
步驟二:部署后端服務
控制臺
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
單擊右上角使用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: NodePort --- 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: NodePort
配置完成后單擊創建,頁面將提示創建成功。
檢查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: NodePort --- 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: NodePort
執行以下命令,部署兩個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 1/2 2 1 2m26s tea 1/1 1 1 2m26s
執行以下命令,查看服務的狀態。
kubectl get svc
預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE coffee-svc NodePort 172.16.XX.XX <none> 80:32056/TCP 9m38s tea-svc NodePort 172.16.XX.XX <none> 80:31696/TCP 9m38s
步驟三:創建AlbConfig
如果在步驟一:安裝ALB Ingress Controller組件中,您為ALB云原生網關實例來源選擇新建或使用已有選項,controller會自動創建一個名為“alb”的AlbConfig和名為“alb”的IngressClass的資源,您可以忽略此步驟。
控制臺
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
單擊右上角使用YAML創建資源。
示例模板:選擇自定義。
模板:輸入YAML配置文件代碼。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15**** 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
拷貝以下內容到alb-test.yaml文件中,用于創建AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15**** 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
步驟四:創建IngressClass
IngressClass建議與AlbConfig一一對應。
如果在步驟一:安裝ALB Ingress Controller組件中,您為ALB云原生網關實例來源選擇新建或使用已有選項,controller會自動創建一個名為“alb”的AlbConfig和名為“alb”的IngressClass的資源,您可以忽略此步驟。
控制臺
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
單擊右上角使用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
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
IngressClass的名稱。
說明IngressClass的名稱在集群中必須是唯一的。因此,在創建IngressClass時,您需要確保IngressClass名稱的唯一性,以避免命名沖突。
spec.parameters.name
是
關聯的AlbConfig的名稱。
配置完成后單擊創建,頁面將提示創建成功。
檢查IngressClass創建成功:
在左側導航欄,選擇工作負載 > 自定義資源。
選擇資源對象瀏覽器頁簽。
在API組搜索欄中,輸入IngressClass進行搜索,可查看到對應的IngressClass已創建。
kubectl
創建并拷貝以下內容到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
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
IngressClass的名稱。
說明IngressClass的名稱在集群中必須是唯一的。因此,在創建IngressClass時,您需要確保IngressClass名稱的唯一性,以避免命名沖突。
spec.parameters.name
是
關聯的AlbConfig的名稱。
執行以下命令,創建IngressClass。
kubectl apply -f alb.yaml
預期輸出:
ingressclass.networking.k8s.io/alb created
步驟五:創建Ingress
控制臺
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
單擊右上角使用YAML創建資源。
示例模板:選擇自定義。
模板:輸入YAML配置文件代碼。
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的服務端口號。
這個端口號的設置非常重要,因為它決定了在路由到后端服務時使用的端口。確保端口號正確設置,以確保請求可以正確路由到后端服務并被處理。
配置完成后單擊創建,頁面將提示創建成功。
檢查Ingress創建成功:
在左側導航欄,選擇網絡 > 路由。可查看到名稱為cafe-ingress的Ingress已部署。
在cafe-ingress的端點列,可查看到端點信息。
kubectl
創建并拷貝以下內容到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名稱。后續通過您的自有域名訪問服務。
登錄容器服務ACK控制臺。
單擊集群名稱,進入集群管理頁面。
在左側導航欄,選擇網絡 > 路由。
在cafe-ingress的端點列,復制其對應的DNS名稱。
完成以下步驟來添加CNAME解析記錄。
說明對于非阿里云注冊域名,需先將域名添加到云解析控制臺,才可以進行域名解析設置。具體操作,請參見域名管理。如果您是阿里云注冊的域名,請直接執行以下步驟。
登錄域名解析控制臺。
在權威域名解析頁面,找到目標域名,在操作列單擊解析設置。
在解析設置頁面,單擊添加記錄。
在添加記錄面板,配置以下信息完成CNAME解析配置,然后單擊確定。
配置
說明
記錄類型
在下拉列表中選擇CNAME。
主機記錄
您的域名的前綴。本文輸入@。
說明創建域名為根域名時,主機記錄為
@
。解析請求來源
選擇默認。
記錄值
輸入域名對應的CNAME地址,即您復制的ALB實例的DNS名稱。
TTL
全稱Time To Live,表示DNS記錄在DNS服務器上的緩存時間,本文使用默認值。
步驟七:測試流量轉發
在瀏覽器中輸入“測試域名+URL路徑”,測試流量轉發是否正確。
測試域名以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自助排查問題。