本文介紹關於LoadBalancer型Service的異常問題診斷流程和排查思路。
背景資訊
當Service的類型設定為Type=LoadBalancer時,容器計算服務ACS的CCM(Cloud Controller Manager)組件會自動為該Service建立或配置阿里雲Server Load Balancer(Server Load Balancer),包括SLB、監聽、後端伺服器組等資源。關於SLB的自動更新策略,請參見Service的負載平衡配置注意事項。
診斷流程
執行排查前,請確保CCM組件版本不低於V1.9.3.276-g372aa98-aliyun。關於如何升級CCM,請參見升級CCM組件。關於CCM的發布記錄,請參見Cloud Controller Manager。

執行以下命令,確定SLB關聯的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例外狀況事件及處理方式。
無例外狀況事件:請參見排查思路。
如果以上排查無果,請通過產品DingTalk群諮詢。
Service例外狀況事件及處理方式
不同報錯資訊的解決方案如下表所示。
報錯資訊 | 說明及解決方案 |
| 共用型SLB不支援ENI。 解決方案:如果SLB後端使用的是ENI,您需要選擇效能保障型SLB執行個體。在Service中添加註解 重要 添加註解需要注意是否符合CCM的版本要求。關於註解和CCM的版本對應關係,請參見通過Annotation配置傳統型負載平衡CLB。 |
| SLB無後端伺服器,請確認Service是否已關聯Pod且Pod正常運行。 解決方案:
|
| 無法根據Service關聯SLB。 解決方案:登入負載平衡管理主控台,根據Service的
|
| 帳號欠費。 |
| 賬戶餘額不足。 |
| SLB OpenAPI限流。 解決方案:
|
| 無法刪除虛擬伺服器組關聯的監聽。 解決方案:
|
| 複用內網SLB時,該SLB和叢集不在同一個VPC內。 解決方案:請確保您的SLB和叢集在同一個VPC內。 |
| 虛擬交換器不足。 解決方案:通過 |
| ENI模式不支援String類型的 解決方案:將Service YAML中的 |
| 低版本CCM預設建立共用型SLB,但該類型SLB已停止售賣。 解決方案:升級CCM組件。 |
| SLB資源群組一旦建立後不支援修改。 解決方案:移除Service中的註解 |
| 無法在VPC內找到指定的ENI IP。 解決方案:確認Service中是否配置了註解 |
| SLB計費類型不支援從隨用隨付轉為按規格收費。 解決方案:
|
| 複用了CCM建立的SLB。 解決方案:
|
| SLB的類型一旦建立後不可更改,建立Service後更改了SLB的類型會導致該報錯。 解決方案:刪除重建Service。 |
| Service已經綁定一個SLB,不能再綁定另一個SLB。 解決方案:不支援通過更改 |
排查思路
對於非Service報錯類的異常問題,請參考下表進行排查。
問題類別 | 問題現象 | 解決方案 |
SLB訪問類 | SLB負載不均 | |
應用程式更新過程中訪問SLB出現503報錯 | ||
叢集內無法訪問SLB | ||
叢集外無法訪問SLB | ||
訪問HTTPS連接埠報錯 | ||
SLB配置類 | Serivce註解未生效 | |
SLB配置被修改 | ||
複用已有SLB未生效 | ||
複用已有SLB未配置監聽 | ||
SLB後端不一致 | ||
SLB刪除類 | SLB被刪除 | |
Service刪除後SLB未刪除 |
SLB負載不均
問題原因
SLB的調度演算法設定不合理。
問題現象
SLB後端伺服器負載不均。
解決方案
如果業務為長串連,則需要將SLB調度演算法設定為加權最少串連演算法,即為Service添加註解
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"。
應用程式更新過程中訪問CLB出現503報錯
問題原因
沒有對SLB監聽設定串連優雅中斷,或沒有對Pod設定優雅終止。
問題現象
應用程式更新過程中訪問SLB出現503報錯。
解決方案
通過
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain等註解為SLB監聽設定串連優雅中斷。關於註解的詳細說明,請參見監聽的典型操作。根據容器網路模式,設定Pod的
preStop和readinessProbe。readinessProbe為就緒檢查。只有就緒檢查通過後,Pod才會被加入到Endpoint中。容器計算服務ACS監控到Endpoint變化後才會將Pod掛載到SLB後端。需要合理設定就緒檢測(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
叢集外無法訪問SLB
問題原因
SLB設定了ACL或SLB未正常運行。
問題現象
叢集外無法訪問SLB。
解決方案
執行以下命令,查看Service事件資訊,並處理例外狀況事件。具體操作,請參見Service例外狀況事件及處理方式。
kubectl -n {your-namespace} describe svc {your-svc-name}確認SLB是否配置了ACL。
如果配置了ACL,請確認ACL是否允許用戶端IP訪問。關於SLB的ACL配置,請參見存取控制。
確認SLB虛擬伺服器組是否為空白。
如果虛擬伺服器組為空白,請檢查業務Pod是否關聯了Service及業務Pod是否正常運行。如果關聯的Pod運行異常,請定位解決Pod異常。具體操作,請參見Pod異常問題排查。
確認SLB監聽的健全狀態檢查是否正常。
如果SLB健全狀態檢查異常,請檢查業務Pod是否正常運行。關於SLB的健全狀態檢查,請參見健全狀態檢查探測。
如果以上步驟未解決您的問題,請通過產品DingTalk群諮詢。
無法串連到後端HTTPS服務
問題原因
SLB上配置認證後將會在SLB側進行解密,導致實際發送到後端Pod的請求為HTTP請求。
問題現象
無法串連到後端HTTPS服務。
解決方案
將Service中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