ACS クラスターにおける LoadBalancer Service の問題を診断・解決する方法について説明します。
背景情報
Type=LoadBalancer の Service を作成すると、ACS Cloud Controller Manager (CCM) が自動的に SLB インスタンス、リスナー、バックエンドサーバーグループなどの SLB リソースを作成および構成します。SLB の自動更新ポリシーの詳細については、「LoadBalancer Service の構成に関する注意事項」をご参照ください。
操作手順
CCM のバージョンが 1.9.3.276-g372aa98-aliyun 以降であることを確認してください。CCM の更新。CCM のリリースノート:Cloud Controller Manager。

-
次のコマンドを実行して、SLB インスタンスに関連付けられた Service を検索します。
kubectl get svc -A |grep -i LoadBalancer|grep ${XXX.XXX.XXX.XXX} #XXX.XXX.XXX.XXX は SLB インスタンスの IP アドレスです。 -
次のコマンドを実行して、Service のエラーイベントを確認します。
kubectl -n {your-namespace} describe svc {your-svc-name}重要エラーイベントが表示されない場合は、CCM のバージョンが 1.9.3.276-g372aa98-aliyun 以降であることを再度確認してください。CCM の更新。
-
エラーイベントが存在する場合は、「Service のエラーと対処方法」をご参照ください。
-
エラーイベントが存在しない場合は、「トラブルシューティング」の手順に従ってください。
-
-
問題が解決しない場合は、ACS DingTalk サポートグループにお問い合わせください。
Service のエラーと対処方法
以下の表に、一般的な Service のエラーとその対処方法を示します。
|
エラーメッセージ |
説明と対処方法 |
|
|
共有リソース SLB インスタンスは ENI タイプのバックエンドサーバーをサポートしていません。 対処方法:ENI バックエンドサーバーを使用するには、Service に 重要
アノテーションがご利用の CCM バージョンと一致していることを確認してください。各バージョンでサポートされているアノテーションの一覧は、「Service の YAML ファイルにアノテーションを追加して CLB インスタンスを構成する」をご参照ください。 |
|
|
SLB インスタンスに関連付けられたバックエンドサーバーがありません。Pod が Service に関連付けられており、正常に実行されているか確認してください。 対処方法:
|
|
Service に関連付けられた SLB インスタンスが見つかりません。 対処方法:SLB コンソール にログインし、Service のリージョン内で
|
|
|
ご利用のアカウントに支払い遅延があります。 |
|
|
アカウント残高が不足しています。 |
|
|
SLB の API 速度制限がトリガーされました。 対処方法:
|
|
|
vServer グループに関連付けられたリスナーを削除できません。 対処方法:
|
|
|
再利用されたイントラネット SLB インスタンスとクラスターが同じ VPC にありません。 対処方法:SLB インスタンスとクラスターが同じ VPC にデプロイされていることを確認してください。 |
|
|
vSwitch に利用可能な IP アドレスがありません。 対処方法:同じ VPC 内の別の vSwitch を指定するために、 |
|
|
ENI モードでは、 対処方法:Service の YAML ファイルで |
|
|
古いバージョンの CCM では、デフォルトで共有リソース SLB インスタンスが作成されますが、このタイプのインスタンスは現在購入できません。 対処方法:CCM の更新。 |
|
|
SLB インスタンス作成後にリソースグループを変更することはできません。 対処方法:Service から |
|
|
VPC 内に指定された ENI の IP アドレスが見つかりません。 対処方法: |
|
Service で使用されている SLB インスタンスの課金方法を従量課金からスペック課金に変更することはできません。 対処方法:
|
|
|
CCM によって作成された SLB インスタンスが再利用されています。 対処方法:
|
|
|
SLB インスタンスの種類は作成後に変更できません。 対処方法:関連する Service を再作成します。 |
|
|
すでに別の SLB インスタンスに関連付けられている Service に、SLB インスタンスを関連付けることはできません。 対処方法: |
トラブルシューティング
以下の表に、一般的なトラブルシューティングのシナリオとその対処方法を示します。
|
カテゴリ |
問題 |
対処方法 |
|
SLB インスタンスへのアクセス時に発生する問題 |
SLB インスタンスがトラフィックを均等に分散しません。 |
|
|
アプリケーションの更新中に SLB インスタンスにアクセスすると 503 エラーが発生します。 |
||
|
クラスター内から SLB インスタンスにアクセスできません。 |
LoadBalancer Service に関連付けられた SLB インスタンスの IP アドレスにクラスター内からアクセスできない |
|
|
クラスター外から SLB インスタンスにアクセスできません。 |
||
|
HTTPS ポートにリクエストを送信すると、 |
||
|
SLB 構成に関する問題 |
Service のアノテーションが有効になりません。 |
|
|
SLB インスタンスの構成が変更されました。 |
||
|
既存の SLB インスタンスを再利用できません。 |
||
|
既存の SLB インスタンスを再利用してもリスナーが作成されません。 |
||
|
Service のエンドポイントが SLB インスタンスのバックエンドサーバーに指定されたものと異なります。 |
||
|
SLB 削除に関する問題 |
SLB インスタンスが削除されました。 |
|
|
SLB インスタンスが Service と一緒に削除されません。 |
SLB インスタンスがトラフィックを均等に分散しない
原因
SLB インスタンスのスケジューリングアルゴリズムが適切ではありません。
症状
SLB インスタンスのバックエンドサーバーにトラフィックが均等に分散されません。
対処方法
-
Service に長時間接続が確立されている場合は、
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"アノテーションを追加して、SLB インスタンスのスケジューリングアルゴリズムを Weighted Least Connections (WLC) に設定します。
アプリケーションの更新中に SLB インスタンスにアクセスすると 503 エラーが発生する
原因
SLB リスナーに接続ドレインが設定されていないか、Pod にグレースフルシャットダウンが設定されていません。
症状
アプリケーションの更新中に SLB インスタンスにアクセスすると 503 エラーが発生します。
対処方法
-
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainアノテーションを追加して、SLB リスナーの接続ドレインを設定します。アノテーションの詳細については、「リスナーの一般的な操作」をご参照ください。 -
Pod のネットワークモードに基づいて、
preStopおよびreadinessProbeパラメーターを Pod に設定します。-
readinessProbeはコンテナがトラフィックを受け入れる準備ができているかをチェックします。readiness プローブに合格した後、Pod はエンドポイントに追加され、SLB インスタンスにアタッチされます。readinessProbeのプロービング間隔、遅延期間、異常しきい値を適切に設定してください。起動時間が長いアプリケーションでは、しきい値が短すぎると繰り返し再起動が発生する可能性があります。 -
preStopを、Pod が残りのリクエストを処理するために必要な時間に設定します。terminationGracePeriodSecondsは、preStopより少なくとも 30 秒長く設定します。
Pod の構成例:
apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: containers: - name: nginx image: nginx # Liveness probe livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 80 timeoutSeconds: 1 # Readiness probe readinessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 80 timeoutSeconds: 1 # Graceful shutdown lifecycle: preStop: exec: command: - sleep - "30" terminationGracePeriodSeconds: 60 -
クラスター外から SLB インスタンスにアクセスできない
原因
SLB インスタンスに ACL ルールが設定されているか、SLB インスタンスが正常に動作していません。
症状
クラスター外から SLB インスタンスにアクセスできません。
対処方法
-
次のコマンドを実行して Service のイベントを照会し、エラーをトラブルシューティングします。「Service のエラーと対処方法」。
kubectl -n {your-namespace} describe svc {your-svc-name} -
SLB インスタンスに ACL ルールが設定されているか確認します。
ACL ルールが設定されている場合は、クライアントの IP アドレスが許可されているか確認します。ACL の構成詳細については、「アクセス制御」をご参照ください。
-
SLB インスタンスが vServer グループに関連付けられているか確認します。
vServer グループが関連付けられていない場合は、アプリケーションポッドが Service に関連付けられており、正常に実行されているか確認します。Pod が正常に実行されていない場合は、トラブルシューティングを実施してください。Pod のトラブルシューティング。
-
SLB リスナーによって異常なバックエンドサーバーが検出されているか確認します。
異常なバックエンドサーバーが検出されている場合は、アプリケーションポッドが正常に実行されているか確認します。SLB のヘルスチェックの詳細については、「ヘルスチェックスクリプトの実行」をご参照ください。
-
問題が解決しない場合は、ACS DingTalk サポートグループにお問い合わせください。
バックエンドの HTTPS サービスにアクセスできない
原因
SLB インスタンスに証明書を指定すると、SLB インスタンスは HTTPS リクエストを復号し、HTTP リクエストをバックエンドの Pod に転送します。
症状
バックエンドの HTTPS サービスにアクセスできません。
対処方法
Service の targetPort を HTTP ポートに設定します。たとえば、次の NGINX Service では 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:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: https
port: 443
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer