このトピックでは、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」をご参照ください。
次のコマンドを実行して、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.
次のコマンドを実行して、サービスエラーに対してイベントが生成されるかどうかを確認します。
kubectl -n {your-namespace} describe svc {your-svc-name}
重要サービスエラーに対してイベントが生成されない場合は、CMMのバージョンが1.9.3.276 g372aa98-aliyun以降であるかどうかを確認します。 CCMの更新方法の詳細については、「CCMの更新」をご参照ください。
サービスエラーに対してイベントが生成される場合は、「サービスエラーと解決策」をご参照ください。
サービスエラーに対してイベントが生成されない場合は、「トラブルシューティング」をご参照ください。
問題が解決しない場合は、チケットの送信します。
サービスエラーと解決策
次の表に、サービスで発生したエラーを修正する方法を示します。
エラーメッセージ | 説明とソリューション |
| バックエンドサーバーのクォータが不足しています。 解決策: この問題を解決するには、次の方法を使用できます。
|
| 共有リソースCLBインスタンスは、elastic network Interface (ENI) をサポートしていません。 解決策: ENIをバックエンドサーバーとして指定する場合は、高性能CLBインスタンスを作成します。 重要 追加する注釈がCCMバージョンの要件を満たしていることを確認してください。 アノテーションとCCMバージョンの相関関係の詳細については、「CLBインスタンスを構成するためのサービスのYAMLファイルへのアノテーションの追加」をご参照ください。 |
| バックエンドサーバーはCLBインスタンスに関連付けられていません。 ポッドがサービスに関連付けられているかどうか、およびポッドが期待どおりに実行されるかどうかを確認します。 解決策:
|
| システムは、サービスをCLBインスタンスに関連付けることができません。 解決方法: SLBコンソールにログインし、
|
| アカウントで延滞が発生している場合。 |
| アカウントの残高が不足しています。 |
| CLBインスタンスに対してAPIスロットリングがトリガーされます。 解決策:
|
| vServerグループに関連付けられているリスナーは削除できません。 解決策:
|
| 再利用された内部向けCLBインスタンスとクラスターは、同じ仮想プライベートクラウド (VPC) にデプロイされていません。 解決策: CLBインスタンスとクラスターが同じVPCにデプロイされていることを確認します。 |
| vSwitchのアイドルIPアドレスが不足しています。 解決策: |
|
解決策: Service YAMLファイルの |
| デフォルトでは、旧バージョンのCCMは自動的に共有リソースCLBインスタンスを作成し、購入できなくなりました。 解決策: CCMの更新。 |
| リソースグループの作成後、CLBインスタンスのリソースグループを変更することはできません。 解決策: |
| ENIの指定されたIPアドレスがVPCに見つかりません。 解決策: |
| サービスで使用されるClassic Load Balancer (CLB) インスタンスの課金方法を従量課金から従量課金に変更することはできません。 解決策:
|
| CCMによって作成されたCLBインスタンスは再利用されます。 解決策:
|
| 作成後にCLBインスタンスのタイプを変更することはできません。 解決策: 関連するサービスを再作成します。 |
| CLBインスタンスを、すでに別のCLBインスタンスに関連付けられているサービスに関連付けることはできません。 解決策: |
トラブルシューティング
次の表に示す情報を参照して、サービスエラー以外のエラーのトラブルシューティングを行うことができます。
カテゴリ | 問題 | 解決策 |
CLBインスタンスにアクセスするときに発生する問題 | CLBインスタンスはトラフィックを均等に分散しません。 | |
アプリケーションの更新中にCLBインスタンスにアクセスすると、503エラーが発生します。 | ||
クラスター内からCLBインスタンスにアクセスすることはできません。 | ||
クラスターの外部からCLBインスタンスにアクセスすることはできません。 | ||
リクエストがHTTPSポートに送信されると、 | ||
CLB設定に関連する問題 | サービスの注釈は有効になりません。 | |
CLBインスタンスの設定が変更されました。 | ||
既存のCLBインスタンスを再利用できません。 | ||
既存のCLBインスタンスを再利用する場合、リスナーは作成されません。 | ||
サービスのエンドポイントは、SLBインスタンスのバックエンドサーバーに指定されたエンドポイントとは異なります。 | ||
CLB削除に関連する問題 | CLBインスタンスが削除されました。 | |
CLBインスタンスはサービスとともに削除されません。 |
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エラーが発生します。
解決策
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain
アノテーションを追加して、CLBリスナーの接続ドレインを設定します。 注釈の詳細については、「リスナーを管理する一般的な操作」をご参照ください。ポッドのネットワークモードに基づいて、ポッドの
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インスタンスにアクセスすることはできません。
解決策
次のコマンドを実行して、サービスイベントを照会し、エラーをトラブルシューティングします。 詳細については、「サービスエラーと解決策」をご参照ください。
kubectl -n {your-namespace} describe svc {your-svc-name}
CLBインスタンスにACLルールが設定されているかどうかを確認します。
CLBインスタンスにACLルールが設定されている場合は、クライアントIPアドレスがCLBインスタンスにアクセスできるかどうかを確認します。 CLBインスタンスのACLルールを設定する方法の詳細については、「アクセス制御」をご参照ください。
CLBインスタンスがvServerグループに関連付けられているかどうかを確認します。
vServerグループが関連付けられていない場合は、アプリケーションポッドがサービスに関連付けられているかどうか、およびアプリケーションポッドが通常どおり実行されているかどうかを確認します。 アプリケーションポッドが正常に実行されない場合は、原因を特定してエラーのトラブルシューティングを行います。 詳細については、「ポッドのトラブルシューティング」をご参照ください。
異常なバックエンドサーバーがCLBリスナーによって検出されたかどうかを確認します。
異常なバックエンドサーバーが検出された場合は、アプリケーションポッドが正常に実行されているかどうかを確認します。 CLBのヘルスチェックの詳細については、「ヘルスチェックスクリプトの実行」をご参照ください。
問題が解決しない場合は、チケットの送信します。
バックエンド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