サービスタイプを Type=LoadBalancer に設定すると、ACK Cloud Controller Manager (CCM) が自動的に、該当サービス向けの Alibaba Cloud クラシックロードバランサー (CLB) インスタンスを作成または設定します。CCM は CLB インスタンス、そのリスナー、およびバックエンドサーバーグループを管理します。詳細については、「サービス向け Server Load Balancer 構成に関する注意事項」をご参照ください。
前提条件
開始する前に、CCM コンポーネントのバージョンが V1.9.3.276-g372aa98-aliyun 以降であることを確認してください。アップグレード手順については、「CCM コンポーネントのアップグレード」をご参照ください。リリースノートについては、「Cloud Controller Manager」をご参照ください。
診断プロセス
LoadBalancer サービス障害の原因を特定するには、以下の手順を実行してください。
-
CLB インスタンスに関連付けられたサービスを特定します。
XXX.XXX.XXX.XXXをロードバランサーの IP アドレスに置き換えます。kubectl get svc -A | grep -i LoadBalancer | grep {XXX.XXX.XXX.XXX}正常なサービスでは、次のような出力が表示されます。
default my-svc LoadBalancer 10.x.x.x XXX.XXX.XXX.XXX 80:32xxx/TCP 5d -
サービスにエラーイベントが発生していないか確認します。
-
エラーイベントが存在する場合、「サービスのエラーイベントと解決策」でエラーメッセージを照合してください。
-
エラーイベントが存在しない場合、「トラブルシューティング方法」の症状別ガイドをご利用ください。
kubectl -n {your-namespace} describe svc {your-svc-name}出力の末尾にある Events セクションを確認してください。エラーが発生しているサービスでは、次のような出力が表示されます。
Events: Type Reason Age From Message ---- ------ --- ---- ------- Warning SyncLoadBalancerFailed 2m service-controller <エラーメッセージ> -
サービスのエラーイベントと解決策
kubectl -n {your-namespace} describe svc {your-svc-name} を実行し、Events セクションに表示されるエラーメッセージを下記の表と照合してください。
| エラーメッセージ | 原因 | 解決策 |
|---|---|---|
The backend server number has reached to the quota limit of this load balancers |
CLB インスタンスがバックエンドサーバー数 200 のクォータ制限に達しています。 | 以下のいずれかの操作を行ってください。1. SLB クォータ管理ページからクォータ増加を申請します。2. バックエンドサーバーの消費量を削減するために、externalTrafficPolicy: Local を設定します。Cluster モードを維持する場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label アノテーションを追加して、バックエンドとして追加されるノードを制限します。3. 複数のサービスで 1 つの CLB インスタンスを共有するのではなく、新しい CLB インスタンスを作成します。 |
The loadbalancer does not support backend servers of eni type |
共有型 CLB インスタンスは Elastic Network Interface (ENI) 型のバックエンドをサポートしていません。 | パフォーマンス専有型の CLB インスタンスを利用するため、アノテーション service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" を追加します。このアノテーションが使用中の CCM バージョンでサポートされていることを確認してください。アノテーションとバージョンの対応関係については、「アノテーションを使用したクラシックロードバランサー (CLB) インスタンスの設定」をご参照ください。 |
There are no available nodes for LoadBalancer |
CLB インスタンスにバックエンドサーバーがありません。 | Pod のステータスを確認します。- サービスに関連付けられた Pod がない場合、一致するアプリケーション Pod を追加します。- Pod が不健全な場合、まず Pod の問題を解決します。詳細については、「Pod 障害のトラブルシューティング」をご参照ください。- Pod が実行中であるにもかかわらずバックエンドとして追加されていない場合、Pod がマスターノード上に配置されていないか確認し、ワーカーノードへ移動させます。 |
alicloud: not able to find loadbalancer named [%s] in openapi, but it's defined in service.loaderbalancer.ingress... または alicloud: can not find loadbalancer, but it's defined in service |
サービスで参照されている CLB インスタンスが見つかりません。 | Server Load Balancer コンソールで、サービスの EXTERNAL-IP を使用して CLB インスタンスを検索します。- CLB インスタンスが既に存在せず、サービスも不要な場合は、サービスを削除します。- CLB インスタンスが存在し、手動で作成された場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを追加します。詳細については、「アノテーションを使用したクラシックロードバランサー (CLB) インスタンスの設定」をご参照ください。- CLB インスタンスが CCM によって作成された場合は、サービスに kubernetes.do.not.delete ラベルを追加します。詳細については、「CCM の旧バージョンを使用している場合の SLB インスタンス名変更方法」をご参照ください。 |
ORDER.ARREARAGE Message: The account is arrearage. |
アカウントの支払いが遅延しています。 | 支払い遅延を解消します。 |
PAY.INSUFFICIENT_BALANCE Message: Your account does not have enough 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 associating with this vServer group. |
vServer グループにリンクされたリスナーを削除できません。 | 1. サービスのアノテーションに CLB ID が含まれているか確認します:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-clb-id}。含まれている場合、CLB インスタンスが再利用されています。2. CLB コンソールで、サービスで定義されたポートに対応するリスナーを削除します。「リスナー転送ルールの設定」をご参照ください。 |
Status Code: 400 Code: NetworkConflict |
内部向け CLB インスタンスがクラスターとは異なる Virtual Private Cloud (VPC) に配置されています。 | CLB インスタンスをクラスターと同じ VPC に移動するか、正しい VPC 内に新しい CLB インスタンスを作成します。 |
Status Code: 400 Code: VSwitchAvailableIpNotExist Message: The specified VSwitch has no available ip. |
指定された vSwitch に利用可能な IP アドレスがありません。 | 別の vSwitch を指定するため、アノテーション service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}" を追加します。 |
The specified Port must be between 1 and 65535. |
ENI モードでは、targetPort に文字列値はサポートされません。 |
サービス YAML で targetPort を整数に変更するか、CCM をアップグレードします。「CCM コンポーネントのアップグレード」をご参照ください。 |
Status Code: 400 Code: ShareSlbHaltSales Message: The share instance has been discontinued. |
古いバージョンの CCM では、デフォルトで共有型 CLB インスタンスが作成されますが、これは現在非推奨となっています。 | CCM コンポーネントのアップグレード。 |
can not change ResourceGroupId once created |
CLB リソースグループはインスタンス作成後に変更できません。 | サービスから service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id:"rg-xxxx" アノテーションを削除します。 |
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 ネットワークプラグインが使用されており、ENI モードをサポートしていない場合に発生します。 |
サービスから service.beta.kubernetes.io/backend-type: eni アノテーションを削除します。 |
ロードバランサーの instanceChargeType が PayByCLCU であるため、操作は許可されていません。 または ユーザーには InstanceChargeType を spec に変更する権限がありません。 |
CLB の課金方法を従量課金 (PayByCLCU) からスペック課金に変更することはできません。 | 以下のいずれかの操作を行ってください。- service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec アノテーションを削除します。- サービスに service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type アノテーションが設定されている場合、その値を PayByCLCU に設定します。 |
SyncLoadBalancerFailed the loadbalancer xxx can not be reused, can not reuse loadbalancer created by kubernetes. |
CLB インスタンスは CCM によって作成されており、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションによる再利用はできません。 |
1. サービス YAML の service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションから CLB ID を特定します。2. サービスのステータスに応じて対応します: - サービスが保留状態の場合:アノテーション内の CLB ID を、クラシックロードバランサー (CLB) コンソールで手動作成した CLB インスタンスの ID に置き換えます。 - サービスが保留状態でなく、CLB IP がサービスの EXTERNAL-IP と一致する場合:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを削除します。 - サービスが保留状態でなく、CLB IP が一致しない場合:CLB コンソールでサービスの EXTERNAL-IP と一致する CLB インスタンスを検索し、その ID でアノテーションを更新します。一致するものが見つからない場合は、手動で作成した CLB インスタンスの ID でアノテーションを置き換え、サービスを再作成します。 |
alicloud: can not change LoadBalancer AddressType once created. delete and retry |
CLB インスタンスタイプは作成後に変更できません。 | サービスを削除して再作成します。 |
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] |
サービスはすでに CLB インスタンスにバインドされており、アノテーションの変更により別の CLB インスタンスに再バインドすることはできません。 | サービスを削除して、正しい CLB インスタンス ID を指定して再作成します。 |
トラブルシューティング方法
エラーイベントが発生しない障害については、以下の症状別ガイドをご利用ください。
| 問題 | 症状 | 解決策 |
|---|---|---|
| CLB アクセス障害 | バックエンド間での負荷分散が不均等 | CLB バックエンド間での負荷分散が不均等 |
| アプリケーション更新時の 503 エラー | アプリケーション更新時の 503 エラー | |
| クラスター内から CLB にアクセスできない | クラスター内から CLB にアクセスできない | |
| クラスター外から CLB にアクセスできない | クラスター外から CLB にアクセスできない | |
| 「The plain HTTP request was sent to HTTPS port」エラー | バックエンドの HTTPS サービスに接続できない | |
| CLB の構成の問題 | サービスのアノテーションが適用されない | サービスのアノテーションが適用されない場合の対処方法 |
| CLB 構成が予期せず変更される | CLB インスタンスの構成が変更される理由 | |
| 既存の CLB インスタンスの再利用が適用されない | サービス FAQ | |
| 既存の CLB インスタンスを再利用する際にリスナーが設定されない | 既存の CLB インスタンスを再利用する際にリスナーが設定されない理由 | |
| CLB バックエンドが不整合 | SLB vServer グループが更新されない場合の対処方法 | |
| CLB 削除障害 | CLB インスタンスが予期せず削除される | SLB インスタンスが自動的に削除されるタイミング |
| サービス削除後に CLB インスタンスが削除されない | SLB インスタンスが自動的に削除されるタイミング |
CLB バックエンド間での負荷分散が不均等
原因: CLB のスケジューリングアルゴリズムがトラフィックパターンに適していません。
症状: リクエスト負荷がバックエンドサーバー間で不均等に分散されています。
解決策:
-
externalTrafficPolicy: Localを使用するサービスの場合、重み付きラウンドロビンスケジューリングを使用するために、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wrr"アノテーションを追加します。 -
接続保持を使用するサービスの場合、重み付き最小接続スケジューリングを使用するために、
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"アノテーションを追加します。これにより、長時間の接続が過度なトラフィックを受けることが防げます。
アプリケーション更新時の 503 エラー
原因: CLB リスナーで接続ドレインが設定されていない、または Pod でグレースフルターミネーションが設定されていません。ローリングアップデート中に、CLB が既にシャットダウンを開始している Pod にトラフィックをルーティングすることがあります。
症状: アプリケーション更新中に CLB インスタンスにアクセスすると、503 エラーが返されます。
解決策:
-
CLB リスナーで接続ドレインを設定するため、
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainアノテーションを追加します。リスナーのアノテーション一覧については、「リスナー管理の一般的な操作」をご参照ください。 -
Pod で
readinessProbeおよびpreStopを設定します。例としての Pod 構成を以下に示します。-
`readinessProbe`:Pod は readiness probe を通過した後のみ、サービスの Endpoint に追加されます。ACK が Endpoint の変更を検出すると、ノードが CLB バックエンドにアタッチされます。プローブの頻度、遅延、失敗しきい値は、アプリケーションの起動時間に合わせて設定してください。タイムアウトが短すぎると、Pod が繰り返し再起動する可能性があります。
-
`preStop` および `terminationGracePeriodSeconds`:
preStopには、アプリケーションが進行中のリクエストをドレインするために必要な時間を設定します。terminationGracePeriodSecondsには、preStopより少なくとも 30 秒長い時間を設定します。
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: 5084 timeoutSeconds: 1 # Readiness probe readinessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Graceful termination lifecycle: preStop: exec: command: - sleep - 30 terminationGracePeriodSeconds: 60 -
クラスター内から CLB にアクセスできない
原因: サービスで externalTrafficPolicy: Local が設定されています。この設定では、kube-proxy はリクエストの発信元と同じノード上で実行されている Pod にのみトラフィックを転送します。リクエストを受け取るノードに該当サービスのバックエンド Pod がない場合、接続は失敗します。これは、CLB アドレスにルーティングされるクラスター内トラフィックに影響を与えます。詳細については、「kube-proxy adds external-lb address to node-local iptables rule」をご参照ください。
症状: CLB インスタンスはクラスター外からアクセス可能ですが、クラスター内からは接続できません。
解決策: 以下のいずれかの方法をご利用ください。
-
ClusterIP またはサービス名を使用したアクセス(クラスター内アクセスに推奨): クラスター内では、CLB アドレスの代わりにサービスの ClusterIP または DNS 名を使用します。Ingress サービスの場合、サービス名は
nginx-ingress-lb.kube-systemです。 -
`externalTrafficPolicy: Cluster` への切り替え: この設定では、Pod の配置に関係なくクラスター内トラフィックがサービスに到達しますが、クライアントの元のソース IP は保持されません。Ingress サービスを変更するには:
Ingress CLB インスタンスを使用している場合、Pod は Ingress ポッドが実行されているノードからのみ、Ingress または CLB 経由で公開されたサービスにアクセスできます。
kubectl edit svc nginx-ingress-lb -n kube-system -
ENI パススルー(Terway のみ)を伴う `externalTrafficPolicy: Cluster` の使用: クラスターで ENI を使用する Terway または ENI ごとの複数 IP を使用している場合、
externalTrafficPolicy: Clusterを設定し、service.beta.kubernetes.io/backend-type: "eni"アノテーションを追加します。これにより、ソース IP が保持され、クラスター内アクセスに問題が発生しません。詳細については、「アノテーションを使用したクラシックロードバランサー (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
クラスター外から CLB にアクセスできない
原因: アクセス制御リスト (ACL) がクライアント IP をブロックしている、CLB vServer グループにバックエンドサーバーがない、または CLB のヘルスチェックが失敗していることです。
症状: CLB インスタンスがクラスター外から到達できません。
解決策:
-
サービスのエラーイベントを確認し、解決します。「サービスのエラーイベントと解決策」をご参照ください。
kubectl -n {your-namespace} describe svc {your-svc-name} -
CLB インスタンスに ACL が設定されているか確認します。設定されている場合、クライアント IP アドレスからのインバウンドトラフィックが許可されていることを確認します。ACL の設定方法については、「リソースアクセス管理」をご参照ください。
-
CLB vServer グループが空かどうか確認します。空の場合、アプリケーション Pod がサービスに関連付けられており、期待通りに実行されていることを確認します。Pod が不健全な場合は、まず Pod の問題を解決します。「Pod 障害のトラブルシューティング」をご参照ください。
-
CLB リスナーのヘルスチェックが成功しているか確認します。失敗している場合、アプリケーション Pod が正しく応答していることを確認します。ヘルスチェックのトラブルシューティングについては、「CLB ヘルスチェック FAQ」をご参照ください。
バックエンドの HTTPS サービスに接続できない
原因: CLB リスナーに証明書が設定されている場合、CLB が TLS を終端し、復号された HTTP トラフィックをバックエンド Pod に転送します。targetPort が HTTPS ポート(例:443)に設定されていると、Pod は HTTPS ポートで HTTP リクエストを受信し、「The plain HTTP request was sent to HTTPS port」として拒否します。
症状: CLB リスナーで HTTPS を設定した後に、バックエンドサービスへの接続が失敗します。
解決策: HTTPS リスナーのポートに対する targetPort を、バックエンド Pod がリッスンしている 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