AlbConfig の listeners フィールドは、Application Load Balancer (ALB) のリスナーを設定します。このトピックでは、listeners フィールドの更新動作について説明し、リスナーの作成、設定、削除の方法を示します。
前提条件
開始する前に、以下を確認してください。
クラスターと同じ VPC 内、かつ ALB をサポートするゾーンに、異なるゾーンの 2 つの vSwitch。詳細については、「vSwitch の作成と管理」をご参照ください。
クラスターにインストール済みの ALB Ingress コントローラー。詳細については、「ALB Ingress コントローラーの管理」をご参照ください。
ACK 専用クラスターにデプロイされたサービスへのアクセスに ALB Ingress を使用するには、まずクラスターに ALB Ingress コントローラーが必要とする権限を付与します。詳細については、「ACK 専用クラスターに ALB Ingress コントローラーへのアクセス権を付与する」をご参照ください。
AlbConfig リソース。詳細については、「AlbConfig の作成」をご参照ください。
注意事項
ACK クラスターによって作成された ALB インスタンスは、マネージドリソース (ServiceManagedResource) です。これらのインスタンスを操作する際には、以下の制限とガイドラインが適用されます。
ALB コンソールでの制限
ALB コンソールで直接リスナーを作成、変更、または削除しないでください。たとえば、コンソールでリスナーポートを変更したり、リスナーを削除したりしないでください。ACK は、AlbConfig CRD から ALB インスタンスへのリスナー設定を継続的に同期します。ALB コンソールでの手動変更は、次の同期サイクルで上書きされます。
AlbConfig をバイパスして ALB コンソールで直接リスナー設定を変更すると、以下のような問題が発生します:
ALB コンソールは、リスナー設定を変更しようとすると
OperationDenied.ServiceManagedResourceエラーを返します。手動で追加されたリスナー (例:ポート 443) は、ACK が設定を同期した後に自動的に削除される場合があります。
既存の ALB インスタンスを ACK で再利用する場合、手動で設定したリスナー設定は保持されません。
正しい設定パス
HTTPS 証明書、ポート、リクエストタイムアウトを含むすべてのリスナー設定は、Kubernetes クラスター内の AlbConfig カスタムリソースを通じてのみ管理する必要があります。AlbConfig は ALB リスナー設定の信頼できる唯一の情報源であり、ALB コンソールから変更してはなりません。
リスナーのパラメーター
以下の表に、AlbConfig の spec.listeners で使用できるすべてのパラメーターを示します。
パラメーター | タイプ | デフォルト | プロトコル | 説明 |
| 整数 | — | HTTP、HTTPS、QUIC | リスナーポート。必須。この値を変更すると、元のリスナーが削除され、新しいリスナーが作成されます。 |
| 文字列 | — | HTTP、HTTPS、QUIC | リスナープロトコル。必須。この値を変更すると、元のリスナーが削除され、新しいリスナーが作成されます。 |
| 文字列 | — | HTTPS | リスナーに割り当てる証明書 ID。 |
| ブール値 | — | HTTPS | デフォルトの証明書であるかどうか。 |
| ブール値 |
| HTTPS | CA 証明書検証を有効にするかどうか。 |
| 文字列 | — | HTTPS | TLS セキュリティポリシー ID。例: |
| 整数 |
| HTTP、HTTPS | HTTP 504 を返す前にバックエンドサーバーからの応答を待機する最大時間 (秒単位) 。有効な値:1~600。 |
| 文字列 | — | — | タグキー。 |
| 文字列 | — | — | タグ値。 |
| ブール値 | — | HTTP、HTTPS | データ圧縮を有効にするかどうか。 |
| ブール値 |
| HTTP、HTTPS | クライアント IP を |
| ブール値 | — | HTTP、HTTPS | バックエンドサーバーに転送されるリクエストヘッダーにリスナープロトコルを含めるかどうか。 |
| ブール値 | — | HTTP、HTTPS | バックエンドサーバーに転送されるリクエストヘッダーに SLB インスタンス ID を含めるかどうか。 |
| ブール値 | — | HTTP、HTTPS | バックエンドサーバーに転送されるリクエストヘッダーにリッスンポートを含めるかどうか。 |
| ブール値 | — | HTTP、HTTPS |
|
| 文字列 | — | HTTP、HTTPS | 信頼できるプロキシ IP アドレスまたは CIDR ブロックのセミコロン区切りリスト。 |
| 文字列 | — | HTTP、HTTPS | ACL タイプ: |
| 文字列 | — | HTTP、HTTPS | アクセス制御用の CIDR ブロック。各エントリは完全な CIDR ブロックである必要があります。 |
listeners フィールドの更新方法
listeners フィールドは配列であるため、完全置換 によって更新されます。つまり、新しい設定が既存の設定を完全に置き換えます。この動作を理解することで、更新された AlbConfig を適用したときに何が起こるかを予測しやすくなります。
主要な用語
オブジェクト設定ファイル:適用する YAML ファイルで、AlbConfig の望ましい状態が含まれています。
既存のオブジェクト設定ファイル:クラスターで現在有効な設定。
last-applied-configuration:以前の設定を記録する Kubernetes アノテーション。リアルタイムでは更新されません。
更新ルール
シナリオ | 新しい設定に | 既存の設定に |
| 結果 |
① | はい | はい | — | マージ:新しい設定の値を適用して、既存のオブジェクトを更新します。 |
② | はい | いいえ | — | 作成:新しいリスナーを追加します。 |
③ | いいえ | — | はい | 削除:リスナーを削除します。デフォルト値にリセットされる場合があります。 |
④ | いいえ | はい | いいえ | 削除:既存の設定からリスナーを削除します。 |
例
次の例では、listeners フィールドを更新する際にルールがどのように適用されるかを示します。
新しい設定 (オブジェクト設定ファイル):
listeners:
- port: 8001
protocol: HTTP
- port: 8003
protocol: HTTP
- port: 8005 # 新規 — 追加される
protocol: HTTP既存の設定:
listeners:
- port: 8001
protocol: HTTP
- port: 8002 # 新しい設定になく、last-applied-configuration にあるため — 削除される
protocol: HTTP
- port: 8003
protocol: HTTP
- port: 8004 # 新しい設定になく、last-applied-configuration にないため — 削除される
protocol: HTTPlast-applied-configuration:
listeners:
- port: 8001
protocol: HTTP
- port: 8002
protocol: HTTP
- port: 8003
protocol: HTTP新しい設定を適用した後の結果:
listeners:
- port: 8001 # 条件①に一致 — 保持される
protocol: HTTP
- port: 8003 # 条件①に一致 — 保持される
protocol: HTTP
- port: 8005 # 条件②に一致 — 追加される
protocol: HTTP
# ポート 8002 は条件③に一致 — 削除される
# ポート 8004 は条件④に一致 — 削除される
リスナーの作成
リスナーは、ALB インスタンスがアプリケーション層の情報に基づいてトラフィックを受信し、転送するためのエントリーポイントです。port と protocol フィールドを組み合わせることで、リスナーが一意に識別されます。
port または protocol を変更すると、元のリスナーが削除され、新しいリスナーが作成されます。
HTTP リスナーは自動的に WebSocket をサポートします。追加の設定は不要です。
protocol に指定できるプロトコルは、HTTP、HTTPS、QUIC です。
コンソール
Container Service for Kubernetes (ACK) コンソールにログインし、左側メニューで [クラスター] をクリックします。
クラスター名をクリックします。左側メニューで、[ワークロード] > [カスタムリソース] を選択します。
リソースオブジェクト タブで、検索ボックスに
AlbConfigと入力し、検索結果の [AlbConfig] をクリックします。[AlbConfig] パネルで、AlbConfig リソース (デフォルトでは
albという名前) を見つけ、[操作] 列の YAML の編集 をクリックします。YAML の編集 パネルで、
spec.listeners.portとspec.listeners.protocolフィールドを追加し、[OK] をクリックします。
kubectl
次のコマンドを実行して AlbConfig を編集します。
kubectl edit albconfig <AlbConfig_Name>spec の下に listeners フィールドを追加します。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
# ... 他の設定フィールド
listeners:
- port: 80
protocol: HTTP # オプション:HTTP、HTTPS、QUICALB インスタンスの自動作成失敗の一般的な原因
AlbConfig が ALB インスタンスの自動作成に失敗する場合、リスナー設定が不完全であることが最も一般的な原因の 1 つです。たとえば、Ingress ルートで TLS/HTTPS が必要なのに、AlbConfig にポート 80 (HTTP) とポート 443 (HTTPS) の両方のリスナーが含まれていない場合や、必要な HTTPS 証明書が見つからないか、設定が誤っている場合、インスタンスの作成や同期が失敗することがあります。
この問題を回避するには、適用する前に AlbConfig のリスナー設定が Ingress の要件と一致していることを確認してください。
TLS/HTTPS Ingress ルートが使用される場合、ポート 80 とポート 443 の両方のリスナーが定義されていること。
有効な証明書が HTTPS リスナーに割り当てられているか、ドメイン名に基づく証明書の自動検出が正しく設定されていること。
HTTPS 証明書の設定
certificates フィールドを設定して、HTTPS リスナーに 1 つ以上の証明書を割り当てます。ALB は最初の証明書をデフォルトの証明書として設定します。ALB は、デフォルトの証明書の有効期限が切れたり、適用できなくなったりした場合にのみ、他の証明書をリクエストの暗号化に使用します。
証明書を指定しない場合、リスナーはすぐには作成されません。代わりに、Ingress が関連付けられ、ドメイン名に基づいて証明書が自動的に検出された後に作成されます。詳細については、「HTTPS 証明書を設定して暗号化通信を行う」をご参照ください。
listeners:
- caEnabled: false
certificates:
- CertificateId: 756****-cn-hangzhou # 証明書 ID
IsDefault: true
port: 443
protocol: HTTPSTLS セキュリティポリシーの設定
securityPolicyId を設定して、HTTPS リスナーに TLS セキュリティポリシーを適用します。カスタムポリシーまたは事前定義されたポリシーを使用できます。詳細については、「TLS セキュリティポリシー」をご参照ください。
listeners:
- port: 443
protocol: HTTPS
securityPolicyId: tls_cipher_policy_1_1 # セキュリティポリシー IDリクエストタイムアウトの設定
requestTimeout を設定して、Application Load Balancer (ALB) がクライアントリクエストを受信した後、バックエンドサーバーからの応答を待機する時間を制御します。タイムアウト期間内に応答が返されない場合、ALB インスタンスは待機を停止し、HTTP 504 エラーをクライアントに返します。
デフォルト:
60秒有効な値:1~600 (整数、秒単位)
600 を超える値を使用するには、クォータセンターでクォータ引き上げを申請してください。
listeners:
- port: 80
protocol: HTTP
requestTimeout: 60 # 秒単位。デフォルト:60。有効な値:1~600。適用範囲
requestTimeout はリスナーレベル (ポートレベル) のパラメーターです。ALB インスタンスの同じリスナーポートを使用するすべてのルートにグローバルに適用されます。同じリスナー上の個別のルートに対して、異なるフロントエンドアイドルセッションタイムアウトを設定することはサポートされていません。
AI ストリーミング応答のサポート
ALB は、AI ストリーミング応答インターフェイス (例:大規模言語モデルのストリーミング出力) をサポートしています。ALB を AI ストリーミングワークロードで使用する場合:
ストリーミング転送の全期間をカバーできる十分に大きな値に
requestTimeoutを設定します。値が低すぎると、ストリームが完了する前に ALB が接続を閉じ、クライアントに HTTP 504 エラーを返します。WAF やバックエンドサービスなど、リクエストチェーン内のすべてのコンポーネントのタイムアウト設定を確認し、ストリーミングセッションを中断させる早期の接続終了を回避してください。
リスナータグの追加
tags フィールドを使用して、リスナーにキーと値のタグを追加します。
listeners:
- port: 80
protocol: HTTP
tags:
- key: "key"
value: "value1"データ圧縮の有効化
gzipEnabled を設定して、ALB がクライアントに転送する前に応答データを圧縮するかどうかを制御します。
true:コンテンツタイプに応じて、Brotli または Gzip を使用して応答を圧縮します。false:すべてのコンテンツタイプの圧縮を無効にします。
圧縮は、応答ヘッダーの Content-Length が 1,024 バイトを超える場合にのみトリガーされます。2 つの圧縮アルゴリズムは次のように動作します:
Brotli:すべてのコンテンツタイプを圧縮します。
Gzip:
text/plain、text/css、application/javascript、application/x-javascript、application/rss+xml、application/atom+xml、application/xml、application/jsonを圧縮します。
次の例では、圧縮を無効にします。
listeners:
- port: 80
protocol: HTTP
gzipEnabled: false # true:特定のコンテンツタイプを圧縮します。false:すべての圧縮を無効にします。X-Forwarded-For ヘッダーの設定
xForwardedForConfig フィールドを使用して、ALB がバックエンドサーバーにトラフィックを転送する際にリクエストヘッダーに含める情報を制御します。
すべての xForwardedForConfig パラメーターは、HTTP および HTTPS リスナーにのみ適用されます。
クライアント IP アドレスの取得
XForwardedForEnabled は常に有効であり、無効にすることはできません。有効にすると、ALB はクライアントのソース IP を X-Forwarded-For ヘッダーに追加します。
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForEnabled: trueリスナープロトコルの取得
XForwardedForProtoEnabled を true に設定すると、バックエンドサーバーに転送されるヘッダーにリスナープロトコルが含まれます。
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForProtoEnabled: trueSLB インスタンス ID の取得
XForwardedForSLBIdEnabled を true に設定すると、バックエンドサーバーに転送されるヘッダーに SLB インスタンス ID が含まれます。
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBIdEnabled: true # true:SLB インスタンス ID を含めます。false:省略します。リッスンポートの取得
XForwardedForSLBPortEnabled を true に設定すると、バックエンドサーバーに転送されるヘッダーにリッスンポートが含まれます。
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBPortEnabled: true # true:リッスンポートを含めます。false:省略します。プロキシ背後の実際のクライアント IP の取得
リクエストがプロキシを通過すると、X-Forwarded-For ヘッダーに IP アドレスのチェーンが含まれることがあります。XForwardedForClientSourceIpsEnabled を true に設定すると、ALB はリストを右から左にたどり、信頼リストにない最初の IP を選択することで、実際のクライアント IP を識別できます。
XForwardedForClientSourceIpsTrusted を使用して、信頼するプロキシ IP を指定します。これにより、ソース IP によるレート制限などのシナリオに対応できます。
形式:セミコロンで区切られた IP アドレスまたは CIDR ブロック。スペースは含めません。
XForwardedForClientSourceIpsTrustedは、XForwardedForClientSourceIpsEnabledがtrueの場合にのみ有効です。
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSourceIpsEnabled: true
XForwardedForClientSourceIpsTrusted: 192.168.x.x;192.168.x.x/16 # セミコロン区切り、スペースなしアクセス制御の設定
aclConfig フィールドを使用して、ALB リスナーでアクセス制御を有効にします。アクセス制御を使用すると、許可リストまたはブロックリストを設定して、特定の IP アドレスを許可またはブロックできます。詳細については、「ACL を設定してアクセスを制御する」をご参照ください。
aclType:許可リストの場合はWhite、ブロックリストの場合はBlackに設定します。aclEntries:CIDR ブロックのリスト。各エントリは完全な CIDR ブロックである必要があります。
listeners:
- port: 80
protocol: HTTP
aclConfig:
aclEntries:
- 127.0.0.1/32 # 完全なCIDRブロックである必要があります
aclType: White # White:許可リスト。Black:ブロックリスト。リスナーの削除
リスナーを削除するには、AlbConfig.spec.listeners フィールドから削除します。
リスナーを削除する前に、リスナーに関連付けられているすべての Ingress を削除してください。Ingress がまだ関連付けられている場合、削除は失敗します。
変更前:
listeners:
- port: 8001
protocol: HTTP
- port: 8002 # 削除するリスナー
protocol: HTTP変更後:
listeners:
- port: 8001
protocol: HTTP