ACK叢集中的服務預設與外部網路隔離。ALB Ingress通過使用具備網域名稱路由、安全防護和高可用能力的應用型負載平衡 ALB作為外部流量入口,以滿足將叢集內部服務暴露給使用者訪問的需求。
工作原理
|
Service類型限制
當使用flannel網路外掛程式時,ALB Ingress後端Service僅支援NodePort和LoadBalancer類型。
安裝ALB Ingress Controller組件
建立叢集時安裝
登入Container Service管理主控台,單擊建立叢集。
在組件配置階段的Ingress配置地區,選擇安裝ALB Ingress。
以建立ALB執行個體為例,然後按照頁面提示建立叢集。
ALB 應用型Server Load Balancer執行個體
說明
建立
自動建立ALB執行個體、AlbConfig和IngressClass。
ALB執行個體:在叢集VPC內自動建立一個標準版、隨用隨付的公網/私網ALB執行個體,並配置
HTTP:80監聽。AlbConfig和IngressClass:在叢集中自動建立與ALB執行個體關聯的AlbConfig和IngressClass資來源物件。
使用已有
僅當叢集網路設定為使用已有專用網路時可選
使用一個已有的ALB執行個體,並自動建立AlbConfig和IngressClass。該ALB執行個體的功能版本需為標準版或WAF增強版,網路類型需為與叢集同VPC的公網/私網類型,且未被其他叢集關聯。
暫不建立
僅安裝ALB Ingress Controller組件,後續需手動建立AlbConfig和IngressClass,適用於需要自訂ALB執行個體配置的情境。
為已有叢集安裝
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
通過搜尋欄或者網路頁簽找到組件,在ALB Ingress Controller組件卡片的右下角,單擊安裝。
以建立ALB執行個體為例,然後單擊確認。
ALB 應用型Server Load Balancer執行個體
說明
建立
自動建立ALB執行個體、AlbConfig和IngressClass。
ALB執行個體:在叢集VPC內自動建立一個標準版、隨用隨付的公網/私網ALB執行個體,並配置
HTTP:80監聽。AlbConfig和IngressClass:在叢集中自動建立與ALB執行個體關聯的AlbConfig和IngressClass資來源物件。
使用已有
使用一個已有的ALB執行個體,並自動建立AlbConfig和IngressClass。該ALB執行個體的功能版本需為標準版或WAF增強版,網路類型需為與叢集同VPC的公網/私網類型,且未被其他叢集關聯。
暫不建立
僅安裝ALB Ingress Controller組件,後續需手動建立AlbConfig和IngressClass,適用於需要自訂ALB執行個體配置的情境。
建立樣本應用
樣本應用將部署一個名稱為coffee的無狀態工作負載(Deployment)以及對應的coffee-svc服務(Service)。
控制台
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
單擊使用YAML建立資源,樣本模板選擇自訂。然後將以下內容複寫到模板地區,單擊建立。
在彈窗提示中單擊查看,確認Pod狀態為
Running。
kubectl
使用以下內容建立
coffee-deployment-service.yaml檔案。建立樣本應用的Deployment和Service。
kubectl apply -f coffee-deployment-service.yaml確認Pod狀態為
Running。kubectl get pod -l app=coffee預期輸出:
NAME READY STATUS RESTARTS AGE coffee-84bd6*****-***** 1/1 Running 0 4m22s coffee-84bd6*****-***** 1/1 Running 0 4m22s
建立ALB Ingress
通過配置ALB Ingress的網域名稱和路徑映射,實現訪問ingress-demo.com/coffee網域名稱即可路由至叢集內部coffee-svc服務的功能。
在ACK專有叢集中使用ALB Ingress,需要授予ALB Ingress Controller存取權限。
控制台
在左側導覽列,選擇。選擇
default命名空間,單擊建立 Ingress。添加以下Ingress配置,單擊確定。
名稱:
coffee-ingress網域名稱:
ingress-demo.com路徑映射:路徑:
/coffee,匹配規則:首碼匹配(Prefix),服務名稱:coffee-svc,連接埠:80。匹配規則(pathType)
說明
首碼匹配(Prefix)
匹配請求URL路徑的首碼部分。例如,可匹配
/coffee/1或/coffee/buy/1路徑,但不能匹配/cof或/coffeebuy/1。完整匹配(Exact)
完全符合請求URL路徑。僅
/coffee路徑可匹配。預設(ImplementationSpecific)
由Ingress Controller實現的具體邏輯決定。在ALB Ingress Controller中為完整匹配(Exact)。
擷取端點地址。
ALB Ingress生效過程耗時約10秒,可稍後單擊重新整理按鈕擷取端點資訊。若長時間未更新端點資訊,可單擊路由名稱,進入事件頁簽,進行異常問題排查。

測試訪問網域名稱和端點地址,若HTTP狀態代碼為
200即表示ALB Ingress已建立成功。curl -H "Host:ingress-demo.com" http://<端點地址>/coffee -s -o /dev/null -w "%{http_code}\n"
kubectl
建立ALB Ingress。將以下YAML內容儲存為
coffee-ingress.yaml檔案,然後執行kubectl apply -f coffee-ingress.yaml命令。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: coffee-ingress namespace: default spec: ingressClassName: alb rules: - host: ingress-demo.com http: paths: - path: /coffee backend: service: name: coffee-svc port: number: 80 pathType: Prefix匹配規則(pathType)
說明
首碼匹配(Prefix)
匹配請求URL路徑的首碼部分。例如,可匹配
/coffee/1或/coffee/buy/1路徑,但不能匹配/cof或/coffeebuy/1。完整匹配(Exact)
完全符合請求URL路徑。僅
/coffee路徑可匹配。預設(ImplementationSpecific)
由Ingress Controller實現的具體邏輯決定。在ALB Ingress Controller中為完整匹配(Exact)。
查看Ingress並擷取
ADDRESS欄位中的端點地址。kubectl get ingress coffee-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'預期輸出:
alb-******************.cn-wulanchabu.alb.aliyuncsslb.com測試訪問網域名稱和端點地址,若HTTP狀態代碼為
200即表示ALB Ingress已建立成功。curl -H "Host:ingress-demo.com" http://<端點地址>/coffee -s -o /dev/null -w "%{http_code}\n"
計費說明
ALB Ingress Controller組件:該組件為ACK託管組件,不涉及使用者側的資源使用和計費。
ALB執行個體:每個AlbConfig資來源物件會建立一個對應的ALB執行個體,ALB執行個體的計費規則為隨用隨付。
應用於生產環境
佈建網域名解析:將業務網域名稱通過CNAME記錄解析至ALB執行個體提供的公網訪問地址,以解耦網域名稱與ALB執行個體訪問地址,確保服務入口的高可用與靈活配置。
配置HTTPS安全加密:在數位憑證管理服務中統一管理憑證,並在Ingress資源的
tls欄位中聲明式地引用該認證,從而實現服務流量的HTTPS安全加密。
配額與限制
AlbConfig、Ingress、Service和Namespace的資源名稱不能以
aliyun開頭。ALB Ingress的配額限制,請參見ALB配額計算方式。
ALB Ingress支援的地區與可用性區域,請參見ALB支援的地區與可用性區域。
常見問題
為什麼訪問Ingress網域名稱返回了503、502、404等HTTP錯誤碼?
問題原因
503(Service Temporarily Unavailable)錯誤
路由規則未匹配:請求路徑與Ingress實際配置的路由規則不符。
後端無存活Pod:Service關聯的Pod全部未就緒或不存在,導致Endpoints對象為空白。
502(Bad Gateway)錯誤
HTTP或HTTPS監聽接收到用戶端串連請求後,ALB由於無法正常將請求轉寄至Pod或無法從Pod收到響應,則會向用戶端發送HTTP 502 Bad Gateway狀態代碼。
404(Not Found)錯誤
通常原因為已匹配Ingress中定義的路由規則,但與Pod中應用實際提供服務的URL不匹配。
更多HTTP錯誤碼說明,請參見ALB狀態代碼說明。
解決方案
檢查Ingress狀態:執行
kubectl describe ingress <ingress-name> -n <namespace>命令,查看Events部分是否有錯誤資訊。如出現類似listener is not exist in alb的事件,請在AlbConfig中建立Ingress資源所需的監聽。... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedBuildModel **** ingress listener is not exist in alb, port: 443, protocol: HTTPS Warning FailedBuildModel **** ingress listener not found for (443/HTTPS), with ingresses 1 ...檢查後端Endpoints:執行
kubectl get endpoints <service-name> -n <namespace>命令,確認ENDPOINTS欄位下有至少一個健康的Pod IP和連接埠。若為空白,則排查Service的selector是否與Pod的labels匹配,以及Pod是否處於Running狀態。檢查Pod狀態與日誌:先執行
kubectl get pod -l <app=your-app> -n <namespace>命令,查看Pod運行狀態。擷取Pod名稱之後執行kubectl logs <pod-name> -n <namespace>命令,查看應用日誌是否有啟動失敗或處理請求的錯誤資訊。網路連通性測試:在Pod內或節點上嘗試
curl後端Service的ClusterIP或Pod IP,驗證叢集內部服務是否可達。
配置Ingress TLS後,為什麼HTTPS還是無法訪問?
問題原因
ALB執行個體未監聽443連接埠:只配置了Ingress的TLS安全加密,但沒有建立對應的
HTTPS:443監聽。認證配置錯誤:Secret類型不是
kubernetes.io/tls或IngressTLS,或者data中的tls.crt和tls.key內容不正確或不匹配。認證更新不生效:在阿里雲認證中心更新了認證,但未更新AlbConfig中指定的認證ID,或未觸發自動探索認證調諧,導致ALB執行個體仍引用舊認證。
解決方案
檢查監聽連接埠:執行
kubectl describe albconfig <alb-name> -n <namespace>命令,檢查是否缺少spec.listeners.port: 443和spec.listeners.protocol: HTTPS配置。檢查Ingress配置:檢查Ingress的配置中是否缺少註解
alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}],該註解將Ingress關聯到HTTP和HTTPS監聽上。檢查Secret配置:檢查Ingress的配置中
spec.tls的secretName欄位,確認引用了正確的Secret。執行kubectl get secret <secret-name> -n <namespace> -o yaml命令,確認Secret類型和資料完整性。
如何為Ingress佈建網域名解析?
以添加一個記錄類型為
CNAME、主機記錄為@(表示直接解析主網域名稱,如ingress-demo.com)、記錄值為Ingress端點地址的解析記錄為例。在瀏覽器中訪問http://ingress-demo.com/coffee,驗證網域名稱解析生效。

請替換為實際註冊網域名稱進行驗證。如發現解析不生效,請參考解析不生效問題快速排查。
如何為Ingress配置HTTPS安全加密?
以下載
ingress-demo.com網域名稱、伺服器類型為其他的PEM格式認證檔案為例。建立Secret儲存認證檔案。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在保密字典頁面,選擇
default命名空間,單擊左側建立。添加以下配置,單擊確定。名稱:
ingress-tls類型:TLS認證
認證:已下載並解壓的認證檔案(.pem)中的完整內容
密鑰:已下載並解壓的認證私密金鑰檔案(.key)中的完整內容

更新AlbConfig,為ALB執行個體新增
HTTPS:443監聽。在左側導覽列,選擇。在資來源物件瀏覽器頁簽中,搜尋AlbConfig,然後單擊搜尋結果。
在AlbConfig資來源物件列表中,找到目標資源
alb,單擊其右側操作列下的YAML編輯。新增
spec.listeners.port: 443和spec.listeners.protocol: HTTPS欄位,然後單擊確定。
更新Ingress,添加TLS配置並關聯
HTTPS:443監聽。在左側導覽列,選擇。在目標路由右側操作欄中,單擊更新。
添加以下配置,單擊確定。
TLS配置:開啟
網域名稱:
ingress-demo.com保密字典:
ingress-tls註解:
alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]
在瀏覽器中訪問
https://ingress-demo.com/coffee,驗證HTTPS加密訪問。
請替換為實際註冊網域名稱進行驗證。
更多HTTPS認證的配置方式,請參見配置HTTPS認證以實現加密通訊。
如何手動建立AlbConfig和IngressClass?
建立AlbConfig
登入專用網路管理主控台,記錄集群所在VPC中至少兩個處於不同可用性區域的虛擬交換器ID。
配置的虛擬交換器所屬可用性區域需滿足ALB支援的地區與可用性區域。
將下方代碼中
zoneMappings.vSwitchId替換為上一步中得到的交換器ID。建立並儲存名為albconfig.yaml的檔案,執行kubectl apply -f albconfig.yaml建立AlbConfig。更詳細的操作步驟,請參見建立AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb # 請勿建立同名的AlbConfig資源 spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-****cg2a9g71hx8go**** # 替換為實際虛擬交換器ID - vSwitchId: vsw-****un9tql5t8nh15**** # 替換為實際虛擬交換器ID listeners: - port: 80 protocol: HTTP
建立IngressClass
IngressClass關聯了AlbConfig和Ingress資源,在Ingress中填入ingressclassName: alb即可通過名為alb的IngressClass使用AlbConfig。
建立並儲存名為IngressClass.yaml的檔案,然後執行kubectl apply -f IngressClass.yaml建立IngressClass。
spec.parameters.name中需填入AlbConfig的名稱。安裝組件時預設建立的AlbConfig名稱為alb。更詳細的操作說明,請參見使用IngressClass關聯AlbConfig與Ingress。
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.alibabacloud/alb
parameters:
apiGroup: alibabacloud.com
kind: AlbConfig
name: alb # 與AlbConfig的名稱對應