全部產品
Search
文件中心

Container Compute Service:Service異常問題排查

更新時間:Dec 11, 2024

本文介紹關於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

Service troubleshooting process

  1. 執行以下命令,確定SLB關聯的Service。

    kubectl get svc -A |grep -i LoadBalancer|grep ${XXX.XXX.XXX.XXX}  #XXX.XXX.XXX.XXX是loadbalancer ip。
  2. 執行以下命令,檢查對應Service是否存在報錯事件。

    kubectl -n {your-namespace} describe svc {your-svc-name}
    重要

    如果您執行命令後看不到Event資訊,請確認您的CCM組件版本不低於V1.9.3.276-g372aa98-aliyun。關於如何查看及升級CCM版本,請參見升級CCM組件

  3. 如果以上排查無果,請通過產品DingTalk群諮詢。

Service例外狀況事件及處理方式

不同報錯資訊的解決方案如下表所示。

報錯資訊

說明及解決方案

The loadbalancer does not support backend servers of eni type

共用型SLB不支援ENI。

解決方案:如果SLB後端使用的是ENI,您需要選擇效能保障型SLB執行個體。在Service中添加註解annotation: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small"

重要

添加註解需要注意是否符合CCM的版本要求。關於註解和CCM的版本對應關係,請參見通過Annotation配置傳統型負載平衡CLB

There are no available nodes for LoadBalancer

SLB無後端伺服器,請確認Service是否已關聯Pod且Pod正常運行。

解決方案:

  • 若未關聯Pod,請將Service關聯至應用Pod。

  • 若關聯的Pod運行異常,請定位解決Pod異常。具體操作,請參見Pod異常問題排查

  • 如果SLB無後端伺服器但Pod正常運行,請檢查Pod所在節點是否為Master節點。如果是,請將業務Pod驅逐到Worker節點。如果不是,請通過產品DingTalk群諮詢。

  • alicloud: not able to find loadbalancer named [%s] in openapi, but it's defined in service.loaderbalancer.ingress. this may happen when you removed loadbalancerid annotation

  • alicloud: can not find loadbalancer, but it's defined in service

無法根據Service關聯SLB。

解決方案:登入負載平衡管理主控台,根據Service的EXTERNAL-IP,在其所在的地區搜尋SLB。

  1. 如果搜尋不到SLB,且該Service無需再使用,則刪除對應的Service即可。

  2. 如果SLB存在,執行以下步驟。

    1. 如果SLB是手動在SLB控制台建立,在Service中添加註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id。詳情請參見通過Annotation配置傳統型負載平衡CLB

    2. 如果SLB是由CCM自動建立,確認該SLB是否有標籤kubernetes.do.not.delete。如果沒有,請添加標籤。具體操作,請參見舊版本CCM如何支援SLB重新命名?

ORDER.ARREARAGE Message: The account is arrearage.

帳號欠費。

PAY.INSUFFICIENT_BALANCE Message: Your account does not have enough balance.

賬戶餘額不足。

Status Code: 400 Code: Throttlingxxx

SLB OpenAPI限流。

解決方案:

  1. 請登入Server Load Balancer配額管理,查看並確保SLB配額充足。

  2. 執行以下命令,查看叢集Service是否存在異常。如果存在,請參照此表處理例外狀況事件。

    kubectl -n {your-namespace} describe svc {your-svc-name}

Status Code: 400 Code: RspoolVipExist Message: there are vips associating with this vServer group.

無法刪除虛擬伺服器組關聯的監聽。

解決方案:

  1. 確認Service中的註解是否帶有SLB執行個體的ID(例如service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-slb-id})。

    如果註解帶有SLB執行個體ID,說明是複用的SLB。

  2. 在SLB控制台中刪除Service中port對應的監聽。關於如何刪除SLB監聽,請參見配置監聽轉寄規則

Status Code: 400 Code: NetworkConflict

複用內網SLB時,該SLB和叢集不在同一個VPC內。

解決方案:請確保您的SLB和叢集在同一個VPC內。

Status Code: 400 Code: VSwitchAvailableIpNotExist Message: The specified VSwitch has no available ip.

虛擬交換器不足。

解決方案:通過service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}"指定同VPC下另一個虛擬交換器。

The specified Port must be between 1 and 65535.

ENI模式不支援String類型的targetPort

解決方案:將Service YAML中的targetPort欄位改為INT類型或者升級CCM。關於如何升級CCM,請參見升級CCM組件

Status Code: 400 Code: ShareSlbHaltSales Message: The share instance has been discontinued.

低版本CCM預設建立共用型SLB,但該類型SLB已停止售賣。

解決方案:升級CCM組件

can not change ResourceGroupId once created

SLB資源群組一旦建立後不支援修改。

解決方案:移除Service中的註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id:"rg-xxxx"

can not find eniid for ip x.x.x.x in vpc vpc-xxxx

無法在VPC內找到指定的ENI IP。

解決方案:確認Service中是否配置了註解service.beta.kubernetes.io/backend-type:eni。如果已配置,請確認叢集網路外掛程式是否為Flannel。Flannel網路模式不支援ENI模式,移除Service中對應的註解即可。

  • The operation is not allowed because the instanceChargeType of loadbalancer is PayByCLCU.

  • User does not have permission modify InstanceChargeType to spec.

SLB計費類型不支援從隨用隨付轉為按規格收費。

解決方案:

  • 移除service中的Annotation:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec

  • 如果service中有service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type,取值需設定為PayByCLCU

SyncLoadBalancerFailed the loadbalancer xxx can not be reused,can not reuse loadbalancer created by kubernetes.

複用了CCM建立的SLB。

解決方案:

  1. 查看Service YAML中的annotationservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-id對應的SLB ID。

  2. 根據Service狀態處理報錯。

    • 如果Service為pending狀態,您需要替換annotationservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-id中的SLB ID,更改為手動在傳統型負載平衡CLB控制台建立的SLB。

    • 如果Service不是pending狀態,根據以下實際情況處理。

      • 如果SLB對應的IP與Service的external IP一致,刪除annotationservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-id即可。

      • 如果SLB對應的IP與Service的external IP不一致,您需要登入傳統型負載平衡CLB控制台,找到叢集對應Region,根據Service的external IP尋找對應的SLB,更改annotationservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-id中的SLB ID。如果沒有找到對應的SLB,更改annotationservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-id中的SLB ID為手動在SLB控制台建立的SLB,然後重建Service。

alicloud: can not change LoadBalancer AddressType once created. delete and retry

SLB的類型一旦建立後不可更改,建立Service後更改了SLB的類型會導致該報錯。

解決方案:刪除重建Service。

the loadbalancer lb-xxxxx can not be reused, service has been associated with ip [xxx.xxx.xxx.xxx], cannot be bound to ip [xxx.xxx.xxx.xxx]

Service已經綁定一個SLB,不能再綁定另一個SLB。

解決方案:不支援通過更改service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id的SLB ID的方式複用已有SLB。如果需要更改綁定的SLB,需要刪除重建Service。

排查思路

對於非Service報錯類的異常問題,請參考下表進行排查。

問題類別

問題現象

解決方案

SLB訪問類

SLB負載不均

SLB負載不均

應用程式更新過程中訪問SLB出現503報錯

應用程式更新過程中訪問SLB出現503報錯

叢集內無法訪問SLB

Kubernetes叢集中訪問LoadBalancer暴露出去的SLB地址不通

叢集外無法訪問SLB

叢集外無法訪問SLB

訪問HTTPS連接埠報錯The plain HTTP request was sent to HTTPS port

訪問HTTPS連接埠報錯

SLB配置類

Serivce註解未生效

Service註解不生效如何處理?

SLB配置被修改

為何SLB的配置被修改?

複用已有SLB未生效

為什麼複用已有SLB沒有生效?

複用已有SLB未配置監聽

為什麼複用已有SLB時沒有配置監聽?

SLB後端不一致

SLB虛擬伺服器組未更新如何處理?

SLB刪除類

SLB被刪除

什麼情況下會自動刪除SLB?

Service刪除後SLB未刪除

什麼情況下會自動刪除SLB?

SLB負載不均

問題原因

SLB的調度演算法設定不合理。

問題現象

SLB後端伺服器負載不均。

解決方案

  • 如果業務為長串連,則需要將SLB調度演算法設定為加權最少串連演算法,即為Service添加註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"

應用程式更新過程中訪問CLB出現503報錯

問題原因

沒有對SLB監聽設定串連優雅中斷,或沒有對Pod設定優雅終止。

問題現象

應用程式更新過程中訪問SLB出現503報錯。

解決方案

  1. 通過service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain等註解為SLB監聽設定串連優雅中斷。關於註解的詳細說明,請參見監聽的典型操作

  2. 根據容器網路模式,設定Pod的preStopreadinessProbe

    • 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。

解決方案

  1. 執行以下命令,查看Service事件資訊,並處理例外狀況事件。具體操作,請參見Service例外狀況事件及處理方式

    kubectl -n {your-namespace} describe svc {your-svc-name}
  2. 確認SLB是否配置了ACL。

    如果配置了ACL,請確認ACL是否允許用戶端IP訪問。關於SLB的ACL配置,請參見存取控制

  3. 確認SLB虛擬伺服器組是否為空白。

    如果虛擬伺服器組為空白,請檢查業務Pod是否關聯了Service及業務Pod是否正常運行。如果關聯的Pod運行異常,請定位解決Pod異常。具體操作,請參見Pod異常問題排查

  4. 確認SLB監聽的健全狀態檢查是否正常。

    如果SLB健全狀態檢查異常,請檢查業務Pod是否正常運行。關於SLB的健全狀態檢查,請參見健全狀態檢查探測

  5. 如果以上步驟未解決您的問題,請通過產品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