本文介紹關於LoadBalancer型Service的異常問題診斷流程和排查思路。
背景資訊
當Service的類型設定為Type=LoadBalancer
時,Container ServiceACK的CCM(Cloud Controller Manager)組件會自動為該Service建立或配置阿里雲傳統型負載平衡CLB(Classic Load Balancer),包括CLB、監聽、後端伺服器組等資源。關於CLB的自動更新策略,請參見Service的負載平衡配置注意事項。
診斷流程
執行排查前,請確保CCM組件版本不低於V1.9.3.276-g372aa98-aliyun。關於如何升級CCM,請參見升級CCM組件。關於CCM的發布記錄,請參見Cloud Controller Manager。
執行以下命令,確定CLB關聯的Service。
kubectl get svc -A |grep -i LoadBalancer|grep {XXX.XXX.XXX.XXX} # XXX.XXX.XXX.XXX是loadbalancer IP。
執行以下命令,檢查對應Service是否存在報錯事件。
kubectl -n {your-namespace} describe svc {your-svc-name}
重要如果您執行命令後看不到Event資訊,請確認您的CCM組件版本不低於V1.9.3.276-g372aa98-aliyun。關於如何查看及升級CCM版本,請參見升級CCM組件。
有例外狀況事件:請參見Service例外狀況事件及處理方式。
無例外狀況事件:請參見排查思路。
如果以上排查無果,請提交工單。
Service例外狀況事件及處理方式
不同報錯資訊的解決方案如下表所示。
報錯資訊 | 說明及解決方案 |
| 指CLB的後端伺服器配額不足。 解決方案:您可以採取以下方式,最佳化配額消耗。
|
| 共用型CLB不支援ENI。 解決方案:如果CLB後端使用的是ENI,您需要選擇效能保障型CLB執行個體。在Service中添加註解 重要 添加註解需要注意是否符合CCM的版本要求。關於註解和CCM的版本對應關係,請參見通過Annotation配置傳統型負載平衡CLB。 |
| CLB無後端伺服器,請確認Service是否已關聯Pod且Pod正常運行。 |
| 無法根據Service關聯CLB。 解決方案:登入負載平衡管理主控台,根據Service的
|
| 帳號欠費。 |
| 賬戶餘額不足。 |
| CLB OpenAPI限流。 解決方案:
|
| 無法刪除虛擬伺服器組關聯的監聽。 解決方案:
|
| 複用內網CLB時,該CLB和叢集不在同一個VPC內。 解決方案:請確保您的CLB和叢集在同一個VPC內。 |
| 虛擬交換器不足。 解決方案:通過 |
| ENI模式不支援String類型的 解決方案:將Service YAML中的 |
| 低版本CCM預設建立共用型CLB,但該類型CLB已停止售賣。 解決方案:升級CCM組件。 |
| CLB資源群組一旦建立後不支援修改。 解決方案:移除Service中的註解 |
| 無法在VPC內找到指定的ENI IP。 解決方案:確認Service中是否配置了註解 |
| CLB計費類型不支援從隨用隨付轉為按規格收費。 解決方案:
|
| 複用了CCM建立的CLB。 解決方案:
|
| CLB的類型一旦建立後不可更改,建立Service後更改了CLB的類型會導致該報錯。 解決方案:刪除重建Service。 |
| Service已經綁定一個CLB,不能再綁定另一個CLB。 解決方案:不支援通過更改 |
排查思路
對於非Service報錯類的異常問題,請參考下表進行排查。
問題類別 | 問題現象 | 解決方案 |
CLB訪問類 | CLB負載不均 | |
應用程式更新過程中訪問CLB出現503報錯 | ||
叢集內無法訪問CLB | ||
叢集外無法訪問CLB | ||
訪問HTTPS連接埠報錯 | ||
CLB配置類 | Serivce註解未生效 | |
CLB配置被修改 | ||
複用已有CLB未生效 | ||
複用已有CLB未配置監聽 | ||
CLB後端不一致 | ||
CLB刪除類 | CLB被刪除 | |
Service刪除後CLB未刪除 |
CLB負載不均
問題原因
CLB的調度演算法設定不合理。
問題現象
CLB後端伺服器負載不均。
解決方案
Local模式Service(即
externalTrafficPolicy: Local
)需要將CLB調度演算法設定為加權輪詢演算法,即為Service添加註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wrr"
。如果業務為長串連,則需要將CLB調度演算法設定為加權最少串連演算法,即為Service添加註解
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"
。
應用程式更新過程中訪問CLB出現503報錯
問題原因
沒有對CLB監聽設定串連優雅中斷,或沒有對Pod設定優雅終止。
問題現象
應用程式更新過程中訪問CLB出現503報錯。
解決方案
通過
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain
等註解為CLB監聽設定串連優雅中斷。關於註解的詳細說明,請參見監聽的典型操作。根據容器網路模式,設定Pod的
preStop
和readinessProbe
。readinessProbe
為就緒檢查。只有就緒檢查通過後,Pod才會被加入到Endpoint中。Container ServiceACK監控到Endpoint變化後才會將Node掛載到CLB後端。需要合理設定就緒檢測(readinessProbe
)的探測頻率、延時時間、不健康閾值等資料,部分應用啟動時間本身較長,如果設定的時間過短,會導致Pod反覆重啟。preStop
時間建議設定為業務處理完所有剩餘請求所需的時間,terminationGracePeriodSeconds
時間建議設定為preStop
的時間再加30秒以上。
Pod配置樣本:
apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: containers: - name: nginx image: nginx # 存活檢測 livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # 就緒檢測 readinessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # 優雅退出 lifecycle: preStop: exec: command: - sleep - 30 terminationGracePeriodSeconds: 60
叢集內無法訪問CLB
問題原因
CLB設定了externalTrafficPolicy: Local
類型,這種類型的CLB地址只有在Node中部署了對應的後端Pod,才能被訪問。因為CLB的地址是叢集外使用,如果叢集節點和Pod不能直接存取,請求不會到CLB,會被當作Service的擴充IP地址,被kube-proxy的iptables或ipvs轉寄。
如果剛好叢集節點或者Pod所在的節點上沒有相應的後端服務Pod,就會發生網路不通的問題,而如果有相應的後端服務Pod,是可以正常訪問。相關問題的更多資訊請參見kube-proxy將external-lb的地址添加到節點本地iptables規則。
問題現象
叢集內無法訪問CLB。
解決方案
在Kubernetes叢集內通過ClusterIP或者服務名訪問。
其中Ingress的服務名為:
nginx-ingress-lb.kube-system
將LoadBalancer的Service中的externalTrafficPolicy修改為Cluster,但是在應用中會丟失原IP,Ingress的服務修改命令如下。
說明若是Ingress的CLB,只有Ingress的Pod所在節點上,Pod才能訪問通過Ingress或CLB暴露出去的服務。
kubectl edit svc nginx-ingress-lb -n kube-system
若是Terway的ENI或者ENI多IP的叢集,將LoadBalancer的Service中的externalTrafficPolicy修改為Cluster,並且添加ENI直通的annotation,例如
annotation: service.beta.kubernetes.io/backend-type:"eni"
,具體格式如下,可以保留源IP,並且在叢集內訪問也沒有問題。詳細資料,請參見通過Annotation配置傳統型負載平衡CLB。apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/backend-type: eni labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: externalTrafficPolicy: Cluster
叢集外無法訪問CLB
問題原因
CLB設定了ACL或CLB未正常運行。
問題現象
叢集外無法訪問CLB。
解決方案
執行以下命令,查看Service事件資訊,並處理例外狀況事件。具體操作,請參見Service例外狀況事件及處理方式。
kubectl -n {your-namespace} describe svc {your-svc-name}
確認CLB是否配置了ACL。
如果配置了ACL,請確認ACL是否允許用戶端IP訪問。關於CLB的ACL配置,請參見存取控制。
確認CLB虛擬伺服器組是否為空白。
如果虛擬伺服器組為空白,請檢查業務Pod是否關聯了Service及業務Pod是否正常運行。如果關聯的Pod運行異常,請定位解決Pod異常。具體操作,請參見Pod異常問題排查。
確認CLB監聽的健全狀態檢查是否正常。
如果CLB健全狀態檢查異常,請檢查業務Pod是否正常運行。關於CLB的健全狀態檢查,請參見健全狀態檢查探測。
如果以上步驟未解決您的問題,請提交工單。
無法串連到後端HTTPS服務
問題原因
CLB上配置認證後將會在CLB側進行解密,導致實際發送到後端Pod的請求為HTTP請求。
問題現象
無法串連到後端HTTPS服務。
解決方案
將Serivce中HTTPS連接埠對應的Target Port配置為HTTP連接埠。以Nginx為例,HTTPS連接埠為443,其對應的targetPort
需要改為80
。
配置樣本:
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
- port: 443
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer