このトピックでは、LoadBalancerサービスの診断手順とエラーのトラブルシューティング方法について説明します。
背景情報
Type=LoadBalancer
タイプのサービスを作成すると、Alibaba Cloud Container Compute Service (ACS) のクラウドコントローラーマネージャー (CCM) は、SLBインスタンス、リスナー、バックエンドサーバーグループを含む、サービスのサーバーロードバランサー (SLB) リソースを自動的に作成または構成します。SLBリソースの自動更新に使用されるポリシーの詳細については、LoadBalancerサービスを構成する際の考慮事項 を参照してください。
手順
トラブルシューティングを行う前に、CCMバージョンが1.9.3.276-g372aa98-aliyun以降であることを確認してください。CCMの更新方法の詳細については、CCMの更新 を参照してください。CCMのリリースノートの詳細については、クラウドコントローラーマネージャー を参照してください。
次のコマンドを実行して、SLBインスタンスに関連付けられているサービスをクエリします。
kubectl get svc -A |grep -i LoadBalancer|grep ${XXX.XXX.XXX.XXX} #XXX.XXX.XXX.XXX はSLBインスタンスのIPアドレスです。
次のコマンドを実行して、サービスエラーのイベントが生成されているかどうかを確認します。
kubectl -n {your-namespace} describe svc {your-svc-name}
重要サービスエラーのイベントが生成されていない場合は、CMMバージョンが1.9.3.276-g372aa98-aliyun以降であることを確認してください。CCMの更新方法の詳細については、CCMの更新 を参照してください。
サービスエラーのイベントが生成されている場合は、サービスエラーと解決策 を参照してください。
サービスエラーのイベントが生成されていない場合は、トラブルシューティング を参照してください。
エラーが解決しない場合は、ACS DingTalkグループに参加してテクニカルサポートを受けてください。
サービスエラーと解決策
次の表に、サービスで発生するエラーの修正方法を示します。
エラーメッセージ | 説明と解決策 |
| 共有リソースSLBインスタンスは、Elastic Network Interface (ENI) をサポートしていません。 解決策:ENIをバックエンドサーバーとして指定する場合は、高性能SLBインスタンスを作成します。 重要 追加するアノテーションがCCMバージョンの要件を満たしていることを確認してください。アノテーションとCCMバージョンの相関関係については、サービスのYAMLファイルにアノテーションを追加してCLBインスタンスを構成する を参照してください。 |
| SLBインスタンスにバックエンドサーバーが関連付けられていません。Podがサービスに関連付けられているかどうか、およびPodが正常に実行されているかどうかを確認してください。 解決策:
|
| システムがサービスをSLBインスタンスに関連付けることができません。 解決策:SLBコンソール にログインし、
|
| アカウントに延滞料金があります。 |
| アカウントの残高が不足しています。 |
| SLBのAPIスロットリングがトリガーされています。 解決策:
|
| vServerグループに関連付けられているリスナーを削除できません。 解決策:
|
| 再利用された内部向けSLBインスタンスとクラスターが同じVirtual Private Cloud (VPC) にデプロイされていません。 解決策:SLBインスタンスとクラスターが同じVPCにデプロイされていることを確認してください。 |
| vSwitchのアイドルIPアドレスが不足しています。 解決策: |
|
解決策:サービスYAMLファイルの |
| デフォルトでは、以前のバージョンのCCMは、購入できなくなった共有リソースSLBインスタンスを自動的に作成します。 解決策:CCMを更新 します。 |
| リソースグループの作成後、SLBインスタンスのリソースグループを変更することはできません。 解決策: |
| 指定されたENIのIPアドレスがVPCに見つかりません。 解決策: |
| サービスで使用されているSLBインスタンスの課金方法を従量課金制から定額制に変更することはできません。 解決策:
|
| CCMによって作成されたSLBインスタンスが再利用されます。 解決策:
|
| SLBインスタンスの作成後、そのタイプを変更することはできません。 解決策:関連するサービスを再作成します。 |
| 既に別のSLBインスタンスに関連付けられているサービスにSLBインスタンスを関連付けることはできません。 解決策: |
トラブルシューティング
次の表に記載されている情報に基づいて、サービスエラー以外のエラーをトラブルシューティングできます。
カテゴリ | 問題 | 解決策 |
SLBインスタンスへのアクセス時に発生する問題 | SLBインスタンスがトラフィックを均等に分散しません。 | |
アプリケーションの更新中にSLBインスタンスにアクセスすると、503エラーが発生します。 | ||
クラスター内からSLBインスタンスにアクセスできません。 | LoadBalancerサービスに関連付けられているSLBインスタンスのIPアドレスにクラスター内からアクセスできません | |
クラスター外からSLBインスタンスにアクセスできません。 | ||
HTTPSポートにリクエストを送信すると、 | ||
SLB構成に関連する問題 | サービスのアノテーションが有効になりません。 | |
SLBインスタンスの構成が変更されています。 | ||
システムが既存のSLBインスタンスを再利用できません。 | ||
既存のSLBインスタンスを再利用すると、リスナーが作成されません。 | ||
サービスのエンドポイントが、SLBインスタンスのバックエンドサーバーに指定されたエンドポイントと異なります。 | ||
SLBの削除に関連する問題 | SLBインスタンスが削除されます。 | |
SLBインスタンスはサービスと一緒に削除されません。 |
SLBインスタンスがトラフィックを均等に分散しません
原因
SLBインスタンスに指定されたスケジューリングアルゴリズムが不適切です。
問題
トラフィックがSLBインスタンスのバックエンドサーバーに均等に分散されません。
解決策
サービスへの長期間接続が確立されている場合は、
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のネットワークモードに基づいて、Podの
preStop
パラメーターとreadinessProbe
パラメーターを設定します。readinessProbe
は、コンテナがネットワークトラフィックを受け入れる準備ができているかどうかを確認します。Podは、準備プローブに合格した場合にのみエンドポイントに追加されます。Podは、ACSがエンドポイントが更新されたことを識別した場合にのみ、SLBインスタンスに接続されます。アプリケーションによっては起動に時間がかかる場合があるため、readinessProbe
に適切なプローブ間隔、遅延期間、および異常なしきい値を設定する必要があります。短い期間を指定すると、アプリケーションPodが繰り返し再起動します。preStop
の値は、アプリケーションPodが残りのリクエストを処理するために必要な期間に設定することをお勧めします。terminationGracePeriodSeconds
の値は、preStop
より30秒長い期間に設定することをお勧めします。
Pod構成の例:
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
クラスター外からSLBインスタンスにアクセスできません
原因
SLBインスタンスのアクセス制御リスト (ACL) ルールを構成したか、SLBインスタンスが予期どおりに実行されていません。
問題
クラスター外からSLBインスタンスにアクセスできません。
解決策
次のコマンドを実行して、サービスイベントをクエリし、エラーをトラブルシューティングします。詳細については、サービスエラーと解決策 を参照してください。
kubectl -n {your-namespace} describe svc {your-svc-name}
SLBインスタンスにACLルールが構成されているかどうかを確認します。
SLBインスタンスにACLルールが構成されている場合は、クライアントIPアドレスがSLBインスタンスにアクセスできるかどうかを確認します。SLBインスタンスのACLルールの構成方法の詳細については、アクセス制御 を参照してください。
SLBインスタンスがvServerグループに関連付けられているかどうかを確認します。
vServerグループが関連付けられていない場合は、アプリケーションPodがサービスに関連付けられているかどうか、およびアプリケーションPodが正常に実行されているかどうかを確認します。アプリケーションPodが正常に実行されていない場合は、原因を特定し、エラーをトラブルシューティングします。詳細については、Podのトラブルシューティング を参照してください。
異常なバックエンドサーバーがSLBリスナーによって検出されているかどうかを確認します。
異常なバックエンドサーバーが検出された場合は、アプリケーションPodが正常に実行されているかどうかを確認します。SLBのヘルスチェックの詳細については、ヘルスチェックスクリプトを実行する を参照してください。
エラーが解決しない場合は、ACS DingTalkグループに参加してテクニカルサポートを受けてください。
バックエンドHTTPSサービスにアクセスできません
原因
SLBインスタンスで証明書情報を指定した後、SLBインスタンスはHTTPSリクエストを復号化し、HTTPリクエストをバックエンドPodに送信します。
問題
バックエンドHTTPSサービスにアクセスできません。
解決策
サービスでtargetPortをHTTPポートに設定します。たとえば、次のNGINXサービスでは、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:
- port: 80
protocol: TCP
targetPort: 80
- port: 443
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer