本文匯總了使用ALB Ingress時遇到的常見問題。
功能諮詢
ALB Ingress和Nginx Ingress有什麼區別?
推薦您使用ALB Ingress,相較於Nginx Ingress需要您自己營運,ALB Ingress基於阿里雲應用型負載平衡ALB(Application Load Balancer),屬於全託管免營運的雲端服務,提供了更為強大的Ingress流量管理方式和高效能的網關服務。關於Nginx Ingress與ALB Ingress的對比詳情,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比。
ALB Ingress是否支援同時使用公網和私網?
問題現象
在實際業務情境中,既需要通過公網訪問 ALB Ingress,也希望通過私網進行訪問,但不清楚 ALB Ingress 是否支援同時滿足公網和私網訪問需求?
解決方案
支援。如果您想同時使用公網和私網訪問ALB Ingress,您需要建立公網ALB執行個體,該執行個體會在每個可用性區域建立一個公網EIP,ALB執行個體可以通過EIP與公網通訊。同時,該執行個體還會提供一個私網VIP,您可以通過私網VIP訪問ALB執行個體,實現從私網訪問的效果。如果您只想私網訪問ALB Ingress,建議您建立一個私網ALB執行個體。
如何保證ALB Ingress使用固定的ALB網域名稱?
通過ALBConfig建立ALB執行個體之後,ALB Ingress會通過IngressClass引用ALBConfig,從而使用對應的ALB執行個體網域名稱。如果ALB Ingress關聯的IngressClass以及ALBConfig不作變更,則網域名稱保持不變。
為什麼在叢集中看不到ALB Ingress Controller Pod?
問題現象
在叢集中尋找 ALB Ingress Controller Pod 時,發現 kube-system 命名空間下沒有相關的 Pod,無法通過常規方法查看ALB Ingress Controller 組件。
解決方案
僅ACK專有版才能在kube-system命名空間下看到ALB Ingress Controller Pod。ACK基礎版、ACK Pro版和ACK Serverless託管了ALB Ingress Controller組件,因此無法在叢集中看到ALB Ingress Controller Pod。關於ACK專有版升級到ACK Pro版的具體操作,請參見熱遷移ACK專有叢集至ACK託管叢集Pro版。
如何支援掛載IP類型伺服器?
問題現象
需要將後端 Pod 以 IP類型的方式掛載到 ALB,但在預設配置下,Service 無法自動建立 IP類型的伺服器組,導致後端服務的流量分發受限。
解決方案
可以通過在 Service 的 annotations 中添加 alb.ingress.kubernetes.io/server-group-type: Ip 註解,實現為該 Service 建立 IP類型的伺服器組,從而支援以 IP 方式將後端 Pod 註冊到 ALB。
伺服器群組類型一經建立無法更改。在 Flannel 網路模式下,若修改 Service 類型(如 ClusterIP 與 NodePort 之間切換),會導致後端掛載節點類型在 IP 和 ECS 之間切換,從而無法加入原有伺服器組。因此,不支援直接修改 Service 類型。
如需調整伺服器群組類型,建議建立一個 Service,並在 annotations 中指定
server-group-type: Ip,避免影響存量伺服器組掛載節點。設定
server-group-type註解後,切勿隨意刪除該註解,否則會導致 Service 對應的伺服器群組類型不一致,出現調諧失敗,進而導致後端節點無法正常加入伺服器組。
apiVersion: v1
kind: Service
metadata:
annotations:
alb.ingress.kubernetes.io/server-group-type: Ip
name: tea-svc
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: tea
type: ClusterIPALB後端預設監聽轉寄到kube-system-fake-svc-80伺服器組,該伺服器組的作用是什麼?
建立監聽必須有一個預設轉寄規則,並且轉寄規則目前只支援轉寄到某個伺服器組。所以,當前需要通過建立kube-system-fake-svc-80伺服器組實現監聽功能。該伺服器組不參與業務處理,但不能被刪除。
如何為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認證以實現加密通訊。
使用異常
為什麼訪問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類型和資料完整性。
為什麼ALB Ingress規則不生效?
問題現象
建立 ALB Ingress 規則後,發現路由規則沒有按預期生效,無法正常轉寄到對應的後端服務。
問題原因
ALB執行個體是按照串列的方式維護路由規則。也就是說,如果多個ALB Ingress使用的是同一個ALB執行個體,那麼一個ALB Ingress配置有問題,其他的ALB Ingress變更都不會生效。
解決方案
如果您建立的ALB Ingress沒有生效,那麼有可能是之前建立的ALB Ingress發生了錯誤。您需要將錯誤的ALB Ingress修正為正確後,新建立的ALB Ingress才會生效。
ALB Ingress無例外狀況事件,但是變更不生效怎麼辦?
問題現象
ALB Ingress 在配置變更或關聯 AlbConfig 後,未見例外狀況事件上報,但相關變更並未生效。
解決方案
當出現未執行AlbConfig相關的調和事件,或者變更事件沒有成功處理時,原因可能是IngressClass和AlbConfig的綁定關係錯誤。請按照使用文檔檢查IngressClass中指定的parameters參數是否正確。詳細操作,請參見使用IngressClass關聯AlbConfig與Ingress。
ALB Ingress轉寄規則建立後被立即刪除,出現503狀態代碼怎麼辦?
問題現象
ALB Ingress 轉寄規則建立後被立即刪除,導致服務訪問返回 503 狀態代碼,無法正常進行流量分發。
解決方案
檢查轉寄規則對應Ingress是否都配置了canary:true註解項。由於Canary灰階強制需要主幹版本才能引流,所以對於主幹版本的Ingress,不需要添加canary:true註解。關於如何使用ALB Ingress實現服務的灰階發布,請參見通過ALB Ingress實現灰階發布。
Canary灰階方式僅支援兩個Ingress且條件有限,推薦您使用自訂轉寄規則,使用更豐富的引流方案 。具體操作,請參見自訂ALB Ingress的轉寄規則。
AlbConfig資源報錯listener is not exist in alb, port: xxx?
問題現象
當訪問除 80 連接埠外的其他連接埠時,發現請求均無法正常串連。同時,AlbConfig 資源報出 “listener is not exist in alb, port: xxx” 錯誤,導致相關連接埠未能被監聽和轉寄流量。
解決方案
預設建立的 AlbConfig 僅包含連接埠 80 的監聽器。如果需要監聽其它連接埠,需要在 AlbConfig 中新增對應連接埠的監聽配置。具體操作請參見建立監聽。
在AlbConfig配置HTTP和HTTPS監聽後,無法正常訪問HTTP和HTTPS監聽連接埠?
問題現象
已在 AlbConfig 中配置了 HTTP 和 HTTPS 監聽連接埠,但實際訪問時,HTTP 和 HTTPS 連接埠均無法正常被監聽或轉寄,導致服務無法通過這兩個連接埠對外提供訪問。
解決方案
確認是否在 Ingress 資源的 annotations 中添加 alb.ingress.kubernetes.io/listen-ports 註解,指定 ALB Ingress 同時監聽 HTTP(80)和 HTTPS(443)連接埠。例如:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: https-ingress
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 使用多個監聽時需要添加annotation使ALB Ingress正常工作。
spec:
#...為什麼在ALB控制台手動變更的配置會丟失,並且添加的規則會被刪除,訪問日誌會被關閉?
問題現象
通過 ALB 控制台手動修改配置後,發現這些配置會丟失或被自動刪除,訪問日誌功能也會被關閉。
解決方案
ALB Ingress需要通過修改叢集內資源來實現配置變更,相應的配置會以ALB Ingress或ALBConfig的形式儲存在叢集的APIServer中。在ALB控制台手動修改配置的行為並沒有修改APIServer中的資源,所以修改的配置並不會生效。如果觸發叢集內調和操作,就會使用Ingress或ALBConfig中的配置對控制台配置進行變更,導致出現手動修改的配置被覆蓋的現象。建議您通過修改ALB Ingress或AlbConfig來修改對應配置。
為什麼會在調諧過程中出現錯誤提示:Specified parameter array contains too many items, up to 15 items, Certificates is not valid?
問題現象
在調諧過程中出現以下錯誤提示:“Specified parameter array contains too many items, up to 15 items, Certificates is not valid”,導致 ALB Ingress 無法正常關聯所需認證。
解決方案
從ALB Ingress Controller組件的v2.11.0-aliyun.1版本開始,新增了對認證分頁的支援。如果在調諧過程中出現錯誤提示:Specified parameter array contains too many items, up to 15 items, Certificates is not valid,這表明您當前使用的ALB Ingress Controller組件版本尚未支援認證分頁功能,並且您的使用情境中單次調諧嘗試關聯的認證數量超過了15張的限制。為解決此問題,建議您將ALB Ingress Controller組件升級至最新版本。關於組件的版本資訊,請參見ALB Ingress Controller。關於如何升級組件,請參見管理ALB Ingress Controller組件。
在控制台上配置完建立的ALB執行個體後,使用kubectl apply命令更新AlbConfig的ACL(存取控制清單)配置,為什麼會導致部分監聽被刪除?
問題現象
在控制台上建立並配置 ALB 執行個體後,通過 kubectl apply 命令更新 AlbConfig 的 ACL(存取控制清單)配置,結果發現部分監聽被意外刪除,導致相關連接埠或規則失效。
解決方案
優先推薦使用kubectl edit命令直接更新資源的配置。如果必須使用kubectl apply命令來更新資源,請在執行kubectl apply命令之前先執行kubectl diff命令預覽變更點,確保變更符合預期,然後再使用kubectl apply命令將變更應用到Kubernetes叢集。
kubectl apply命令的語義會對ALBConfig進行覆蓋式更新。因此,在使用kubectl apply命令更新ALBConfig的ACL配置時,請確保YAML檔案中包含了完整的監聽配置,以免未包含的監聽被刪除。
若執行kubectl apply命令後發現有監聽被刪除,推薦您按照以下方式進行恢複。
查看YAML檔案中是否指定了完整的監聽列表。
若監聽列表中缺少被刪除的監聽,請執行下一步操作。否則,無需執行。
執行以下命令,編輯對應的AlbConfig,將被刪除的監聽配置添加回來。
kubectl -n <namespace> edit AlbConfig <albconfig-name> # 將<namespace>和<albconfig-name>分別替換為AlbConfig資源所在的命名空間和AlbConfig資源的名稱。
效能調優
如何最佳化Service中Pod變更配置時的Server調諧時間?
問題現象
在 Kubernetes 環境中,當 Service 關聯的 Pod 擴縮容時,Server 調諧過程耗時較長,影響業務彈性擴縮容的即時性。排查發現,調諧時間隨關聯 Ingress 數量增加而明顯變長。
解決方案
為提升 Server 調諧效率,可採取以下最佳化措施:
限制Ingress數量:同一個Service掛載的Ingress數不超過30條。
合并Ingress規則:當Ingress數量過多時,您可以將多個Service掛載在同一個Ingress下,然後通過在同一個Ingress資源下定義多條轉寄規則來提升Server調諧效能。
在使用Flannel網路外掛程式且Service配置為Local模式時,如何自動分配Node權重?
問題現象
在使用 Flannel 網路外掛程式且 Service 配置為 Local 模式的情境下,節點實際接收到的流量分布不均衡,導致部分節點負載偏高,未能實現期望的流量均衡。如何自動根據節點上的 Pod 數量為節點分配權重,從而實現更合理的流量分發。
解決方案
從v2.13.1-aliyun.1版本開始,ALB Ingress Controller支援自動化佈建節點權重。請確保您升級到最新版本以使用此功能。更多資訊,請參見升級ALB Ingress Controller組件。
Flannel外掛程式的叢集中,當Service設定為Local模式時,Node權重的計算方式如下圖所示,樣本中業務Pod(app=nginx)部署在三台ECS上,通過Service A對外提供服務。
Service後端Pod的總數量 | 描述 |
Pod數量 <= 100個 | ALB Ingress Controller會將每個節點上的Pod數量作為該節點的權重。 例如:如上圖所示,三台ECS的Pod數量為1、2、3,則相應的ECS權重被設定為1、2、3。因此,流量將以1:2:3的比例分配至這三台ECS上,從而實現更均衡的Pod負載分配。 |
Pod數量 > 100個 | ALB Ingress Controller將根據Node上部署的Pod數量占Pod總數的百分比計算Node權重。 例如:若上圖中三台ECS上的Pod數量分別為100、200、300,則相應的ECS權重被設定為16、33、50。因此,流量將依照16:33:50的比例分配到這三台ECS上,以達到更平衡的Pod負載分布。 |