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

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

最終更新日:Oct 31, 2024

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

背景情報

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

手順

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

Service troubleshooting process

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

    kubectl get svc -A | grep -i LoadBalancer | grep {XXX.XXX.XXX.XXX}# XXX.XXX.XXX.XXX is the IP address of the CLB instance.

  2. 次のコマンドを実行して、サービスエラーに対してイベントが生成されるかどうかを確認します。

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

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

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

サービスエラーと解決策

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

エラーメッセージ

説明とソリューション

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

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

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

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

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

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

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

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

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

重要

追加する注釈がCCMバージョンの要件を満たしていることを確認してください。 アノテーションとCCMバージョンの相関関係の詳細については、「CLBインスタンスを構成するためのサービスのYAMLファイルへのアノテーションの追加」をご参照ください。

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

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

解決策:

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

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

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

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

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

システムは、サービスをCLBインスタンスに関連付けることができません。

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

  1. CLBインスタンスが存在せず、サービスが不要になった場合は、サービスを削除します。

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

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

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

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

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

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

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

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

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

解決策:

  1. [クォータセンター] ページに移動し、CLBリソースクォータが十分かどうかを確認します。

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

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

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

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

解決策:

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

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

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

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

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

解決策: CLBインスタンスとクラスターが同じ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は自動的に共有リソースCLBインスタンスを作成し、購入できなくなりました。

解決策: CCMの更新

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

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

解決策: 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に変更する権限がありません。

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

解決策:

  • サービスから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によって作成されたCLBインスタンスは再利用されます。

解決策:

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

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

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

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

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

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

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

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

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

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

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

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

トラブルシューティング

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

カテゴリ

問題

解決策

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

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

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

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

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

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

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

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

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

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

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

CLB設定に関連する問題

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

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

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

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

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

サービスFAQ

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

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

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

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

CLB削除に関連する問題

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

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

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

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

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

原因

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

問題

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

解決策

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

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

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

原因

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

問題

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

解決策

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

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

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

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

    ポッドの設定例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      namespace: default
    spec:
      containers:
      - name: nginx
        image: nginx
        # Liveness probing
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 5084
          timeoutSeconds: 1
        # Readiness probing
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 5084
          timeoutSeconds: 1
        # Graceful shutdown
        lifecycle:
          preStop:
            exec:
              command:
              - sleep
              - 30
      terminationGracePeriodSeconds: 60

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

原因

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ルールに追加する理由?.

問題

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

解決策

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

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

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

    説明

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

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

    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インスタンスにアクセスすることはできません。

解決策

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

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

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

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

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

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

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

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

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

原因

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

問題

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

解決策

サービスのHTTPポートにtargetPortを設定します。 targetPortは、HTTPSポートがマッピングされるポートを指定します。 たとえば、HTTPSポートは次のNGINXサービスで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