このトピックでは、Alibaba Cloud Container Compute Service (ACS) の LoadBalancer サービスに関連するエラーの診断および解決方法について説明します。LoadBalancer タイプのサービス (Type=LoadBalancer) を作成すると、クラウドコントローラーマネージャー (CCM) が SLB インスタンス、リスナー、バックエンドサーバーグループを含む Server Load Balancer (SLB) リソースを自動的に作成および設定します。SLB リソースが自動的に更新される仕組みの詳細については、「LoadBalancer サービスの設定に関する考慮事項」をご参照ください。
事前準備
CCM バージョンが 1.9.3.276-g372aa98-aliyun 以降であることを確認してください。古い CCM バージョンではサービスエラーイベントが発行されないため、効果的なトラブルシューティングができません。
CCM を更新するには、「CCM の更新」をご参照ください。
CCM リリースノートについては、「Cloud Controller Manager」をご参照ください。
診断手順
次のフローチャートは、診断プロセスをまとめたものです。

この体系的なアプローチを使用して、障害点を特定します。Pod レイヤーから開始し、SLB レイヤーまで順に確認します。
ステップ 1:Pod とエンドポイントの確認
次のコマンドを実行して、Pod が実行中であり、エンドポイントが設定されているか確認します。
kubectl -n {your-namespace} get pods -o wide
kubectl -n {your-namespace} get endpoints {your-svc-name}エンドポイントが存在しない場合は、Pod が実行中であるか、および Pod ラベルがサービスセレクターと一致するか確認します。
ステップ 2:SLB インスタンスに関連付けられたサービスの検索
次のコマンドを実行して、SLB IP アドレスでサービスを検索します。
kubectl get svc -A |grep -i LoadBalancer|grep ${XXX.XXX.XXX.XXX} #XXX.XXX.XXX.XXX は SLB インスタンスの IP アドレスです。ステップ 3:サービスエラーイベントの確認
次のコマンドを実行して、サービスエラーイベントを確認します。
kubectl -n {your-namespace} describe svc {your-svc-name}イベントが表示されない場合は、CCM バージョンが 1.9.3.276-g372aa98-aliyun 以降であることを確認してください。CCM の更新方法については、「CCM の更新」をご参照ください。
エラーイベントが存在する場合は、「サービスエラーとソリューション」をご参照ください。
エラーイベントが存在しない場合は、「トラブルシューティング」をご参照ください。
ステップ 4:必要に応じたエスカレーション
トラブルシューティング後も問題が解決しない場合は、ACS DingTalk グループに参加してテクニカルサポートを受けてください。
サービスエラーとソリューション
次の表を使用して、サービスエラーを特定し、解決します。エラーはカテゴリ別にグループ化されています。
SLB 作成エラー
| エラーメッセージ | 説明とソリューション |
|---|---|
The loadbalancer does not support backend servers of eni type | 共有リソース SLB インスタンスは、弾力性ネットワークインターフェース (ENI) をサポートしていません。ENI をバックエンドサーバーとして使用するには、パフォーマンス専有型 SLB インスタンスを作成します。サービスに次のアノテーションを追加します:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small"。重要 アノテーションが CCM バージョンの要件を満たしていることを確認してください。詳細については、「CLB インスタンスを構成するためにサービスの YAML ファイルにアノテーションを追加」をご参照ください。 |
Status Code: 400 Code: ShareSlbHaltSales Message: The share instance has been discontinued. | 以前のバージョンの CCM は共有リソース SLB インスタンスを自動的に作成していましたが、これらは現在購入できません。「CCM の更新」をご参照ください。 |
can not change ResourceGroupId once created | SLB インスタンスのリソースグループは、作成後に変更できません。サービスから service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id:"rg-xxxx" アノテーションを削除します。 |
There are no available nodes for LoadBalancer | SLB インスタンスに関連付けられたバックエンドサーバーがありません。Pod がサービスに関連付けられているか、およびそれらの Pod が正常に実行されているか確認します。ソリューション:1. Pod がサービスに関連付けられていない場合は、アプリケーション Pod をサービスに関連付けます。2. 関連付けられた Pod が期待どおりに実行されていない場合は、それらをトラブルシューティングします。詳細については、「Pod のトラブルシューティング」をご参照ください。3. SLB インスタンスに関連付けられたバックエンドサーバーがないが、Pod が正常に実行されている場合は、Pod がマスターノードにデプロイされているか確認します。その場合は、Pod をワーカーノードに退避させます。それ以外の場合は、ACS DingTalk グループに参加してテクニカルサポートを受けてください。 |
SLB 再利用エラー
| エラーメッセージ | 説明とソリューション |
|---|---|
alicloud: not able to find loadbalancer named [%s] in openapi, but it's defined in service.loaderbalancer.ingress. this may happen when you removed loadbalancerid annotation / alicloud: can not find loadbalancer, but it's defined in service | システムがサービスを SLB インスタンスに関連付けることができません。SLB コンソールにログインし、サービスのリージョンで EXTERNAL-IP を使用して SLB インスタンスを検索します。1. SLB インスタンスが存在せず、サービスが不要になった場合は、サービスを削除します。2. SLB インスタンスが存在する場合: (a) SLB コンソールで SLB インスタンスを作成した場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションをサービスに追加します。詳細については、「Service の YAML ファイルにアノテーションを追加して CLB インスタンスを設定する」をご参照ください。(b) CCM が SLB インスタンスを自動的に作成した場合は、SLB インスタンスに kubernetes.do.not.delete ラベルが存在するかどうかを確認します。存在しない場合は、ラベルを追加します。詳細については、「CCM のバージョンが V1.9.3.10 以前の場合に SLB インスタンスの名前を変更する方法 |
SyncLoadBalancerFailed the loadbalancer xxx can not be reused, can not reuse loadbalancer created by kubernetes. | CCM によって作成された SLB インスタンスが再利用されています。ソリューション: 1. 関連するサービスの YAML ファイルを確認し、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーション内の SLB インスタンス ID をメモします。2. サービスの状態に基づいてトラブルシューティングを行います。(a) サービスが Pending 状態の場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションの値を、CLB コンソールで手動作成した SLB インスタンスの ID に変更します。(b) サービスが Pending 状態でない場合: SLB インスタンスの IP がサービスの外部 IP と一致する場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを削除します。SLB インスタンスの IP がサービスの外部 IP と異なる場合は、CLB コンソールにログインし、クラスターのリージョンを選択して、サービスの外部 IP で SLB インスタンスを検索し、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを手動で作成した SLB インスタンスの ID に変更します。一致する SLB インスタンスが見つからない場合は、アノテーションを手動で作成した SLB インスタンスの ID に変更し、サービスを再作成します。 |
alicloud: can not change LoadBalancer AddressType once created. delete and retry | SLB インスタンスのタイプは、作成後に変更することはできません。サービスを再作成してください。 |
the loadbalancer lb-xxxxx can not be reused, service has been associated with ip [xxx.xxx.xxx.xxx], cannot be bound to ip [xxx.xxx.xxx.xxx] | SLB インスタンスは、すでに別の SLB インスタンスに関連付けられているサービスには関連付けることができません。service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを変更して、別の SLB インスタンスを再利用することはできません。関連付けられた SLB インスタンスを変更するには、サービスを削除して再作成してください。 |
Status Code: 400 Code: RspoolVipExist Message: there are vips associating with this vServer group. | vServer グループに関連付けられているリスナーは削除できません。ソリューション: 1. サービスのアノテーションに SLB インスタンス ID が含まれているかどうかを確認します。例: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-slb-id}。アノテーションに SLB インスタンス ID が含まれている場合、SLB インスタンスは再利用されています。2. SLB コンソールにログインし、サービスポートを使用しているリスナーを削除します。SLB リスナーの削除方法の詳細については、「リスナーの転送ルールを管理する」をご参照ください。 |
ネットワークエラー
| エラーメッセージ | 説明とソリューション |
|---|---|
Status Code: 400 Code: NetworkConflict | 再利用されたイントラネット SLB インスタンスとクラスターが同じ仮想プライベートクラウド (VPC) にありません。SLB インスタンスとクラスターが同じ VPC にあることを確認してください。 |
Status Code: 400 Code: VSwitchAvailableIpNotExist Message: The specified VSwitch has no available ip. | vSwitch に利用可能な IP アドレスが不足しています。アノテーションを使用して、同じ VPC 内の別の vSwitch を指定します:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}" |
can not find eniid for ip x.x.x.x in vpc vpc-xxxx | VPC で ENI IP アドレスが見つかりません。service.beta.kubernetes.io/backend-type: eni アノテーションがサービスに追加されているか確認します。追加されている場合は、Flannel がクラスターのネットワークプラグインとして使用されているか確認します。Flannel は ENI モードをサポートしていません。Flannel が使用されている場合は、サービスからアノテーションを削除します。 |
課金とクォータのエラー
| エラーメッセージ | 説明とソリューション |
|---|---|
ORDER.ARREARAGE Message: The account is arrearage. | アカウントに支払い遅延があります。 |
PAY.INSUFFICIENT_BALANCE Message: Your account does not have enough balance. | アカウント残高が不足しています。 |
Status Code: 400 Code: Throttlingxxx | SLB で API の速度制限が発生しています。 解決策: 1. SLB コンソールのクォータ管理ページに移動し、SLB リソースクォータが十分であるかどうかを確認します。 2. 次のコマンドを実行して Service のエラーを確認し、この表を参照して解決します: kubectl -n {your-namespace} describe svc {your-svc-name} |
構成エラー
| エラーメッセージ | 説明とソリューション |
|---|---|
The specified Port must be between 1 and 65535. | targetPort フィールドは、ENI モードで STRING 型の値をサポートしていません。サービスの YAML ファイルで targetPort を INTEGER 値に設定するか、CCM を更新します。CCM の更新方法の詳細については、「CCM の更新」をご参照ください。 |
The operation is not allowed because the instanceChargeType of loadbalancer is PayByCLCU. / User does not have permission modify InstanceChargeType to spec. | SLB インスタンスの課金方法は、従量課金から仕様別課金に変更できません。ソリューション:1. サービスから service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec アノテーションを削除します。2. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type がサービスに追加されている場合は、値を PayByCLCU に設定します。 |
トラブルシューティング
サービスエラーイベントを生成しない問題のトラブルシューティングには、次の情報を使用します。
SLB インスタンスへのアクセス時の問題
| 問題 | ソリューション |
|---|---|
| SLB インスタンスがトラフィックを均等に分散しない。 | 「SLB インスタンスがトラフィックを均等に分散しない」をご参照ください。 |
| アプリケーション更新中に SLB インスタンスにアクセスすると 503 エラーが発生する。 | 「アプリケーション更新中の 503 エラー」をご参照ください。 |
| クラスター内から SLB インスタンスにアクセスできない。 | 「LoadBalancer サービスに関連付けられた SLB インスタンスの IP アドレスにクラスター内からアクセスできない」をご参照ください。 |
| クラスター外から SLB インスタンスにアクセスできない。 | 「クラスター外から SLB インスタンスにアクセスできない」をご参照ください。 |
The plain HTTP request was sent to HTTPS port エラーが HTTPS ポートにリクエストを送信したときに発生する。 | 「バックエンド HTTPS サービスにアクセスできない」をご参照ください。 |
SLB 構成に関連する問題
| 問題 | ソリューション |
|---|---|
| サービスのアノテーションが有効にならない。 | 「サービスのアノテーションが有効にならない場合はどうすればよいですか? |
| SLB インスタンスの構成が変更される。 | 「SLB インスタンスの構成が変更されるのはなぜですか? |
| システムが既存の SLB インスタンスの再利用に失敗する。 | 「システムが複数のサービスに既存の SLB インスタンスを使用できないのはなぜですか? |
| 既存の SLB インスタンスが再利用されたときにリスナーが作成されない。 | 「既存の SLB インスタンスを再利用したときにリスナーが作成されないのはなぜですか? |
| サービスのエンドポイントが SLB インスタンスのバックエンドサーバーと異なる。 | 「SLB インスタンスの vServer グループが更新されない場合はどうすればよいですか? |
SLB 削除に関連する問題
| 問題 | ソリューション |
|---|---|
| SLB インスタンスが削除される。 | 「SLB インスタンスはいつ自動的に削除されますか? |
| SLB インスタンスがサービスとともに削除されない。 | 「SLB インスタンスはいつ自動的に削除されますか? |
SLB インスタンスがトラフィックを均等に分散しない
[原因]
SLB インスタンスに指定されたスケジューリングアルゴリズムが不適切です。
問題
SLB インスタンスのバックエンドサーバーにトラフィックが均等に分散されません。
ソリューション
サービスに長時間接続が確立される場合は、次のアノテーションを追加して、スケジューリングアルゴリズムを Weighted Least Connections (WLC) に設定します。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"
アプリケーション更新中の 503 エラー
[原因]
SLB リスナーの接続ドレインが構成されていないか、Pod のグレースフルシャットダウンが構成されていません。
問題
アプリケーション更新中に SLB インスタンスにアクセスすると 503 エラーが発生します。
ソリューション
SLB リスナーの接続ドレインを構成するために
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainアノテーションを追加します。アノテーションの詳細については、「リスナーを管理するための一般的な操作」をご参照ください。Pod のネットワークモードに基づいて、Pod の
preStopおよびreadinessProbeパラメーターを設定します。Pod 構成例:readinessProbeは、コンテナーがネットワークトラフィックを受け入れる準備ができているか確認します。Pod は、準備プローブに合格した後にのみエンドポイントに追加されます。その後、ACS がエンドポイントの更新を検出すると、Pod は SLB インスタンスにアタッチされます。readinessProbeの適切なプローブ間隔、遅延期間、および異常しきい値を設定します。一部のアプリケーションは起動に時間がかかる場合があります。短い期間を指定すると、アプリケーション Pod が繰り返し再起動する可能性があります。preStopの値を、アプリケーション Pod が残りのリクエストを処理するために必要な期間に設定します。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
クラスター外から SLB インスタンスにアクセスできない
[原因]
SLB インスタンスにアクセス制御リスト (ACL) ルールが構成されているか、SLB インスタンスが期待どおりに実行されていません。
[問題]
クラスター外から SLB インスタンスにアクセスできません。
ソリューション
次のコマンドを実行してサービスイベントをクエリし、エラーをトラブルシューティングします。詳細については、「サービスエラーとソリューション」をご参照ください。
kubectl -n {your-namespace} describe svc {your-svc-name}SLB インスタンスに ACL ルールが構成されているか確認します。ACL ルールが構成されている場合は、クライアント IP アドレスが SLB インスタンスへのアクセスを許可されているか確認します。ACL ルールの構成方法の詳細については、「アクセス制御」をご参照ください。
SLB インスタンスが vServer グループに関連付けられているか確認します。vServer グループが関連付けられていない場合は、アプリケーション 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クイックリファレンス:一般的なアノテーション
次の表は、トラブルシューティングシナリオで最も頻繁に参照されるアノテーションを示しています。完全なアノテーションリファレンスについては、「アノテーションを使用して CLB インスタンスを構成」をご参照ください。
| アノテーション | 目的 | 一般的なシナリオ |
|---|---|---|
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id | 既存の SLB インスタンスを再利用 | SLB 関連付けの失敗、SLB 再利用エラー |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec | SLB インスタンスの仕様を設定 | ENI バックエンドサーバーの互換性、課金方法の競合 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id | SLB インスタンスの vSwitch を指定 | vSwitch IP アドレスの不足 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler | スケジューリングアルゴリズムを設定 | トラフィックの不均一な分散 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain | 接続ドレインを有効化 | アプリケーション更新中の 503 エラー |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port | ポートごとのプロトコルを設定 | HTTPS バックエンドアクセス失敗 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id | SSL 証明書を設定 | HTTPS バックエンドアクセス失敗 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id | リソースグループを設定 | リソースグループ変更エラー |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type | 課金方法を設定 | 課金方法変更エラー |
service.beta.kubernetes.io/backend-type | バックエンドタイプを設定 (例:eni) | ENI IP が見つからない、Flannel 互換性 |