ALB Ingress Controller は、Kubernetes クラスター内のサービスへの外部トラフィックを管理し、ルーティングします。サービスを ALB Ingress 経由で公開すると、コントローラーは関連する Endpoint リソースの変更を監視し、バックエンドノードのステータスをバックエンドサーバーグループに同期し、それらの変更を ALB インスタンスに適用します。同期は、設定エラーやクォータ制限が原因で失敗することがあります。
トラブルシューティングの前に、ALB Ingress コントローラーを最新バージョンにアップグレードしてください。手順については、「ALB Ingress コントローラーをアップグレードする」をご参照ください。古いバージョンを実行すると、すでに修正済みの問題を引き起こす可能性があります。
仕組み
ALB Ingress を介してサービスにアクセスすると、ALB Ingress Controller はさまざまなリソースの変更を監視し、関連する ALB インスタンスに同期します。次の図は、リソース間の論理的な関係と同期プロセスを示しています。
ステップ 1:Ingress イベントの確認
Ingress イベントは、コントローラーが何を実行していて、どこで失敗しているかを示します。解決策を探す前に、まずイベントを確認して特定のエラーを特定してください。
コンソールを使用する場合: [ネットワーク] > [Ingresses] に移動します。名前空間を選択し、Ingress 名をクリックしてから、[イベント] タブをクリックします。
kubectl を使用する場合:
kubectl describe ingress <ingress-name> -n <namespace>期待される出力:
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedBuildModel 2m28s (x10 over 6m43s) ingress listener is not exist in alb, port: 443, protocol: HTTPS
Normal Sync 19s (x32 over 11d) ingress Scheduled for sync
Normal SuccessfullyReconciled 4s (x20 over 11d) ingress Successfully reconciled[説明] 列 (コンソール) または Message フィールド (kubectl) にイベントの詳細が表示されます。
Scheduled for sync:コントローラーがイベントの処理を開始しました。Successfully reconciled:調整がエラーなしで完了しました。Warningイベント:コントローラーで問題が発生しました。解決策については、「ステップ 2」をご参照ください。
イベントが表示されない場合、または Normal イベントのみが表示されて変更が反映されない場合は、「ステップ 3」に進んでください。
ステップ 2:異常イベントの解決
ステップ 1 で確認したエラーメッセージを以下の表で見つけ、その解決策に従ってください。
| エラーメッセージ | 原因 | ソリューション |
|---|---|---|
| listener does not exist in alb, port: 80, protocol: HTTP | ALB Ingress Controller V2.11.0 以降では、リスナーは Ingress にのみ関連付けられ、自動的には作成されません。このエラーは、リスナーが AlbConfig に存在しないことを意味します。 | AlbConfig で Ingress リソースに必要なリスナーを作成します。 |
| listener not found for (80/HTTP), with ingresses 1 | ALB Ingress Controller V2.11.0 以降では、このエラーは、Ingress にまだ関連付けられている AlbConfig からリスナーが削除された場合に発生します。エラーメッセージには、見つからないリスナーと関連する Ingress の数が含まれます。 | AlbConfig からリスナーを削除する前に、そのリスナーに関連付けられているすべての Ingress を削除してください。誤ってリスナーを削除した場合は、再度追加してください。 |
| no certificate found for host | TLS が証明書の自動検出で有効になっていますが、ドメインに一致する証明書が Certificate Management Service で見つかりませんでした。 | - 証明書の自動検出を設定する:Certificate Management Service コンソールで証明書を作成します。コントローラーは、ALB Ingress の TLS 用に設定されたドメインに証明書を自動的に一致させます。- 証明書を直接指定する:AlbConfig を使用して証明書を設定します。 |
| The param Rules.1.RuleConditions.2.PathConfig.Values.1 is illegal | 転送ルールに無効なパス値が含まれています。 | - Ingress が rewrite アノテーションを使用している場合は、pathType を Prefix に設定します。- それ以外の場合は、path フィールドに無効な文字がないか確認してください。正規表現以外のパスの場合、値は / で始まり、英字、数字、および次の特殊文字のみを含めることができます:$、+、/、&、~、@、_、-、.、:。ワイルドカード文字 * および ? もサポートされています。 |
| The param ServerGroupName is illegal | ALB バックエンドサーバーグループ名が無効なフォーマットです。 | サーバーグループ名を確認してください。名前は namespace+ServiceName+port のフォーマットで生成されます。名前は 2~128 文字で、英字で始まり、数字、.、_、- のみを含む必要があります。 |
| The specified resource sgp-vz2fb219vv792flx3u is in use | ACK で管理されている ALB バックエンドサーバーグループが、別の ALB インスタンスによって参照されています。 | ALB コンソールにログインします。[ALB] > [サーバーグループ] に移動し、バックエンドサーバーグループを見つけて、ALB インスタンスの関連付けを解除します。 |
| Message: Invalid parameter. Check the parameter input. | AlbConfig の証明書 ID が正しく設定されていません。リソース ID ではなく、数値 ID が使用されている可能性があります。 | 数値 ID ではなく、CertIdentifier で指定されたリソース ID を使用してください。 |
| Message: Failed to create SSL Certificate with name default-https-secret-1-b585e6 ({namespace}-{name}-{identity}). Error: The certificate has expired. | Secret 証明書の有効期限が切れています。エラーメッセージ内の証明書名は {namespace}-{name}-{identity} のフォーマットに従います。{namespace} は Secret が存在する名前空間 (例:default)、{name} は Secret リソース名 (例:https-secret-1)、{identity} は Secret コンテンツのハッシュ (例:b585e6) です。 | 1. Ingress の secretName フィールドで、期限切れの証明書を更新します。新しい証明書は、現在の日付から少なくとも 1 日間有効である必要があります。2. または、secretName の設定を削除し、証明書の自動検出に切り替えます。詳細については、「HTTPS による暗号化通信のための証明書の設定」をご参照ください。 |
| SSL 証明書の作成に失敗しました (名前: XXX) <br>エラーコード: NameRepeat <br>メッセージ: この名前は既に使用されています。別の名前を入力してください。 | Ingress は Secret 証明書を使用しています。証明書の有効期限が切れた後、AlbConfig を介して新しい証明書をアップロードした際に、期限切れの証明書の名前が再利用されたため、SSL 証明書名が重複しました。 | |
| invalid server group Cookie: | - Empty cookie value:セッション維持が Cookie の書き換え (sticky-session-type: "Server") に設定されていますが、cookie アノテーションが空です。- Unsupported controller version:V2.15.0-aliyun.1 より前の ALB Ingress Controller バージョンは、サーバーグループのセッション維持のためのカスタム Cookie をサポートしていません。 | - Empty cookie value:空でない Cookie 値を設定します。例: alb.ingress.kubernetes.io/cookie: "test" アノテーションの詳細については、「アノテーションを使用したセッション維持の実装」をご参照ください。- Unsupported version:ALB Ingress Controller をアップグレードします。 |
| The quota of alb_quota_server_added_num is exceeded for resource eni-xxxx, usage 202/200 | alb_quota_server_added_num クォータに達しました。このクォータは、バックエンドサーバーの IP アドレスを ALB バックエンドサーバーグループに追加できる回数を制限します。 | [クォータセンター] に移動して、サーバーグループのクォータを増やします。 |
ステップ 3:サイレント障害の診断
変更が反映されないにもかかわらず Warning イベントが表示されない場合、IngressClass と AlbConfig のバインディングが誤って設定されている可能性があります。IngressClass が間違った AlbConfig を指していると、コントローラーはその Ingress の変更イベントを処理しません。
診断するには:
spec.parametersのIngressClassが正しいAlbConfigリソース名を参照していることを検証します。AlbConfigの調整イベントがトリガーされているかどうかを確認します。
IngressClass と AlbConfig のバインディングの詳細については、「IngressClass を使用して AlbConfig を Ingress に関連付ける」をご参照ください。