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執行個體,計費詳情請參見ALB計費規則。
名稱
描述
網路類型
根據需要可選擇公網或私網。
專用網路
預設值,與叢集中專用網路相同。
虛擬交換器
展示專用網路下ALB支援的可用性區域交換器。您需指定兩個不同可用性區域的交換器;如果未指定,將自動選擇兩個可用的交換器。您也可以通過單擊建立虛擬交換器來建立新的交換器。
使用已有
您可以從下拉式功能表中選擇已有的ALB執行個體進行複用。不支援使用基礎版ALB執行個體。詳情請參見複用已有ALB執行個體。
暫不建立
暫時不建立ALB執行個體,僅安裝ALB Ingress Controller組件,您需手動建立AlbConfig和建立IngressClass。
為已有叢集安裝
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁面,單擊網路頁簽,在網路組件地區,在ALB Ingress Controller組件卡片的右下角單擊安裝。
在安裝組件 ALB Ingress Controller對話方塊,選擇ALB 雲原生網關執行個體來源選擇建立,使用已有或暫不建立選項。
重要如果選擇建立或使用已有,在安裝ALB Ingress Controller組件時,會自動建立相應的AlbConfig及對應的IngressClass資源。在AlbConfig中,將預設配置一個監聽連接埠為80、協議為HTTP的
Listener
。建立
您可以通過以下配置建立新的ALB執行個體,計費詳情請參見ALB計費規則。
名稱
描述
網路類型
根據需要可選擇公網或私網。
專用網路
預設值,與叢集中專用網路相同。
虛擬交換器
展示專用網路下ALB支援的可用性區域交換器。您需指定兩個不同可用性區域的交換器;如果未指定,將自動選擇兩個可用的交換器。您也可以通過單擊建立虛擬交換器來建立新的交換器。
使用已有
您可以從下拉式功能表中選擇已有的ALB執行個體進行複用。不支援使用基礎版ALB執行個體。詳情請參見複用已有ALB執行個體。
暫不建立
暫時不建立ALB執行個體,僅安裝ALB Ingress Controller組件,您需手動建立AlbConfig和建立IngressClass。
單擊確定。
若需要在ACK專有叢集中通過ALB Ingress訪問服務,在部署服務前需要為ALB Ingress Controller授權。具體操作,請參見為ACK專有叢集授予ALB Ingress Controller存取權限。
步驟二:部署後端服務
控制台
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
單擊右上方使用YAML建立資源。
樣本模板:選擇自訂。
模板:輸入YAML設定檔代碼。該設定檔用於部署兩個名稱分別為
coffee
和tea
的Deployment,以及兩個名稱分別為coffee-svc
和tea-svc
的Service。
配置完成後單擊建立,頁面將提示建立成功。
檢查Deployment和Service建立成功:
在左側導覽列,選擇工作負載 > 無狀態。可查看到名稱為coffee和tea的Deployment已部署。
在左側導覽列,選擇網路 > 服務。可查看到名稱為coffee-svc和tea-svc的Service已部署。
kubectl
建立並拷貝以下內容到cafe-service.yaml檔案中,用於部署兩個名稱分別為
coffee
和tea
的Deployment,以及兩個名稱分別為coffee-svc
和tea-svc
的Service。執行以下命令,部署兩個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的資源,您可以忽略此步驟。
控制台
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
單擊右上方使用YAML建立資源。
樣本模板:選擇自訂。
模板:輸入YAML設定檔代碼。
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
AlbConfig的名稱。
說明AlbConfig的名稱在叢集中必須是唯一的。因此,在建立AlbConfig時,您需要確保AlbConfig名稱的唯一性,以避免命名衝突。
spec.config.name
否
ALB執行個體的名稱。
spec.config.addressType
否
ALB執行個體的網路類型。取值如下:
Internet(預設值):公網類型。面向公網提供應用型負載平衡服務,公網可訪問。
說明應用型負載平衡通過綁定Elastic IP Address進行公網服務,使用公網類型ALB執行個體將收取Elastic IP Address的執行個體費與頻寬、流量費用,詳情參見隨用隨付。
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。
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
AlbConfig的名稱。
說明AlbConfig的名稱在叢集中必須是唯一的。因此,在建立AlbConfig時,您需要確保AlbConfig名稱的唯一性,以避免命名衝突。
spec.config.name
否
ALB執行個體的名稱。
spec.config.addressType
否
ALB執行個體的網路類型。取值如下:
Internet(預設值):公網類型。面向公網提供應用型負載平衡服務,公網可訪問。
說明應用型負載平衡通過綁定Elastic IP Address進行公網服務,使用公網類型ALB執行個體將收取Elastic IP Address的執行個體費與頻寬、流量費用,詳情參見隨用隨付。
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的資源,您可以忽略此步驟。
控制台
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
單擊右上方使用YAML建立資源。
樣本模板:選擇自訂。
模板:輸入YAML設定檔代碼。
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
IngressClass的名稱。
說明IngressClass的名稱在叢集中必須是唯一的。因此,在建立IngressClass時,您需要確保IngressClass名稱的唯一性,以避免命名衝突。
spec.parameters.name
是
關聯的AlbConfig的名稱。
配置完成後單擊建立,頁面將提示建立成功。
檢查IngressClass建立成功:
在左側導覽列,選擇工作負載 > 自訂資源。
選擇資來源物件瀏覽器頁簽。
在API組搜尋欄中,輸入IngressClass進行搜尋,可查看到對應的IngressClass已建立。
kubectl
建立並拷貝以下內容到alb.yaml檔案中,用於建立IngressClass。
可調整參數說明如下:
參數
是否必填
說明
metadata.name
是
IngressClass的名稱。
說明IngressClass的名稱在叢集中必須是唯一的。因此,在建立IngressClass時,您需要確保IngressClass名稱的唯一性,以避免命名衝突。
spec.parameters.name
是
關聯的AlbConfig的名稱。
執行以下命令,建立IngressClass。
kubectl apply -f alb.yaml
預期輸出:
ingressclass.networking.k8s.io/alb created
步驟五:建立Ingress
控制台
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
單擊右上方使用YAML建立資源。
樣本模板:選擇自訂。
模板:輸入YAML設定檔代碼。
可調整參數說明如下:
參數
是否必填
說明
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。
可調整參數說明如下:
參數
是否必填
說明
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解析記錄。
說明對於非阿里雲註冊網域名稱,需先將網域名稱添加到雲解析控制台,才可以進行網域名稱解析設定。具體操作,請參見網域名稱管理。如果您是阿里雲註冊的網域名稱,請直接執行以下步驟。
登入網域名稱解析控制台。
在權威網域名稱解析頁面,找到目標網域名稱,在操作列單擊解析設定。
在解析設定頁面,單擊添加記錄。
在添加記錄面板,配置以下資訊完成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自助排查問題。