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

Container Service for Kubernetes:サービスのよくある質問

最終更新日:Nov 09, 2025

このトピックでは、Container Service for Kubernetes (ACK) のサービスに関するよくある質問 (FAQ) に回答します。Server Load Balancer (SLB) の IP アドレスにクラスター内からアクセスできない、既存の SLB インスタンスの再利用に失敗する、Cloud Controller Manager (CCM) のアップグレードに失敗した場合の対処方法など、一般的な問題の解決策を提供します。

インデックス

既存の SLB インスタンスの再利用に関するよくある質問

その他の質問

SLB 関連の質問

ACK クラスターにおける SLB インスタンスの具体的な目的

Kubernetes クラスターを作成する際に [Nginx Ingress] コンポーネントをインストールすると、クラスターはデフォルトで 2 つの SLB インスタンスを作成します。

2 つの SLB インスタンスは、次の目的を果たします。

  • API Server SLB: この SLB インスタンスは、API Server のアクセスエンドポイントです。クラスターへのすべてのアクセスリクエストは、この SLB インスタンスを通過する必要があります。TCP ポート 6443 でリッスンします。バックエンドサーバーは API Server Pod またはマスター ECS インスタンスです。

  • Nginx Ingress Controller SLB: この SLB インスタンスは、kube-system 名前空間の nginx-ingress-controller サービスに関連付けられています。vServer グループは、Nginx Ingress Controller Pod に動的にバインドされ、外部リクエストを負荷分散して転送します。TCP でポート 80 と 443 をリッスンします。

サービスの作成時に Local と Cluster の外部トラフィックポリシーをどのように選択するか

Local と Cluster の外部トラフィックポリシーは、異なるネットワークプラグインに対して異なる機能を提供します。Local と Cluster の外部トラフィックポリシーの違いの詳細については、「外部トラフィックポリシー」をご参照ください。

サービスと LoadBalancer の同期プロセスのイベントが表示されないのはなぜですか?

kubectl -n {your-namespace} describe svc {your-svc-name} コマンドを実行してもイベント情報が表示されない場合は、CCM コンポーネントのバージョンを確認してください。

  • v1.9.3.276-g372aa98-aliyun より前のバージョン: CCM コンポーネントは、サービスと LoadBalancer の同期に関するイベントを表示しません。コンポーネントをアップグレードしてください。CCM のバージョンを確認してアップグレードする方法の詳細については、「CCM コンポーネントのアップグレード」をご参照ください。

  • v1.9.3.276-g372aa98-aliyun 以降のバージョンでは、チケットを送信できます。

SLB インスタンスが作成中に保留状態のままになる場合の対処方法

  1. kubectl -n {your-namespace} describe svc {your-svc-name} コマンドを実行してイベント情報を表示します。

  2. イベントで報告されたエラーを解決します。イベント内のさまざまなエラーメッセージの処理方法については、「エラーイベントと解決策」をご参照ください。

    エラーメッセージが表示されない場合は、「サービスと LoadBalancer の同期プロセスのイベントが表示されないのはなぜですか?」をご参照ください。

SLB vServer グループが更新されない場合の対処方法

  1. kubectl -n {your-namespace} describe svc {your-svc-name} コマンドを実行してイベント情報を表示します。

  2. イベントで報告されたエラーを解決します。イベント内のさまざまなエラーメッセージの処理方法については、「エラーイベントと解決策」をご参照ください。

    エラーメッセージが表示されない場合は、「サービスと LoadBalancer の同期プロセスのイベントが表示されないのはなぜですか?」をご参照ください。

サービスのアノテーションが有効にならない場合の対処方法

  1. エラーメッセージを確認します。

    1. kubectl -n {your-namespace} describe svc {your-svc-name} コマンドを実行してイベント情報を表示します。

    2. イベントで報告されたエラーを解決します。イベント内のさまざまなエラーメッセージの処理方法については、「エラーイベントと解決策」をご参照ください。

  2. エラーメッセージが表示されない場合は、次のいずれかのシナリオに基づいて問題を解決します。

SLB インスタンスの構成が変更されたのはなぜですか?

CCM は宣言型 API を使用し、特定の条件下でサービス構成に基づいて SLB 構成を自動的に更新します。SLB コンソールで変更した構成は、上書きされるリスクがあります。アノテーションを使用して SLB インスタンスを構成することをお勧めします。アノテーションの使用方法の詳細については、「アノテーションを使用して Classic Load Balancer (CLB) インスタンスを構成する」をご参照ください。

重要

Kubernetes によって作成および維持されている SLB インスタンスの構成を SLB コンソールで手動で変更しないでください。変更すると、構成が失われ、サービスにアクセスできなくなる可能性があります。

SLB の IP アドレスにクラスター内からアクセスできないのはなぜですか?

  • シナリオ 1: サービスによって作成されていない SLB インスタンスにプライベート IP アドレスを使用している場合、クラスター内からのアクセスが失敗することがあります。この障害は、SLB インスタンスにアクセスしている Pod がバックエンド Pod と同じノードにある場合に発生します。

    レイヤー 4 のロードバランシングサービスでは、ECS インスタンスはバックエンドサーバーとサービスにアクセスするクライアントの両方として機能することはできません。この問題を解決し、クライアントと宛先が同じノード上にあることを防ぐには、次のいずれかの方法を使用します。

    • SLB の IP アドレスをパブリック IP アドレスに変更します。

    • サービスを使用して SLB インスタンスを作成し、外部トラフィックポリシーを Cluster に設定します。この場合、kube-proxy はクラスター内から SLB インスタンスに送信されるトラフィックをインターセプトし、SLB の制限をバイパスします。

  • シナリオ 2: サービスを公開するときに外部トラフィックポリシーを Local に設定しました。これにより、クラスター内から SLB の IP アドレスへのアクセスが失敗します。

    この問題の原因と解決策の詳細については、「LoadBalancer サービスによって公開された SLB アドレスに Kubernetes クラスター内からアクセスできない問題を解決するにはどうすればよいですか?」をご参照ください。

LoadBalancer サービスによって公開された SLB アドレスに Kubernetes クラスター内からアクセスできない問題を解決するにはどうすればよいですか?

問題の説明

Kubernetes クラスターでは、一部のノードはクラスターによって公開された Local の外部トラフィックポリシーを持つ SLB インスタンスにアクセスできますが、他のノードはアクセスできません。この問題は Ingress で頻繁に発生します。

原因

SLB インスタンスは externalTrafficPolicy: Local で構成されています。このポリシーでは、SLB アドレスは対応するバックエンド Pod をホストするノードからのみアクセス可能です。SLB アドレスは外部使用を目的としているため、クラスター内のノードまたは Pod がアクセスしようとすると、リクエストは SLB インスタンスに送信されません。代わりに、kube-proxy がリクエストをインターセプトし、ローカルのルーティングルール (iptables または IPVS) に基づいて転送します。

クライアント Pod が存在するノードがサービスのバックエンド Pod をホストしていない場合、ネットワーク接続は失敗します。ノードがバックエンド Pod をホストしている場合、サービスは期待どおりにアクセスできます。この問題の詳細については、「kube-proxy adds external-lb address to local node iptables rules」をご参照ください。

ソリューション

この問題を解決するには、次のいずれかの方法を使用できます。最初の方法を使用することをお勧めします。

  • Kubernetes クラスター内から ClusterIP アドレスまたはサービス名を使用して内部サービスにアクセスします。Ingress のサービス名は nginx-ingress-lb.kube-system です。

  • LoadBalancer サービスの externalTrafficPolicy を Cluster に変更します。この方法により、トラフィックがすべてのノード上の Pod に転送されることが保証されます。ただし、クラスターがソースネットワークアドレス変換 (SNAT) を実行するため、ソース IP アドレスが失われます。これは、バックエンドアプリケーションがクライアントの実際の IP アドレスを取得できないことを意味します。次のコマンドを実行して Ingress サービスを変更します。

    kubectl edit svc nginx-ingress-lb -n kube-system
  • ENI または ENI ごとに複数の IP アドレスを持つ Terway クラスターを使用している場合は、LoadBalancer サービスの externalTrafficPolicy を Cluster に変更し、annotation: service.beta.kubernetes.io/backend-type: "eni" などの ENI パススルー用のアノテーションを追加します。次のコードブロックはフォーマットを示しています。この方法では、ソース IP アドレスが保持され、クラスター内からのアクセスが可能になります。詳細については、「アノテーションを使用して Classic Load Balancer (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

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

SLB インスタンスを自動的に削除するポリシーは、SLB インスタンスが CCM によって自動的に作成されたかどうかによって異なります。次の表に、削除ポリシーを示します。

サービス操作

CCM によって自動的に作成された SLB インスタンス

再利用された SLB インスタンス

サービスの削除

SLB インスタンスは削除されます。

SLB インスタンスは保持されます。

サービスタイプを LoadBalancer から別のタイプに変更する

SLB インスタンスを削除する

SLB インスタンスは保持されます。

サービスを削除すると SLB インスタンスも削除されますか?

既存の SLB インスタンスを再利用する場合 (サービスに service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-slb-id} アノテーションがある場合)、サービスを削除しても SLB インスタンスは削除されません。それ以外の場合、サービスを削除すると、対応する SLB インスタンスも削除されます。

サービスタイプを変更した場合 (たとえば、LoadBalancer から NodePort へ)、CCM によって自動的に作成された対応する SLB インスタンスも削除されます。

重要

CCM によって自動的に作成された SLB インスタンスを再利用 SLB インスタンスに変更するためにサービスを手動で編集しないでください。これにより、サービスが自動的に作成された SLB インスタンスから関連付けが解除されます。サービスを削除しても、対応する SLB インスタンスは自動的に削除できません。

誤って SLB インスタンスを削除してしまった場合の対処方法

  • シナリオ 1: 誤って API Server SLB インスタンスを削除してしまった場合の対処方法

    インスタンスは回復できません。クラスターを再作成する必要があります。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。

  • シナリオ 2: 誤って Ingress SLB インスタンスを削除してしまった場合の対処方法

    次の手順では、Nginx Ingress を例として、SLB インスタンスを再作成する方法を示します。

    1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、[ネットワーク] > [サービス] を選択します。

    3. [サービス] ページの上部で、[名前空間] ドロップダウンリストから [kube-system] を選択します。

      1. サービスリストで、ターゲットサービス nginx-ingress-lb を見つけ、[アクション] 列の [YAML 編集] をクリックし、status.loadBalancer フィールドとその内容を削除してから、[OK] をクリックして CCM に SLB の再構築をトリガーさせます。

      2. サービスリストに nginx-ingress-lb が表示されない場合は、ページの左上隅にある [YAML から作成] をクリックし、次のテンプレートを使用して nginx-ingress-lb という名前のサービスを作成します。

        apiVersion: v1
        kind: Service
        metadata:
          labels:
            app: nginx-ingress-lb
          name: nginx-ingress-lb
          namespace: kube-system
        spec:
          externalTrafficPolicy: Local
          ports:
          - name: http
            port: 80
            protocol: TCP
            targetPort: 80
          - name: https
            port: 443
            protocol: TCP
            targetPort: 443
          selector:
            app: ingress-nginx
          type: LoadBalancer
  • シナリオ 3: 誤ってアプリケーション固有の SLB インスタンスを削除してしまった場合の対処方法

    • SLB インスタンスに対応するサービスが不要になった場合は、サービスを削除します。

    • 対応するサービスがまだ使用中の場合は、次の手順を実行します。

      1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

      2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、[ネットワーク] > [サービス] を選択します。

      3. [サービス] ページの上部にある [名前空間] ドロップダウンリストから、[すべての名前空間] をクリックし、サービスリストでサービスを見つけます。

      4. ターゲットサービスの [アクション] 列で、[YAML 編集] をクリックし、[status] の内容を削除して、[更新] をクリックして CCM に SLB の再構築を許可します。

古い CCM バージョンで SLB の名前変更を有効にする方法

Cloud Controller Manager (CCM) v1.9.3.10 以降で作成された SLB インスタンスは、名前変更をサポートするために自動的にタグ付けされます。v1.9.3.10 以前のバージョンで作成された SLB インスタンスについては、名前変更を有効にするために特定のタグを手動で追加する必要があります。

説明
  • 名前変更を有効にするためのタグの手動追加は、CCM v1.9.3.10 以前で作成された SLB インスタンスにのみ必要です。

  • サービスタイプは LoadBalancer である必要があります。

  1. Kubernetes クラスターのマスターノードにログインします。詳細については、「kubectl を使用して ACK クラスターに接続する」をご参照ください。

  2. kubectl get svc -n ${namespace} ${service} コマンドを実行して、サービスタイプと IP アドレスを表示します。service type

    説明

    namespaceservice をクラスターの名前空間とサービス名に置き換えてください。

  3. 次のコマンドを実行して、SLB インスタンスに必要なタグを生成します。

    kubectl get svc -n ${namespace} ${service} -o jsonpath="{.metadata.uid}"|awk -F "-" '{print "kubernetes.do.not.delete: "substr("a"$1$2$3$4$5,1,32)}'

    tag

  4. Server Load Balancer コンソールにログインします。ステップ 2 で取得した IP アドレスに基づいて、対応するリージョンで SLB インスタンスを検索します。

  5. ステップ 3 で生成されたキーと値を使用して、SLB インスタンスにタグを追加します。キーと値は、前の図の 1 と 2 に対応します。詳細については、「CLB インスタンスの作成と管理」をご参照ください。

Local モードでノードの重みはどのように自動設定されますか?

このセクションでは、アプリケーション Pod (app=nginx) が 3 つの ECS インスタンスにデプロイされ、サービス A を介して公開されるシナリオを使用して、Local モードでのノードの重みの計算方法を説明します。

CCM2

バージョン v1.9.3.276-g372aa98-aliyun 以降

重み計算の精度問題により、Pod 間でわずかな負荷の不均衡が発生する可能性があります。CCM v1.9.3.276-g372aa98-aliyun 以降では、CCM はノードの重みをノードにデプロイされた Pod の数に設定します。次の図に示すように、3 つの ECS インスタンスの重みは 1、2、3 です。トラフィックは 1:2:3 の比率で 3 つの ECS インスタンスに分散され、Pod 間の負荷がより均等になります。

数式は次のとおりです。node weight

node

v1.9.3.164-g2105d2e-aliyun より後で v1.9.3.276-g372aa98-aliyun より前のバージョン

次の図に示すように、CCM バージョン v1.9.3.164-g2105d2e-aliyun より後で v1.9.3.276-g372aa98-aliyun より前の場合、CCM はノードにデプロイされた Pod の数に基づいてノードの重みを計算します。3 つの ECS インスタンスの計算された重みは 16、33、50 です。したがって、トラフィックは 3 つの ECS インスタンスに約 1:2:3 の比率で分散され、Pod 間の負荷がより均等になります。

数式は次のとおりです。calculation formula

ccm4

v1.9.3.164-g2105d2e-aliyun より前のバージョン

次の図に示すように、v1.9.3.164-g2105d2e-aliyun より前のバージョンでは、Local モードのサービスのすべてのバックエンドサーバーの重みは 100 です。これは、トラフィックが 3 つの ECS インスタンスに均等に分散されることを意味します。これにより、ECS 1 の Pod には重い負荷がかかり、ECS 3 の Pod には軽い負荷がかかり、Pod 間の負荷が不均衡になります。

CCM3

クラスター内のすべての SLB インスタンスの IP アドレス、名前、タイプを照会する方法?

  1. kubectl を使用して ACK クラスターに接続する

  2. 次のコマンドを実行して、すべての名前空間にある各 LoadBalancer サービスの名前、IP アドレス、およびアドレスタイプを取得します。

    kubectl get services -A -ojson | jq '.items[] | select(.spec.type == "LoadBalancer") | {name: .metadata.name, namespace: .metadata.namespace, ip: .status.loadBalancer.ingress[0].ip, lb_type: .metadata.annotations."service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"}'

    次の出力が期待されます。

    {
      "name": "test",
      "namespace": "default",
      "ip": "192.168.*.*",
      "lb_type": "intranet"
    }
    {
      "name": "nginx-ingress-lb",
      "namespace": "kube-system",
      "ip": "47.97.*.*",
      "lb_type": "null"
    }

LoadBalancer サービスのバックエンドサーバーが置き換えられたときに、LoadBalancer が既存の接続を正常に閉じるようにする方法?

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain および service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout アノテーションを使用して、接続ドレインを構成できます。バックエンドサーバーがサービスから削除された後、LoadBalancer は drain-timeout 期間内に既存の接続を処理し続けます。詳細については、「リスナーの接続ドレインを有効にする」をご参照ください。

既存の SLB インスタンスの再利用に関するよくある質問

既存の SLB インスタンスの再利用に失敗するのはなぜですか?

  • CCM のバージョンを確認してください。v1.9.3.105-gfd4e547-aliyun より前の CCM バージョンは、SLB インスタンスの再利用をサポートしていません。CCM のバージョンを確認してアップグレードする方法の詳細については、「CCM コンポーネントのアップグレード」をご参照ください。

  • 再利用したい SLB インスタンスがクラスターによって作成されたものかどうかを確認してください。クラスターによって作成された SLB インスタンスは再利用できません。

  • SLB インスタンスが API Server 用の SLB インスタンスであるかどうかを確認してください。API Server 用の SLB インスタンスは再利用できません。

  • プライベート向け SLB インスタンスを再利用したい場合は、SLB インスタンスとクラスターが同じ VPC にあることを確認してください。VPC をまたいで SLB インスタンスを再利用することはできません。

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

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners アノテーションが "true" に設定されているかどうかを確認してください。このアノテーションが構成されていない場合、リスナーは自動的に作成されません。

説明

デフォルトでは、既存の CLB インスタンスを再利用しても、次の理由によりリスナーは上書きされません。

  • 既存の CLB インスタンスのリスナーがサービスにバインドされている場合、強制的に上書きするとサービスの中断が発生する可能性があります。

  • CCM は限られたバックエンド構成しかサポートしておらず、複雑な構成を処理できません。複雑なバックエンド構成要件がある場合は、既存のものを上書きせずにコンソールでリスナーを構成できます。

これらの理由から、リスナーを強制的に上書きしないことをお勧めします。既存の CLB インスタンスのリスナーポートが使用されなくなった場合は、リスナーを強制的に上書きできます。

その他の質問

CCM のアップグレードに失敗した場合の対処方法

CCM コンポーネントのアップグレードに失敗した場合の解決方法の詳細については、「Cloud Controller Manager (CCM) のアップグレードチェックが失敗する」をご参照ください。

サービスのエラーメッセージと解決策

次の表に、さまざまなエラーメッセージの解決策を示します。

エラーメッセージ

説明と解決策

The backend server number has reached the quota limit of this load balancer

CLB インスタンスのバックエンドサーバーの数がクォータ制限に達しました。

解決策: 次のいずれかの方法でクォータの使用量を最適化します。

  • デフォルトでは、CLB インスタンスには最大 200 台のバックエンドサーバーをアタッチできます。クォータの引き上げをリクエストできます。クォータを照会して引き上げるには、SLB クォータ管理ページにログインします。

  • CLB インスタンスの外部トラフィックポリシーを externalTrafficPolicy: Local を設定して Local モードに設定します。Cluster モードはクォータを急速に消費します。Cluster モードを使用する場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label ラベルを使用して使用する仮想サーバーを指定します。これにより、クォータの消費が削減されます。アノテーションを使用してバックエンド仮想サーバーをラベルに関連付ける方法の詳細については、「アノテーションを使用して Classic Load Balancer (CLB) インスタンスを構成する」をご参照ください。

  • 複数のサービスが CLB インスタンスを再利用する場合、バックエンドサーバーの数は累積されます。サービスを作成するときに新しい CLB インスタンスを作成します。

The load balancer does not support backend servers of the ENI type

共有 CLB インスタンスは ENI をサポートしていません。

解決策: CLB バックエンドが ENI を使用する場合、パフォーマンス専有型 CLB インスタンスを選択する必要があります。サービスに annotation: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" アノテーションを追加できます。

重要

アノテーションが CCM バージョンと互換性があることを確認してください。アノテーションと CCM バージョンのマッピングの詳細については、「アノテーションを使用して Classic Load Balancer (CLB) インスタンスを構成する」をご参照ください。

There are no available nodes for the LoadBalancer

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

解決策:

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

  • 関連付けられた Pod が異常な場合は、Pod の問題を特定して解決します。詳細については、「Pod の問題のトラブルシューティング」をご参照ください。

  • CLB インスタンスにバックエンドサーバーがなく、Pod が期待どおりに実行されている場合は、Pod がマスターノード上にあるかどうかを確認してください。その場合は、アプリケーション Pod をワーカーノードに退避させます。

  • alicloud: unable to find the load balancer named [%s] in OpenAPI, but it is defined in service.loadbalancer.ingress. This may happen when you remove the loadbalancerid annotation.

  • alicloud: cannot find the load balancer, but it is defined in service

サービスに基づいて CLB インスタンスを関連付けることができません。

解決策: Server Load Balancer コンソールにログインします。サービスが存在するリージョンで、サービスの EXTERNAL-IP に基づいて CLB インスタンスを検索します。

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

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

    1. CLB インスタンスが CLB コンソールで手動で作成された場合は、サービスに service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを追加します。詳細については、「アノテーションを使用して Classic Load Balancer (CLB) インスタンスを構成する」をご参照ください。

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

ORDER.ARREARAGE Message: The account is in arrears.

アカウントに支払い遅延があります。

PAY.INSUFFICIENT_BALANCE Message: Your account does not have a sufficient balance.

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

Status Code: 400 Code: Throttlingxxx

CLB OpenAPI がスロットリングされています。

解決策:

  1. SLB クォータ管理ページにログインして、CLB クォータが十分であることを確認します。

  2. 次のコマンドを実行して、クラスターサービスにエラーがあるかどうかを確認します。エラーが存在する場合は、この表で説明されているようにイベントを解決します。

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

Status Code: 400 Code: RspoolVipExist Message: There are VIPs associated with this vServer group.

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

解決策:

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

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

  2. CLB コンソールで、サービスの port に対応するリスナーを削除します。CLB リスナーを削除する方法の詳細については、「リスナー転送ルールの構成」をご参照ください。

Status Code: 400 Code: NetworkConflict

このエラーは、クラスターと同じ VPC にない内部向け CLB インスタンスを再利用した場合に発生します。

解決策: CLB インスタンスとクラスターが同じ VPC にあることを確認してください。

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

vSwitch の利用可能な IP アドレスの数が不足しています。

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

The specified Port must be between 1 and 65535.

ENI モードは、targetPort の文字列値をサポートしていません。

解決策: サービス YAML ファイルの targetPort フィールドの値を整数に変更するか、CCM をアップグレードします。CCM のアップグレード方法の詳細については、「CCM コンポーネントのアップグレード」をご参照ください。

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

古いバージョンの CCM はデフォルトで共有 CLB インスタンスを作成しますが、共有 CLB インスタンスは廃止されました。

解決策: CCM コンポーネントをアップグレードします

cannot change ResourceGroupId once created

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

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

cannot find the ENI ID for IP x.x.x.x in VPC vpc-xxxx

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

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

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

  • The user does not have permission to modify InstanceChargeType to spec.

CLB インスタンスの課金方法を従量課金から仕様別課金に変更することはできません。

解決策:

  • サービスから service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec アノテーションを削除します。

  • サービスに service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type アノテーションが含まれている場合は、その値を PayByCLCU に設定します。

SyncLoadBalancerFailed: The load balancer xxx cannot be reused. Cannot reuse a load balancer created by Kubernetes.

このエラーは、CCM によって作成された CLB インスタンスが再利用されるときに発生します。

解決策:

  1. サービス YAML ファイルの service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションに対応する CLB ID を表示します。

  2. サービスの状態に基づいてエラーを解決します。

    • サービスが保留状態の場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションの CLB ID を、Classic Load Balancer (CLB) コンソールで手動で作成した CLB インスタンスの ID に置き換えます。

    • サービスが保留状態でない場合は、次の手順を実行します。

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

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

alicloud: cannot change LoadBalancer AddressType once created. Delete and retry.

CLB インスタンスの作成後、そのタイプは変更できません。このエラーは、サービスを作成した後に CLB タイプを変更した場合に発生します。

解決策: サービスを削除して再作成します。

The load balancer lb-xxxxx cannot be reused. The service has been associated with the IP address [xxx.xxx.xxx.xxx] and cannot be bound to the IP address [xxx.xxx.xxx.xxx].

サービスはすでに CLB インスタンスにアタッチされており、別のインスタンスにアタッチすることはできません。

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

NodePort サービスのリスナーを構成する方法

CCM は LoadBalancer サービスのリスナーの構成のみをサポートしています。サービスタイプを NodePort から LoadBalancer に変更する必要があります。

NodePort サービスにアクセスする方法

  • クラスター内 (クラスターノード上) からサービスにアクセスするには、ClusterIP + Port または Node IP + Service NodePort を使用できます。NodePort サービスによって公開されるデフォルトのポート番号は 30000 より大きいです。

  • クラスター外 (クラスターノード外) からサービスにアクセスするには、ノードの IP アドレスとサービスの NodePort を使用できます。NodePort サービスによって公開されるデフォルトのポート番号は 30000 より大きいです。

  • VPC の外部 (別の VPC またはインターネットから) からサービスにアクセスするには、LoadBalancer サービスを公開し、その外部エンドポイントを介してサービスにアクセスする必要があります。

    説明

    サービスの外部トラフィックポリシーを Local に設定した場合は、アクセスするノードがサービスのバックエンド Pod をホストしていることを確認してください。外部トラフィックポリシーの詳細については、「外部トラフィックポリシー」をご参照ください。

NodePort の範囲を正しく構成する方法

Kubernetes では、API Server は ServiceNodePortRange パラメーター ( --service-node-port-range コマンドラインパラメーター) を提供します。このパラメーターは、NodePort または LoadBalancer サービスがリッスンできる NodePort の範囲を制限します。デフォルト値は 30000 から 32767 です。ACK Pro マネージドクラスターでは、コントロールプレーンのパラメーターをカスタマイズすることで、このポート範囲を変更できます。詳細については、「ACK Pro マネージドクラスターのコントロールプレーンのパラメーターをカスタマイズする」をご参照ください。

  • NodePort の範囲を変更する際は、細心の注意を払う必要があります。NodePort の範囲が、クラスターノード上の net.ipv4.ip_local_port_range カーネルパラメーターで指定されたポート範囲と競合しないことを確認してください。ip_local_port_range カーネルパラメーターは、Linux システム上の任意のアプリケーションが使用できるローカルポート番号の範囲を制御します。ip_local_port_range のデフォルト値は 32768 から 60999 です。

  • ACK クラスターのデフォルト構成では、ServiceNodePortRange パラメーターと ip_local_port_range パラメーターは競合しません。以前にこれらのパラメーターのいずれかを調整してポート制限を増やし、それらの範囲が重複するようになった場合、ノードで散発的なネットワーク例外が発生する可能性があります。深刻な場合、これはビジネスのヘルスチェックの失敗やクラスターノードのオフラインにつながる可能性があります。デフォルト値に戻すか、両方のポート範囲を調整してまったく重複しないようにすることをお勧めします。

  • ポート範囲を調整した後、クラスター内の一部の NodePort または LoadBalancer サービスが、ip_local_port_range パラメーターの範囲内のポートを NodePort として使用し続けている可能性があります。競合を避けるために、これらのサービスを再構成する必要があります。kubectl edit <service-name> コマンドを実行して、spec.ports.nodePort フィールドの値を未使用の NodePort に直接変更できます。

ACK 専用クラスターで CCM コンポーネントを新しいバージョンにアップグレードする際に必要な権限を追加する方法

パフォーマンスを向上させるために、CCM の新しいバージョンでは、追加の RAM 権限を必要とする Alibaba Cloud API が徐々に導入されています (たとえば、Flannel ネットワークのルート管理用の v2.11.2 や NLB のバッチ管理用の v2.12.1)。

したがって、ACK 専用クラスターでコンポーネントを v2.11.2 以降にアップグレードする場合は、アップグレード前にその RAM ロールに必要な権限を付与して、コンポーネントが期待どおりに動作するようにする必要があります。

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、ターゲットクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、クラスター情報 をクリックします。

  3. [基本情報] タブをクリックします。[クラスターリソース] エリアで、[マスター RAM ロール] のロール名をクリックします。

  4. Resource Access Management コンソールのロール詳細ページで、[権限管理] をクリックし、ポリシーリストで k8sMasterRolePolicy-Ccm- で始まるカスタムポリシーを見つけ、ポリシー名をクリックしてアクセスポリシー管理ページに移動します。

    以前に作成されたクラスターの場合、ポリシーが存在しない可能性があります。k8sMasterRolePolicy- で始まる名前のカスタムポリシーを選択できます。

  5. [ポリシーの編集] をクリックし、NLB 権限に nlb:ListAsynJobs 権限を追加します。

    image

Flannel クラスターを使用している場合は、VPC 関連の権限に vpc:CreateRouteEntriesvpc:DeleteRouteEntries 権限も追加する必要があります。

p976639

権限を追加した後、ページ上のプロンプトに従ってポリシーを送信します。変更が保存されたら、CCM コンポーネントをアップグレードできます。