このトピックでは、ALB Ingress を使用する際の一般的な問題を一覧表示します。
機能に関する質問
ALB Ingress と Nginx Ingress の違い
ALB Ingress の使用を推奨します。インフラストラクチャを自己管理する必要がある Nginx Ingress とは異なり、ALB Ingress は Alibaba Cloud の Application Load Balancer (ALB) 上に構築されており、フルマネージド型です。運用やメンテナンスは必要ありません。ALB Ingress は、より強力な Ingress トラフィック管理とパフォーマンス専有型のゲートウェイサービスを提供します。Nginx Ingress、ALB Ingress、MSE Ingress の詳細な比較については、「Nginx Ingress、ALB Ingress、MSE Ingress の比較」をご参照ください。
ALB Ingress はパブリックネットワークとプライベートネットワークの両方のアクセスをサポートしているか
問題
実際のシナリオでは、パブリックネットワークとプライベートネットワークの両方から ALB Ingress にアクセスする必要があります。しかし、ALB Ingress が両方を同時にサポートしているかどうかが不明です。
解決策
はい、サポートしています。パブリックネットワークとプライベートネットワークの両方のアクセスを使用するには、パブリック ALB インスタンスを作成します。インスタンスは各ゾーンに Elastic IP アドレス (EIP) を作成します。ALB はこれらの EIP をパブリックネットワーク通信に使用します。インスタンスはプライベート仮想 IP アドレス (VIP) も提供します。このプライベート VIP を使用して、プライベートネットワーク経由で ALB にアクセスします。プライベートネットワークアクセスのみが必要な場合は、プライベート ALB インスタンスを作成します。
ALB Ingress が固定の ALB ドメイン名を使用するようにするには
AlbConfig を使用して ALB インスタンスを作成した後、ALB Ingress は IngressClass を介して AlbConfig を参照します。これにより、ALB Ingress は対応する ALB インスタンスのドメイン名を使用できます。ALB Ingress に関連付けられた IngressClass と AlbConfig が変更されない限り、ドメイン名は同じままです。
クラスター内で ALB Ingress Controller の Pod が見つからない理由
問題
クラスター内で ALB Ingress Controller の Pod を検索しても、kube-system 名前空間に関連する Pod が見つかりません。標準的な方法では ALB Ingress Controller コンポーネントを表示できません。
解決策
kube-system 名前空間で ALB Ingress Controller の Pod が表示されるのは、ACK 専用クラスターのみです。ACK Basic Edition、ACK Pro Edition、および ACK Serverless は ALB Ingress Controller コンポーネントを完全に管理しているため、これらのクラスターでは Pod は表示されません。ACK 専用クラスターを ACK マネージドクラスター Pro 版にアップグレードする手順については、「ACK 専用クラスターから ACK マネージドクラスター Pro 版へのホットマイグレーション」をご参照ください。
IP タイプのサーバーのアタッチをサポートするには
問題
バックエンド Pod を IP アドレスで ALB にアタッチしたいと考えています。しかし、デフォルトでは、Service は IP ベースのサーバーグループを自動的に作成しません。これにより、バックエンドサービスへのトラフィック分散が制限されます。
解決策
Service にアノテーション alb.ingress.kubernetes.io/server-group-type: Ip を追加します。これにより、Service 用に IP ベースのサーバーグループが作成されます。その後、バックエンド Pod を IP アドレスで ALB に登録できます。
作成後にサーバーグループのタイプを変更することはできません。Flannel ネットワークモードでは、Service タイプを切り替える (例えば、ClusterIP と NodePort の間) と、ノードのアタッチタイプが IP と ECS の間で切り替わります。これにより、ノードが元のサーバーグループに参加できなくなるため、Service タイプを直接変更することはできません。
サーバーグループのタイプを変更するには、新しい Service を作成します。そのアノテーションで
alb.ingress.kubernetes.io/server-group-type: Ipを指定します。これにより、既存のサーバーグループのノードアタッチメントへの影響を回避できます。Ingress によって参照される Service がまだ存在しない場合、ALB Ingress Controller は Service のアノテーションを読み取る前にサーバーグループを作成します。その後、デフォルトでサーバーグループをインスタンスタイプとして設定します。これにより、IP ベースのサーバーアタッチが失敗します。これを回避するには、Ingress を作成する前に Service を作成してください。
アノテーション
alb.ingress.kubernetes.io/server-group-type: Ipを設定した後は、削除しないでください。削除すると、サーバーグループのタイプと Service の間に不整合が生じます。これにより、リコンサイルが失敗し、バックエンドノードがサーバーグループに参加できなくなります。
apiVersion: v1
kind: Service
metadata:
annotations:
alb.ingress.kubernetes.io/server-group-type: Ip
name: tea-svc
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: tea
type: ClusterIPALB バックエンドで使用されるデフォルトサーバーグループ kube-system-fake-svc-80 の目的
リスナーにはデフォルトの転送ルールが必要です。現在、転送ルールはサーバーグループへの転送のみをサポートしています。そのため、リスナーを有効にするには kube-system-fake-svc-80 サーバーグループが必要です。このサーバーグループはビジネストラフィックを処理しませんが、削除してはいけません。
Ingress のドメイン名の名前解決を設定するには
CNAME レコードを追加します。
この例では、レコードタイプを
CNAME、ホストレコードを@(ルートドメイン、例えばingress-demo.comが直接解決されることを示します)、レコード値を Ingress のエンドポイントアドレスに設定して DNS レコードを追加する方法を示しています。ブラウザで http://ingress-demo.com/coffee にアクセスし、ドメイン名の名前解決が有効であることを確認します。

確認には、実際に登録したドメイン名に置き換えてください。ドメイン名の名前解決が機能しない場合は、「DNS 名前解決の失敗を迅速にトラブルシューティングする」をご参照ください。
Ingress の HTTPS 暗号化を設定するには
SSL 証明書をダウンロードします。
この例では、
ingress-demo.comドメイン名の PEM 形式の証明書ファイルをダウンロードする方法を示しています。サーバータイプは [その他] に設定されています。証明書ファイルを保存するための Secret を作成します。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
シークレット ページで、
default名前空間を選択し、左上の 作成 をクリックします。 次の設定を追加し、OK をクリックします。名前:
ingress-tlsタイプ: TLS 証明書
証明書: ダウンロードした証明書ファイル (.pem) の内容。
キー: ダウンロードした秘密鍵ファイル (.key) の内容。

AlbConfig を更新して、ALB インスタンスに
HTTPS:443リスナーを追加します。左側のナビゲーションウィンドウで、 を選択します。リソースオブジェクト タブで、AlbConfig を検索してクリックします。
AlbConfig リソースオブジェクトのリストで、ターゲットリソース
albを見つけ、アクション 列の YAML の編集 をクリックします。spec.listeners.port: 443とspec.listeners.protocol: HTTPSフィールドを追加し、OK をクリックします。
Ingress を更新して TLS 設定を追加し、
HTTPS:443リスナーを関連付けます。左側のナビゲーションウィンドウで、 を選択します。ターゲット Ingress の アクション 列で、更新 をクリックします。
次の設定を追加し、OK をクリックします。
TLS 設定: 有効
ドメイン名:
ingress-demo.comシークレット:
ingress-tlsアノテーション:
alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]
ブラウザで
https://ingress-demo.com/coffeeにアクセスし、HTTPS アクセスが暗号化されていることを確認します。
確認には、実際に登録したドメイン名に置き換えてください。
HTTPS 証明書の設定方法の詳細については、「暗号化通信のための HTTPS 証明書の設定」をご参照ください。
使用上の異常
ALB インスタンスが WAF Enhanced Edition から Standard Edition にダウングレードされる理由
原因
WAF コンソールで ALB インスタンスの WAF 保護を手動で有効にした後、ALB Ingress Controller はリコンサイル中に、ALB インスタンスの実際のエディションが AlbConfig で宣言されたエディションフィールドと一致しないことを検出します。AlbConfig が明示的に edition: StandardWithWaf を指定していない場合、Controller はインスタンスをデフォルトの Standard Edition に戻します。これにより、WAF が Standard Edition にダウングレードされます。
解決策
WAF Enhanced Edition を維持するには、新しい ALB インスタンスを作成するか、既存のインスタンスの設定を変更する際に、AlbConfig のエディションフィールドを明示的に StandardWithWaf に設定します。
Ingress ドメイン名にアクセスすると 503、502、404 などの HTTP エラーコードが返される理由
原因
503 (Service Temporarily Unavailable) エラー
一致するルーティングルールがない: リクエストパスが Ingress で設定されたルーティングルールと一致しません。
正常なバックエンド Pod がない: サービスに関連付けられたすべての Pod が準備完了でないか、存在しません。これにより、エンドポイントオブジェクトが空になります。
502 (Bad Gateway) エラー
HTTP または HTTPS リスナーがクライアント接続リクエストを受信します。ALB インスタンスがリクエストを Pod に転送できないか、Pod から応答を受信できない場合、インスタンスはクライアントに HTTP 502 Bad Gateway ステータスコードを送信します。
404 (Not Found) エラー
これは通常、リクエストが Ingress で定義されたルーティングルールに一致したが、Pod 内のアプリケーションが提供する実際のサービス URL とは一致しないことを意味します。
400 (Bad Request) エラー
これは、HTTPS リスナーに HTTP リクエストが送信されるなど、さまざまな理由で発生する可能性があります。
その他の HTTP エラーコードについては、「ALB ステータスコード」をご参照ください。
解決策
Ingress のステータスを確認します。
kubectl describe ingress <ingress-name> -n <namespace>コマンドを実行し、Events セクションでエラーメッセージを調べます。例えば、listener does not exist in albのようなイベントが表示された場合は、AlbConfig で Ingress リソースに必要なリスナーを作成する必要があります。... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedBuildModel **** ingress listener is not exist in alb, port: 443, protocol: HTTPS Warning FailedBuildModel **** ingress listener not found for (443/HTTPS), with ingresses 1 ...バックエンドエンドポイントを確認します。
kubectl get endpoints <service-name> -n <namespace>コマンドを実行して、ENDPOINTSフィールドに少なくとも 1 つの正常な Pod の IP アドレスとポートが含まれていることを確認します。フィールドが空の場合は、サービスのselectorが Pod のlabelsと一致していることを確認し、Pod がRunning状態であることを確認します。Pod のステータスとログを確認します。まず、
kubectl get pod -l <app=your-app> -n <namespace>コマンドを実行して、アプリケーション Pod のステータスを確認します。次に、kubectl logs <pod-name> -n <namespace>を実行して、特定の Pod のログを調べ、起動の失敗やリクエスト処理のエラーがないか確認します。ネットワーク接続をテストします。別の Pod 内から、またはノードから直接
curlを使用して、バックエンドサービスの ClusterIP または直接 Pod IP にアクセスします。これにより、サービスがクラスター内から到達可能であることが確認されます。
Ingress TLS を設定した後も HTTPS にアクセスできない理由
原因
ALB インスタンスがポート 443 をリッスンしていない。Ingress に TLS 暗号化を設定しましたが、対応する
HTTPS:443リスナーが作成されていません。証明書の設定が正しくない。Secret のタイプが
kubernetes.io/tlsまたはIngressTLSではない、またはdataフィールドのtls.crtとtls.keyの内容が正しくないか、一致していません。証明書の更新が反映されていない。Alibaba Cloud Certificate Management Service で証明書を更新しましたが、AlbConfig で指定された証明書 ID を更新していないか、自動証明書検出のリコンサイルがトリガーされませんでした。その結果、ALB インスタンスはまだ古い証明書を参照しています。
解決策
リスナーポートを確認します。
kubectl describe albconfig <alb-name> -n <namespace>コマンドを実行して、spec.listeners.port: 443とspec.listeners.protocol: HTTPSの設定が欠落していないか確認します。Ingress の設定を確認します。Ingress の設定に
alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]アノテーションが欠落していないか確認します。このアノテーションは、Ingress を HTTP および HTTPS リスナーに関連付けます。Secret の設定を確認します。Ingress 設定の
spec.tlsのsecretNameフィールドを確認し、正しい Secret が参照されていることを確認します。kubectl get secret <secret-name> -n <namespace> -o yamlコマンドを実行して、Secret のタイプとデータ整合性を確認します。
ALB Ingress のルールが有効にならない理由
問題
新しい ALB Ingress ルールを作成した後、期待どおりに有効になりません。トラフィックが意図したバックエンドサービスに転送されません。
原因
ALB インスタンスはルーティングルールをシリアル順に維持します。複数の ALB Ingress リソースが同じ ALB インスタンスを使用している場合、1 つの ALB Ingress の設定ミスが、他のすべての ALB Ingress の変更が有効になるのを妨げます。
解決策
ALB Ingress が有効にならない場合、以前の ALB Ingress に設定ミスがある可能性があります。まず、設定ミスのある ALB Ingress を修正してください。そうすれば、新しい ALB Ingress が有効になります。
ALB Ingress に異常なアクティビティが報告されないが、変更が有効にならない場合の対処法
問題
ALB Ingress の設定を変更したり、AlbConfig に関連付けたりした後、異常なアクティビティは表示されません。しかし、変更は有効になりません。
解決策
これは、IngressClass と AlbConfig の間のバインディングが正しくない場合に発生する可能性があります。IngressClass の parameters フィールドを確認してください。詳細な手順については、「IngressClass を使用して AlbConfig を Ingress に関連付ける」をご参照ください。
ALB Ingress の転送ルールが作成直後に削除され、503 ステータスコードが発生する場合の対処法
問題
ALB Ingress の転送ルールが作成直後に削除されます。これにより、503 ステータスコードが返され、トラフィックの配信が停止します。
解決策
転送ルールにリンクされているすべての Ingress リソースに canary: true アノテーションがあるかどうかを確認します。カナリアリリースでは、トラフィックをルーティングするためのベースラインバージョンが必要です。そのため、ベースライン Ingress に canary: true を追加する必要はありません。ALB Ingress を使用した段階的リリースの手順については、「ALB Ingress を使用した段階的リリースの実装」をご参照ください。
カナリアリリースは 2 つの Ingress リソースのみをサポートし、条件が限られています。より豊富なトラフィックルーティングオプションのために、カスタム転送ルールの使用を推奨します。手順については、「ALB Ingress の転送ルールのカスタマイズ」をご参照ください。
AlbConfig が「listener is not exist in alb, port: xxx」を報告する場合
問題
ポート 80 以外のポートへのリクエストが接続に失敗します。AlbConfig は「listener is not exist in alb, port: xxx」と報告します。そのため、これらのポートはトラフィックをリッスンまたは転送していません。
解決策
デフォルトの AlbConfig には、ポート 80 のリスナーのみが含まれています。他のポートでリッスンするには、AlbConfig でそれらのポートのリスナー設定を追加します。手順については、「リスナーの作成」をご参照ください。
AlbConfig で HTTP と HTTPS のリスナーを設定した後、アクセスできない理由
問題
AlbConfig で HTTP と HTTPS のリスナーを設定しました。しかし、どちらのポートにもアクセスできません。トラフィックがリッスンまたは転送されていません。
解決策
Ingress リソースに alb.ingress.kubernetes.io/listen-ports アノテーションを追加したことを確認してください。このアノテーションは、ALB Ingress に HTTP (ポート 80) と HTTPS (ポート 443) の両方でリッスンするように指示します。例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: https-ingress
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # このアノテーションを追加して、ALB Ingress が複数のリスナーで動作するようにします。
spec:
#...ALB コンソールでの手動設定変更が失われる理由 (ルール削除、アクセスログ無効化)
問題
ALB コンソールで手動で設定を変更した後、それらの変更が消えたり、削除されたりします。アクセスログも無効になります。
解決策
ALB Ingress は、クラスター内のリソースを変更することで設定を更新します。これらの設定は、クラスターの API サーバーに ALB Ingress または AlbConfig リソースとして保存されます。ALB コンソールでの手動変更は API サーバーを更新しません。そのため、それらの変更は有効になりません。リコンサイルが実行されると、コンソールの設定は Ingress または AlbConfig の値で上書きされます。これを避けるには、ALB Ingress または AlbConfig リソースを変更して設定を更新してください。
チューニングプロセス中に「Specified parameter array contains too many items, up to 15 items, Certificates is not valid」というエラーメッセージが表示される理由
問題
リコンサイル中に、「Specified parameter array contains too many items, up to 15 items, Certificates is not valid」というエラーが表示されます。そのため、ALB Ingress は必要な証明書と関連付けることができません。
解決策
ALB Ingress Controller v2.11.0-aliyun.1 以降、証明書のページネーションがサポートされています。このエラーが表示される場合、現在の ALB Ingress Controller のバージョンは証明書のページネーションをサポートしていません。そして、ご利用のユースケースでは、1 回のリコンサイルで 15 を超える証明書を関連付けようとしています。これを修正するには、ALB Ingress Controller を最新バージョンにアップグレードしてください。バージョン情報については、「ALB Ingress Controller」をご参照ください。アップグレード手順については、「ALB Ingress Controller コンポーネントの管理」をご参照ください。
ALB インスタンスをコンソールで設定後、kubectl apply を実行して AlbConfig の ACL 設定を更新すると一部のリスナーが削除される理由
問題
コンソールで ALB インスタンスを作成して設定した後、kubectl apply を実行して AlbConfig の ACL 設定を更新します。一部のリスナーが予期せず削除されます。そのため、それらのポートやルールが機能しなくなります。
解決策
kubectl edit コマンドを使用してリソースの設定を直接更新することを推奨します。kubectl apply コマンドを使用してリソースを更新する必要がある場合は、kubectl apply を実行する前に kubectl diff コマンドを実行して変更をプレビューし、変更が期待どおりであることを確認してから、kubectl apply を使用して変更を Kubernetes クラスターに適用してください。
kubectl apply コマンドは、AlbConfig に対して上書き更新を実行します。そのため、kubectl apply を使用して AlbConfig の ACL 設定を更新する際には、YAML ファイルに完全なリスナー設定を含める必要があります。そうしないと、リストされていないリスナーは削除されます。
kubectl apply を実行した後にリスナーが削除された場合は、次のように復元します。
YAML ファイルにすべてのリスナーがリストされているか確認します。
削除されたリスナーが欠落している場合は、次のステップに進みます。そうでない場合は、スキップします。
次のコマンドを実行して AlbConfig を編集し、削除されたリスナーを再度追加します。
kubectl -n <namespace> edit albconfig <albconfig-name> # <namespace> と <albconfig-name> を AlbConfig リソースの名前空間と名前に置き換えます。
性能チューニング
サービスにおける Pod スケーリング時のサーバー調整時間の短縮
問題
Kubernetes では、サービスにアタッチされた Pod がスケーリングする際に、サーバー調整に時間がかかりすぎることがあります。これはリアルタイム弾力性に影響を与えます。調査によると、調整時間は関連する Ingress リソースの数に比例して増加します。
ソリューション
サーバーチューニングの効率を改善するには、以下の最適化策を適用できます。
Ingress 数を制限する: 1 つのサービスにアタッチする Ingress リソースは 30 個以下に制限します。
Ingress ルールを結合する: 多数の Ingress リソースがある場合は、複数のサービスを 1 つの Ingress にアタッチします。その Ingress 内で複数の転送ルールを定義することで、サーバー調整のパフォーマンスを改善します。
Flannel プラグインとローカルモードサービス使用時のノードの重み自動割り当て
問題
Flannel プラグインをローカルモードサービスと組み合わせて使用する場合、ノード間のトラフィック分散が不均一になることがあります。一部のノードは他のノードよりも高い負荷を処理します。ノードごとの Pod 数に基づいてノードの重みを自動割り当てし、バランスの取れたトラフィック分散を実現するにはどうすればよいですか?
ソリューション
ALB Ingress Controller v2.13.1-aliyun.1 以降、ノードの重み自動割り当てがサポートされています。この機能を使用するには、最新バージョンにアップグレードしてください。詳細については、「ALB Ingress Controller コンポーネントのアップグレード」をご参照ください。
Flannel クラスターでは、サービスがローカルモードの場合、ノードの重みは下図のように計算されます。この例では、アプリケーション Pod (app=nginx) が 3 つの ECS インスタンスで実行されています。サービス A はそれらを外部に公開します。
サービス内のバックエンド Pod の総数 | 説明 |
Pod 数 ≤ 100 | ALB Ingress Controller は、各ノードの重みをそのノード上の Pod 数に設定します。 例: 上図に示すように、3 つの ECS インスタンスにはそれぞれ 1、2、3 個の Pod があります。これらの重みは 1、2、3 に設定されます。これにより、3 つの ECS インスタンス間でトラフィックが 1:2:3 の比率で分散されます。これは、よりバランスの取れた Pod 負荷分散を実現します。 |
Pod 数 > 100 | ALB Ingress Controller は、ノードの重みをそのノードで実行されている Pod の総数に対する割合として計算します。 例: 3 つの ECS インスタンスに 100、200、300 個の Pod がある場合、それらの重みは 16、33、50 に設定されます。これにより、3 つの ECS インスタンス間でトラフィックが 16:33:50 の比率で分散されます。これは、よりバランスの取れた Pod 負荷分散を実現します。 |