Type=LoadBalancer の Service でクラシックロードバランサー (CLB) のエラーまたはアクセス障害が発生した場合に、問題を診断して解決します。 詳細については、「Service のロードバランシングに関する注意事項」をご参照ください。
前提条件
CCM コンポーネントのバージョンは V1.9.3.276-g372aa98-aliyun またはそれ以降です (アップグレード手順、リリースノート)。
診断プロセス
LoadBalancer Service の問題の原因を特定します。
-
CLB インスタンスに関連付けられている Service を特定します。
XXX.XXX.XXX.XXXをロードバランサーの IP アドレスに置き換えます。kubectl get svc -A | grep -i LoadBalancer | grep {XXX.XXX.XXX.XXX}正常な Service の出力は、次のようになります。
default my-svc LoadBalancer 10.x.x.x XXX.XXX.XXX.XXX 80:32xxx/TCP 5d -
次のコマンドを実行して、Service にエラーイベントがあるかどうかを確認します。
kubectl -n {your-namespace} describe svc {your-svc-name}下部の[イベント]セクションを確認してください。エラー出力例:
Events: Type Reason Age From Message ---- ------ --- ---- ------- Warning SyncLoadBalancerFailed 2m service-controller <error message here>-
エラーイベントが存在する場合は、「Service のエラーイベントと解決策」でエラーメッセージを照合してください。
-
エラーイベントが存在しない場合は、「トラブルシューティング方法」の症状別のガイドを使用してください。
-
Service のエラーイベントと解決策
kubectl -n {your-namespace} describe svc {your-svc-name} を実行し、[イベント] セクションのエラーメッセージを以下の表と照合します。
| エラーメッセージ | 原因 | 解決策 |
|---|---|---|
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. 新しい CLB インスタンスを作成します。
|
The loadbalancer does not support backend servers of eni type |
共有 CLB インスタンスは、エラスティックネットワークインターフェイス (ENI) バックエンドをサポートしていません。 | service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" アノテーションを追加して、高性能な CLB インスタンスを使用してください。 CCM のバージョンの互換性を確認してください。 詳細については、「アノテーションを使用したクラシックロードバランサー (CLB) インスタンスの設定」をご参照ください。 |
There are no available nodes for LoadBalancer |
CLB インスタンスにバックエンドサーバーがありません。 | Pod のステータスを確認してください。 - Service に一致する 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 |
Service によって参照されている CLB インスタンスが見つかりません。 | サーバーロードバランサーコンソールで、Service の EXTERNAL-IP を使用して CLB インスタンスを検索します。- CLB が存在せず、Service が不要な場合は、Service を削除してください。 - CLB が存在し、手動で作成された場合は、 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを追加してください。 詳細については、「アノテーションを使用したクラシックロードバランサー (CLB) インスタンスの設定」をご参照ください。- CLB が CCM によって作成された場合は、CLB インスタンスに 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} を使用して Service のエラーを確認し、解決してください。 |
Status Code: 400 Code: RspoolVipExist Message: there are vips associating with this vServer group. |
VServer グループにリンクされているリスナーは削除できません。 | 1. Service のアノテーションに CLB ID service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-clb-id} が含まれているかどうかを確認してください。 含まれている場合、CLB は再利用されています。2. CLB コンソールで、Service で定義されているポートのリスナーを削除してください。 詳細については、「リスナーの転送ルールの設定」をご参照ください。 |
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 アドレスがありません。 | service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}" アノテーションを追加して、同じ VPC 内の別の vSwitch を指定してください。 |
The specified Port must be between 1 and 65535. |
ENI モードは、targetPort の文字列値をサポートしていません。 |
Service 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 から 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 から service.beta.kubernetes.io/backend-type: eni アノテーションを削除してください。 |
The operation is not allowed because the instanceChargeType of loadbalancer is PayByCLCU. または User does not have permission modify InstanceChargeType to spec. |
CLB の課金方法を従量課金 (PayByCLCU) から仕様別の課金に変更することはできません。 | 次のいずれかを実行してください。 - service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec アノテーションを削除してください。- Service に 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. Service YAML の service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションで CLB ID を見つけてください。2. Service のステータスに基づいて解決してください。 - Service が Pending:クラシックロードバランサー (CLB) コンソールで手動で作成した CLB の ID に置き換えてください。 - Service が Pending ではなく、CLB IP が Service の EXTERNAL-IP と一致する: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id アノテーションを削除してください。- Service が Pending ではなく、CLB IP が一致しない:コンソールで Service の EXTERNAL-IP に一致する CLB を見つけ、アノテーションを更新してください。 一致するものがない場合は、手動で作成した CLB ID を使用して Service を再作成してください。 |
alicloud: can not change LoadBalancer AddressType once created. delete and retry |
CLB インスタンスタイプは作成後に変更できません。 | Service を削除して再作成してください。 |
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] |
Service は CLB インスタンスにバインドされており、アノテーションを変更して再バインドすることはできません。 | Service を削除し、正しい CLB インスタンス ID で再作成してください。 |
トラブルシューティング方法
エラーイベントを生成しない問題については、次の症状別のガイドを使用します。
| 問題 | 症状 | 解決策 |
|---|---|---|
| CLB アクセスの問題 | バックエンド間の負荷分散が不均一 | CLB バックエンド間の負荷分散が不均一 |
| アプリケーション更新中の 503 エラー | アプリケーション更新中の 503 エラー | |
| クラスター内から CLB にアクセスできない | クラスター内から CLB にアクセスできない | |
| クラスター外から CLB にアクセスできない | クラスター外から CLB にアクセスできない | |
| "The plain HTTP request was sent to HTTPS port" エラー | バックエンドの HTTPS サービスに接続できない | |
| CLB 設定の問題 | Service のアノテーションが有効にならない | Service のアノテーションが有効にならない場合はどうすればよいですか。 |
| CLB 設定が予期せず変更される | CLB インスタンスの設定が変更されるのはなぜですか。 | |
| 既存の CLB インスタンスの再利用が有効にならない | Service のよくある質問 | |
| 既存の CLB インスタンスを再利用する際にリスナーが設定されない | 既存の CLB インスタンスを再利用する際にリスナーが設定されないのはなぜですか。 | |
| CLB バックエンドの不整合 | SLB VServer グループが更新されない場合はどうすればよいですか。 | |
| CLB 削除の問題 | CLB インスタンスが予期せず削除される | SLB インスタンスはいつ自動的に削除されますか。 |
| Service の削除後に CLB インスタンスが削除されない | SLB インスタンスはいつ自動的に削除されますか。 |
CLB バックエンド間の負荷分散が不均一
原因:CLB のスケジューリングアルゴリズムがトラフィックパターンに適していません。
症状:バックエンドサーバー間でリクエストの分散が不均一です。
解決策:
-
externalTrafficPolicy: Localの Service の場合は、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wrr"アノテーションを追加して、重み付けラウンドロビンスケジューリングを使用してください。 -
永続的な接続を使用する Service の場合は、
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"アノテーションを追加して、重み付け最小接続スケジューリングを使用してください。 これにより、1 つの長寿命接続がトラフィックを独占するのを防ぐことができます。
アプリケーション更新中の 503 エラー
原因:コネクションドレイニングまたは Pod のグレースフルターミネーションが設定されていません。 ローリングアップデート中に、CLB が終了中の Pod にトラフィックをルーティングする可能性があります。
症状:アプリケーションの更新中に CLB にアクセスすると 503 エラーが発生します。
解決策:
-
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainアノテーションを追加して、コネクションドレイニングを有効にしてください。 詳細については、「リスナーを管理するための一般的な操作」をご参照ください。 -
Pod で
readinessProbeとpreStopを設定してください。-
readinessProbe:Pod は、このプローブに合格した後にのみ CLB バックエンドに参加するようになります。 アプリケーションの起動時間に合わせて、プローブの頻度、遅延、および失敗のしきい値を設定してください。 タイムアウトが短すぎると、Pod の再起動が繰り返されます。
-
preStop と terminationGracePeriodSeconds:
preStopは、アプリケーションが処理中のリクエストをドレイニングするために必要な時間に設定してください。 terminationGracePeriodSeconds は、preStop よりも少なくとも 30 秒長く設定してください。
apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: containers: - name: nginx image: nginx # Liveness プローブ livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Readiness プローブ readinessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # グレースフルターミネーション lifecycle: preStop: exec: command: - sleep - 30 terminationGracePeriodSeconds: 60 -
クラスター内から CLB にアクセスできない
原因:Service で externalTrafficPolicy: Local が設定されています。 kube-proxy は、リクエストの送信元と同じノード上の Pod にのみトラフィックを転送します。 ノードに Service のバックエンド Pod がない場合、接続は失敗します。 これは、CLB アドレスにルーティングされるクラスター内トラフィックに影響します。 詳細については、「kube-proxy が外部 LB アドレスをノードローカルの iptables ルールに追加する」をご参照ください。
症状:CLB はクラスターの外部からはアクセスできますが、内部からの接続は失敗します。
解決策:次のいずれかのアプローチを使用してください。
-
ClusterIP またはサービス名経由のアクセス (クラスター内アクセスに推奨):CLB アドレスの代わりに、Service の ClusterIP または DNS 名を使用してください。 Ingress の場合、サービス名は
nginx-ingress-lb.kube-systemです。 -
externalTrafficPolicy: Clusterへの切り替え:Pod の配置に関係なく、クラスター内トラフィックは Service に到達しますが、クライアントの送信元 IP は保持されません。 Ingress Service を変更するには、次のコマンドを実行してください。Ingress CLB を使用すると、Pod は Ingress Pod を実行しているノードからのみ Ingress/CLB で公開されているサービスにアクセスできます。
kubectl edit svc nginx-ingress-lb -n kube-system -
ENI パススルーで
externalTrafficPolicy: Clusterを使用する (Terway のみ):クラスターが Terway を ENI または 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 インスタンスに到達できません。
解決策:
-
Service のエラーイベントを確認し、解決してください。 詳細については、「Service のエラーイベントと解決策」をご参照ください。
kubectl -n {your-namespace} describe svc {your-svc-name} -
CLB インスタンスに ACL が設定されているかどうかを確認してください。 設定されている場合は、クライアント IP からのインバウンドトラフィックが許可されていることを確認してください。 詳細については、「Resource Access Management」をご参照ください。
-
CLB VServer グループが空かどうかを確認してください。 空の場合は、Pod が Service に関連付けられて実行中であることを確認してください。 異常な場合は、まず Pod の問題を解決してください。 詳細については、「Pod の問題のトラブルシューティング」をご参照ください。
-
CLB リスナーのヘルスチェックに合格するかどうかを確認してください。 失敗した場合は、Pod が正しく応答することを確認してください。 詳細については、「CLB ヘルスチェックのよくある質問」をご参照ください。
バックエンドの HTTPS サービスに接続できない
原因:CLB リスナーに証明書がある場合、CLB は TLS を終端し、HTTP をバックエンドに転送します。 targetPort が HTTPS ポート (例:443) を指している場合、Pod は "The plain HTTP request was sent to HTTPS port" というメッセージで平文リクエストを拒否します。
症状:CLB リスナーで HTTPS を設定した後、バックエンド接続が失敗します。
解決策:targetPort を Pod の HTTP ポートに設定してください。 たとえば、Nginx が 443 で HTTPS を提供している場合は、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