すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:サービスのトラブルシューティング

最終更新日:Nov 14, 2024

このトピックでは、LoadBalancerサービスの診断手順とエラーのトラブルシューティング方法について説明します。

背景情報

サービスのタイプがtype=LoadBalancerに設定されている場合、Container Service for Kubernetes (ACK) のクラウドコントローラマネージャー (CCM) は、SLBインスタンス、リスナー、バックエンドサーバーグループなど、サービスのServer Load Balancer (SLB) リソースを自動的に作成または構成します。 SLBリソースの自動更新に使用されるポリシーの詳細については、「LoadBalancerサービスの設定に関する考慮事項」をご参照ください。

手順

トラブルシューティングの前に、CCMのバージョンが1.9.3.276 g372aa98-aliyun以降であることを確認してください。 CCMの更新方法の詳細については、「CCMの更新」をご参照ください。CCMのリリースノートの詳細については、「Cloud Controller Manager」をご参照ください。

Service troubleshooting process

  1. 次のコマンドを実行して、SLBインスタンスに関連付けられているサービスを照会します。

    kubectl get svc -A | grep -i LoadBalancer | grep ${XXX.XXX.XXX} #XXX.XXX.XXX.XXXはSLBインスタンスのIPアドレスです。
  2. 次のコマンドを実行して、サービスエラーに対してイベントが生成されるかどうかを確認します。

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

    サービスエラーに対してイベントが生成されない場合は、CMMのバージョンが1.9.3.276 g372aa98-aliyun以降であるかどうかを確認します。 CCMの更新方法の詳細については、「CCMの更新」をご参照ください。

  3. 問題が解決しない場合は、チケットの送信します。

サービスエラーと解決策

次の表に、サービスで発生したエラーを修正する方法を示します。

エラーメッセージ

説明とソリューション

バックエンドサーバーの数がこのロードバランサーのクォータ制限に達しました

バックエンドサーバーのクォータが不足しています。

解決策: この問題を解決するには、次の方法を使用できます。

  • デフォルトでは、各SLBインスタンスに最大200台のバックエンドサーバーを関連付けることができます。 クォータの増加を要求するには、チケットを起票してサポートセンターにお問い合わせください。 クォータのクエリと増加方法の詳細については、SLBコンソールのクォータ管理ページに移動してください。

  • SLBインスタンスのexternalTrafficPolicyをLocal (externalTrafficPolicy: Local) に設定することを推奨します。 システムは、クラスタモードで多数のバックエンドサーバを作成することができる。 クラスターモードを使用する場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-labelラベルを使用して、使用するvServerを指定することを推奨します。 これにより、必要なvServerグループの数が減ります。 上記のラベルを使用してバックエンドサーバーをSLBインスタンスに関連付ける方法の詳細については、「CLBインスタンスを構成するためのサービスのYAMLファイルへの注釈の追加」をご参照ください。

  • 複数のサービスがSLBインスタンスを共有する場合、サービスによって使用されるすべてのバックエンドサーバーがカウントされます。 サービスごとにSLBインスタンスを作成することを推奨します。

loadbalancerはeniタイプのバックエンドサーバーをサポートしていません

共有リソースSLBインスタンスは、elastic network Interface (ENI) をサポートしていません。

解決策: ENIをバックエンドサーバーとして指定する場合は、高性能SLBインスタンスを作成します。 アノテーション: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" をサービスに追加します。

重要

追加する注釈がCCMバージョンの要件を満たしていることを確認してください。 アノテーションとCCMバージョンの相関関係の詳細については、「一般的なアノテーション」をご参照ください。

LoadBalancerの使用可能なノードがありません

SLBインスタンスに関連付けられているバックエンドサーバーはありません。 ポッドがサービスに関連付けられているかどうか、およびポッドが通常どおり実行されるかどうかを確認します。

解決策:

  • サービスに関連付けられているポッドがない場合は、アプリケーションポッドをサービスに関連付けます。

  • 関連するポッドが正常に実行されない場合は、[ポッドのトラブルシューティング] を参照して、問題のトラブルシューティングを行います。

  • バックエンドサーバーがSLBインスタンスに関連付けられていないが、ポッドが通常どおり実行されている場合は、ポッドがマスターノードにデプロイされているかどうかを確認します。 ポッドがマスターノードにデプロイされている場合は、ポッドをワーカーノードに追い出します。 ポッドがマスターノードにデプロイされていない場合、チケットの送信します。

  • alicloud: openapiで [% s] という名前のloadbalancerは見つかりませんが、service.loaderbalancer.ingressで定義されています。 これは、loadbalanceridアノテーションを削除したときに発生する可能性があります

  • alicloud: ロードバランサーは見つかりませんが、サービスで定義されています

サービスをSLBインスタンスに関連付けることができません。

解決方法: SLBコンソールにログインし、EXTERNAL-IPに基づいてサービスのリージョンでSLBインスタンスを検索します。

  1. SLBインスタンスが存在せず、サービスが使用されなくなった場合は、サービスを削除します。

  2. SLBインスタンスが存在する場合は、次の手順を実行します。

    1. SLBコンソールでSLBインスタンスが作成されている場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-idアノテーションをServiceに追加します。 詳細については、「CLBインスタンスを構成するためのサービスのYAMLファイルへのアノテーションの追加」をご参照ください。

    2. SLBインスタンスがCCMによって自動的に作成される場合は、kubernetes.do.not.de leteラベルがSLBインスタンスに追加されているかどうかを確認します。 SLBインスタンスにラベルが追加されていない場合は、SLBインスタンスにラベルを追加します。 詳細については、「」をご参照ください。CCMバージョンがV1.9.3.10以前の場合、SLBインスタンスの名前を変更するにはどうすればよいですか。

ORDER.ARREARAGEメッセージ: アカウントはarrearageです。

アカウントで延滞が発生している場合。

pay.INSUFFICIENT_BALANCEメッセージ: アカウントに十分な残高がありません。

アカウントの残高が不足しています。

ステータスコード: 400コード: Throttlingxxx

SLBに対してAPIスロットリングがトリガーされます。

解決策:

  1. SLBコンソールのクォータ管理ページに移動し、SLBリソースクォータが十分かどうかを確認します。

  2. 次のコマンドを実行して、サービスでエラーが発生したかどうかを確認します。 サービスでエラーが発生した場合は、この表の情報を参照して、エラーのトラブルシューティングを行います。

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

ステータスコード: 400コード: RspoolVipExistメッセージ: このvServerグループに関連付けられているvipsがあります。

vServerグループに関連付けられているリスナーは削除できません。

解決策:

  1. サービスのアノテーションにSLBインスタンスのIDが含まれているかどうかを確認します。 例: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-slb-id}

    サービスのアノテーションにSLBインスタンスのIDが含まれている場合、SLBインスタンスは再利用されます。

  2. SLBコンソールにログインし、Serviceポートを使用するリスナーを削除します。 SLBインスタンスのリスナーを削除する方法の詳細については、「リスナーの転送ルールの管理」をご参照ください。

ステータスコード: 400コード: NetworkConflict

再利用された内部向けSLBインスタンスとクラスターは、同じ仮想プライベートクラウド (VPC) にデプロイされていません。

解決策: SLBインスタンスとクラスターが同じVPCにデプロイされていることを確認します。

ステータスコード: 400コード: VSwitchAvailableIpNotExistメッセージ: 指定されたVSwitchには使用可能なipがありません。

vSwitchのアイドルIPアドレスが不足しています。

解決策: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}" を使用して、同じVPC内の別のvSwitchを指定します。

指定されたポートは1〜65535です。

targetPortフィールドは、ENIモードのSTRING型の値をサポートしていません。

解決策: Service YAMLファイルのtargetPortフィールドをINTEGERタイプの値に設定するか、CCMを更新します。CCMの更新方法の詳細については、「CCMの更新」をご参照ください。

ステータスコード: 400コード: ShareSlbHaltSalesメッセージ: 共有インスタンスは廃止されました。

デフォルトでは、旧バージョンのCCMは自動的に共有リソースSLBインスタンスを作成し、購入できなくなりました。

解決策: CCMの更新

一度作成したResourceGroupIdを変更できません

リソースグループの作成後、SLBインスタンスのリソースグループを変更することはできません。

解決策: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id:"rg-xxxx" をサービスから削除します。

eniid for ip x.x.x in vpc vpc-xxxxが見つかりません

ENIの指定されたIPアドレスがVPCに見つかりません。

解決策: service.beta.kubernetes.io/backend-type: eniアノテーションがサービスに追加されているかどうかを確認します。 アノテーションがサービスに追加されている場合は、Flannelがクラスターのネットワークプラグインとして使用されているかどうかを確認します。 Flannelが使用されている場合は、サービスから注釈を削除します。 FlannelはENIモードをサポートしていません。

  • loadbalancerのinstanceChargeTypeがPayByCLCUであるため、操作は許可されません。

  • ユーザーにInstanceChargeTypeをspecに変更する権限がありません。

サービスで使用されるSLBインスタンスの課金方法を従量課金から従量課金に変更することはできません。

解決策:

  • サービスからservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec注釈を削除します。

  • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-typeがサービスに追加されている場合、値をPayByCLCUに設定します。

SyncLoadBalancerFailed the loadbalancer xxxは再利用できません。kubernetesによって作成されたloadbalancerは再利用できません。

CCMによって作成されたSLBインスタンスは再利用されます。

解決策:

  1. 関連するサービスのYAMLファイルを確認し、SLBインスタンスIDをService. beta.kubernetes.io/alibaba-cloud-loadbalancer-idアノテーションに記録します。

  2. サービスのステータスに基づいて問題をトラブルシューティングします。

    • サービスが [保留中] 状態の場合、Service. beta.kubernetes.io/alibaba-cloud-loadbalancer-idアノテーションの値を、CLBコンソールで手動で作成されたSLBインスタンスのIDに変更します。

    • サービスがPending状態でない場合は、次の操作を実行します。

      • SLBインスタンスのIPアドレスがサービスの外部IPアドレスと同じ場合、Service. beta.kubernetes.io/alibaba-cloud-loadbalancer-idアノテーションを削除します。

      • SLBインスタンスのIPアドレスがサービスの外部IPアドレスと異なる場合は、CLBコンソールにログインし、クラスターが存在するリージョンを選択し、サービスの外部IPに基づいてSLBインスタンスを見つけます。service.beta.kubernetes.io/alibaba-cloud-loadbalancer-idアノテーションの値を手動で作成したSLBインスタンスのIDに変更します。 対応するSLBインスタンスが見つからない場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-idアノテーションの値を、SLBコンソールで手動で作成されたSLBインスタンスのIDに変更します。 次に、サービスを再作成します。

alicloud: 作成後、LoadBalancer AddressTypeを変更できません。 削除して再試行

作成後にSLBインスタンスのタイプを変更することはできません。

解決策: 関連するサービスを再作成します。

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

SLBインスタンスを、すでに別のSLBインスタンスに関連付けられているサービスに関連付けることはできません。

解決策: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-idアノテーションの値を変更して、既存のSLBインスタンスを再利用することはできません。 サービスに関連付けられているSLBインスタンスを変更するには、サービスを削除して再作成する必要があります。

トラブルシューティング

次の表に示す情報を参照して、サービスエラー以外のエラーのトラブルシューティングを行うことができます。

カテゴリ

問題

解決策

SLBインスタンスにアクセスするときに発生する問題

SLBインスタンスはトラフィックを均等に分散しません。

SLBインスタンスがトラフィックを均等に分散しない

アプリケーションの更新中にSLBインスタンスにアクセスすると、503エラーが発生します。

アプリケーションの更新中にSLBインスタンスにアクセスすると503エラーが発生します

クラスター内からSLBインスタンスにアクセスすることはできません。

クラスター内からSLBインスタンスにアクセスできません

クラスターの外部からSLBインスタンスにアクセスすることはできません。

クラスターの外部からSLBインスタンスにアクセスできません

リクエストがHTTPSポートに送信されると、プレーンHTTPリクエストがHTTPSポートに送信されましたエラーが発生します。

バックエンドHTTPSサービスへのアクセスに失敗するのはなぜですか。

SLB設定に関連する問題

サービスの注釈は有効になりません。

サービスの注釈が有効にならない場合はどうすればよいですか?

SLBインスタンスの設定が変更されました。

SLBインスタンスの設定が変更されるのはなぜですか。

既存のSLBインスタンスを再利用できません。

システムが既存のSLBインスタンスを複数のサービスに使用できないのはなぜですか?

既存のSLBインスタンスを再利用する場合、リスナーは作成されません。

既存のSLBインスタンスを再利用するときにリスナーが作成されないのはなぜですか。

サービスのエンドポイントは、SLBインスタンスのバックエンドサーバーに指定されたエンドポイントとは異なります。

SLBインスタンスのvServerグループが更新されない場合はどうすればよいですか。

SLBの削除に関連する問題

SLBインスタンスが削除されました。

SLBインスタンスはいつ自動的に削除されますか。

SLBインスタンスはサービスとともに削除されません。

SLBインスタンスはいつ自動的に削除されますか。

SLBインスタンスがトラフィックを均等に分散しない

原因

SLBインスタンスに指定されたスケジューリングアルゴリズムが不適切です。

問題

トラフィックは、SLBインスタンスのバックエンドサーバーに均等に分散されません。

解決策

  • externalTrafficPolicy: Localをサービスに設定した場合、Service. beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"WRR" アノテーションをサービスに追加して、SLBインスタンスのスケジューリングアルゴリズムをwrr (加重ラウンドロビン) に設定します。

  • サービスへの長期接続が確立されている場合は、Service. beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"WLC" アノテーションを追加して、SLBインスタンスのスケジューリングアルゴリズムをwlc (Weighted Least connections) に設定します。

アプリケーションの更新中にSLBインスタンスにアクセスすると503エラーが発生します

原因

接続のドレインがSLBリスナーに設定されていないか、またはポッドにグレースフルシャットダウンが設定されていません。

問題

アプリケーションの更新中にSLBインスタンスにアクセスすると、503エラーが発生します。

解決策

  1. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainアノテーションを追加して、SLBリスナーの接続トレーニングを設定します。 注釈の詳細については、「リスナーを管理する一般的な操作」をご参照ください。

  2. ポッドのネットワークモードに基づいて、ポッドのpreStopパラメーターとreadinessProbeパラメーターを設定します。

    • readinessProbeは、コンテナーがネットワークトラフィックを受け入れる準備ができているかどうかを確認します。 ポッドが準備完了プロービングに合格した場合にのみ、ポッドがエンドポイントに追加されます。 エンドポイントが更新されたことをACKが識別した場合にのみ、ノードがSLBインスタンスにアタッチされます。 readinessProbeには、適切なプロービング間隔、遅延期間、および異常しきい値を設定する必要があります。 短い期間を指定すると、アプリケーションポッドは繰り返し再起動します。

    • preStopの値を、アプリケーションポッドが残りのリクエストを処理するために必要な期間に設定することを推奨します。 terminationGracePeriodSecondsの値をpreStopより30秒長い期間に設定することを推奨します。

    ポッドの設定例:

    apiVersion: v1
    種類: ポッド
    メタデータ:
      name: nginx
      namespace: デフォルト
    spec:
      コンテナ:
      - name: nginx
        image: nginx
        # Livenessプロービング
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            ポート: 5084
          timeoutSeconds: 1
        # 準備のプロービング
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            ポート: 5084
          timeoutSeconds: 1
        # 優雅なシャットダウン
        ライフサイクル:
          preStop:
            exec:
              command:
              -睡眠
              -30
      terminationGracePeriodSeconds: 60 

クラスター内からSLBインスタンスにアクセスできない

原因

externalTrafficPolicy: LocalはLoadBalancerに設定されます。 ローカルモードでは、LoadBalancerのIPアドレスは、ローカルノード (LoadBalancerを実行するノード) でプロビジョニングされたポッドからのみアクセスできます。 LoadBalancerのIPアドレスは、クラスター内の他のノードのポッドからアクセスできません。 LoadBalancerのIPアドレスはKubernetesクラスターの外部にあります。 ACKクラスター内のノードまたはポッドがセカンドホップを使用せずにIPアドレスにアクセスできない場合、リクエストはLoadBalancerを通過しません。 その結果、LoadBalancerのIPアドレスは、LoadBalancerを使用するサービスの拡張IPアドレスと見なされます。 リクエストは、iptablesまたはIP仮想サーバー (IPVS) に基づくkube-proxyによって転送されます。

このシナリオでは、要求されたポッドがローカルノードでプロビジョニングされていない場合、接続の問題が発生します。 LoadBalancerのIPアドレスは、要求されたポッドがローカルノードでプロビジョニングされている場合にのみアクセスできます。 詳細については、「」をご参照ください。kube-proxyが外部lbのアドレスをノードローカルiptablesルールに追加する理由?.

問題

クラスター内からSLBインスタンスにアクセスすることはできません。

解決策

  • クラスターIPまたはIngress名を使用します。

    Ingress名はnginx-ingress-lb.kubeシステムです。

  • LoadBalancerサービスのexternalTrafficPolicyをクラスターに設定します。 ただし、この場合、クライアントの送信元IPアドレスは保存できません。 Ingressを変更するには、次のコマンドを実行する必要があります。

    説明

    SLBインスタンスがIngressによって使用されている場合、Ingressポッドをホストするノード上のポッドのみが、IngressまたはSLBインスタンスによって公開されているサービスにアクセスできます。

    kubectl edit svc nginx-ingress-lb -n kube-system
  • クラスターがENIモードでTerwayを使用している場合、LoadBalancerサービスのexternalTrafficPolicyをクラスターに設定し、アノテーション: Service. beta.kubernetes.io/backend-type:"eni" などの形式でアノテーションを追加して、ENIに直接アクセスします。 これにより、クライアントの送信元IPアドレスを保持し、クラスター内からSLBインスタンスにアクセスできます。 詳細については、「CLBインスタンスを構成するためのサービスのYAMLファイルへのアノテーションの追加」をご参照ください。

    apiVersion: v1
    種類: サービス
    メタデータ:
      アノテーション:
        service.beta.kubernetes.io/backend-type: eni
      ラベル:
        アプリ: nginx-ingress-lb
      名前: nginx-ingress-lb
      名前空間: kube-system
    spec:
      externalTrafficPolicy: クラスター 

クラスターの外部からSLBインスタンスにアクセスできない

原因

SLBインスタンスのアクセス制御リスト (ACL) ルールを設定した場合、SLBインスタンスが通常どおりに実行されない場合。

問題

クラスターの外部からSLBインスタンスにアクセスすることはできません。

解決策

  1. 次のコマンドを実行して、サービスイベントを照会し、エラーをトラブルシューティングします。 詳細については、「サービスエラーと解決策」をご参照ください。

    kubectl -n {your-namespace} describe svc {your-svc-name}
  2. ACLルールがSLBインスタンスに設定されているかどうかを確認します。

    SLBインスタンスにACLルールが設定されている場合は、クライアントIPアドレスがSLBインスタンスにアクセスできるかどうかを確認します。 SLBインスタンスのACLルールを設定する方法の詳細については、「アクセス制御の概要」をご参照ください。

  3. SLBインスタンスがvServerグループに関連付けられているかどうかを確認します。

    vServerグループが関連付けられていない場合は、アプリケーションポッドがサービスに関連付けられているかどうか、およびアプリケーションポッドが通常どおり実行されているかどうかを確認します。 アプリケーションポッドが正常に実行されない場合は、原因を特定してエラーのトラブルシューティングを行います。 詳細については、「ポッドのトラブルシューティング」をご参照ください。

  4. 異常なバックエンドサーバーがSLBリスナーによって検出されたかどうかを確認します。

    異常なバックエンドサーバーが検出された場合は、アプリケーションポッドが正常に実行されているかどうかを確認します。 SLBのヘルスチェックの詳細については、「ヘルスチェックスクリプトの実行」をご参照ください。

  5. 問題が解決しない場合は、チケットの送信します。

バックエンドHTTPSサービスにアクセスできません

原因

SLBインスタンスで証明書情報を指定すると、SLBインスタンスはHTTPSリクエストを復号化し、HTTPリクエストをバックエンドポッドに送信します。

問題

バックエンドHTTPSサービスにアクセスできません。

解決策

サービスのHTTPポートにtargetPortを設定します。 targetPortは、HTTPSポートがマッピングされるポートを指定します。 たとえば、HTTPSポートは次のNGINXサービスで443されます。 この場合、targetPortの値を80に変更する必要があります。

例:

apiVersion: v1
種類: サービス
メタデータ:
  アノテーション:
    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: デフォルト
spec:
  ポート:
  - port: 80
    protocol: TCP
    targetPort: 80
  - port: 443
    protocol: TCP
    targetPort: 80
  セレクタ:
    run: nginx
  タイプ: LoadBalancer