AlbConfig CRD を使用することで、ALB インスタンスとリスナーを作成、設定、再利用できるほか、IPv6、Simple Log Service (SLS) のアクセスログ、TLS ポリシー、ネットワーク ACL にも対応しています。
前提条件
クラスターに ALB Ingress Controller がインストールされていること。
ACK クラスターと同じ VPC に、ALB がサポートする異なるゾーンの VSwitch が 2 つ作成されていること。
ACK 専用クラスターで ALB Ingress を使用するには、まず クラスターに必要な権限を付与してください。
注意事項
リソース設定を変更するには、
kubectl editを使用します。kubectl applyを使用する場合は、適用する前にkubectl diffを実行して変更内容をプレビューしてください。クラスターで Flannel ネットワークプラグインを使用している場合、 ALB Ingress のバックエンド Service は NodePort または LoadBalancer タイプである必要があります。
AlbConfig が作成した ALB インスタンスは、 ALB Ingress Controller が制御するマネージドリソースです。これらのインスタンスを ALB コンソールから直接変更しないでください (例:コンソールでタグ、 ACL、アクセスログ、タイムアウト設定を変更しないでください)。コンソールでの変更は、コントローラーの調整ループによって上書きされたり、エラーが発生したりする可能性があります。マネージド ALB インスタンスの設定を更新するには、クラスター内の AlbConfig リソースを変更してください。コントローラーが自動的に変更を ALB インスタンスに同期します。
主要パラメーターの概要
よく使われる AlbConfig パラメーターは次のとおりです。
パラメーター | タイプ | デフォルト | 作成時のみ | 説明 |
| 文字列 | — | いいえ | ALB インスタンスの名前 |
| 文字列 |
| いいえ | ALB インスタンスの IP モード。有効値: |
| 文字列 |
| はい |
|
| 文字列 | — | はい | IPv4/IPv6 デュアルスタックを有効にするには、 |
| 配列 | — | はい | vSwitch ID (異なるゾーンに 2 つ以上) |
| 文字列 |
| いいえ | ALB インスタンスのエディション |
| 文字列 | — | いいえ | 再利用する既存の ALB インスタンスの ID |
| ブール値 |
| いいえ | 再利用する ALB インスタンスの属性を上書きするかどうか |
| ブール値 |
| いいえ | 再利用するインスタンスのリスナー属性を上書きするかどうか |
| 文字列 | — | いいえ | SLS のログプロジェクト |
| 文字列 | — | いいえ | SLS の Logstore ( |
| 文字列 | — | いいえ | Internet Shared Bandwidth インスタンス ID |
| 整数 | — | いいえ | リスナーのポート |
| 文字列 | — | いいえ |
|
| 整数 |
| いいえ | リクエストタイムアウト (単位:秒、範囲:1~600) |
| ブール値 |
| いいえ | Gzip/Brotli 圧縮を有効にします。 |
ALB インスタンスの設定
AlbConfig の作成
各 AlbConfig は 1 つの ALB インスタンスを設定します。複数の ALB インスタンスを使用する場合は、インスタンスごとに AlbConfig を 1 つ作成します。
ALB Ingress Controller をインストールし、[ゲートウェイソース] で [Create] または [Select Existing] を選択すると、コントローラーは alb という名前の AlbConfig と、alb という名前の IngressClass を自動的に作成します。
次の内容で
alb.yamlを作成します:パラメーター
説明
spec.config.nameALB インスタンスの名前です。クラスター内で一意である必要があります。
spec.config.addressTypeInternet(デフォルト):パブリック IP。Intranet:VPC 内部のみ。作成時のみ設定可能で、後から変更できません。spec.config.zoneMappingsクラスターと同じ VPC に、異なるALB 対応ゾーンの vSwitch を少なくとも 2 つ指定します。作成時のみ設定可能で、後から変更できません。 単一ゾーンのリージョンでは、vSwitch を 1 つ指定できます。
spec.config.zoneMappings[].allocationId(オプション) ALB インスタンスに関連付ける EIP の ID です。省略した場合、従量課金の BGP (マルチ ISP) EIP が自動的に作成されます。Internet Shared Bandwidth インスタンスに属していない、従量課金 (データ転送量による課金) の EIP のみを使用できます。異なるゾーンの EIP は同一タイプである必要があります。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: name: alb addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 使用する vSwitch ID に置き換えてください。 allocationId: eip-asdfas**** # 使用する EIP ID に置き換えてください。省略した場合、EIP は自動的に割り当てられます。 - vSwitchId: vsw-uf6nun9tql5t8nh15**** allocationId: eip-dpfmss**** listeners: - port: 80 protocol: HTTPAlbConfig のデフォルト設定 (
vSwitchIdを除く):apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: accessLogConfig: logProject: "" logStore: "" addressAllocatedMode: Dynamic addressType: Internet billingConfig: internetBandwidth: 0 internetChargeType: "" payType: PostPay deletionProtectionEnabled: true edition: Standard forceOverride: false zoneMappings: - vSwitchId: #... - vSwitchId: #... status: loadBalancer: dnsname: alb-s2em8fr9debkg5****.cn-shenzhen.alb.aliyuncs.com id: alb-s2em8fr9debkg5****設定を適用します:
kubectl apply -f alb.yaml想定される出力:
AlbConfig.alibabacloud.com/alb createdAlbConfig を確認します:
HTTPS リスナーと証明書を設定するまで、
PORT&PROTOCOLとCERTIDは空です。kubectl get AlbConfig想定される出力:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb alb-****** alb-******.<regionID>.alb.aliyuncs.com 28m
AlbConfig の更新
AlbConfig の一覧を表示します:
kubectl get AlbConfigAlbConfig を編集します:
kubectl edit albconfig <ALBCONFIG_NAME>例:ALB インスタンスの名前を
new_albに変更するには、次のように設定します:spec: config: name: new_alb
AlbConfig の削除
AlbConfig を使用して ALB インスタンスを作成した場合、AlbConfig を削除すると ALB インスタンスも削除されます。
削除する前に、AlbConfig に関連付けられているすべての Ingress を削除してください。
kubectl delete AlbConfig <AlbConfig_NAME>Internet Shared Bandwidth インスタンスのバインド
Internet Shared Bandwidth インスタンスを ALB インスタンスにバインドするには、billingConfig.bandWidthPackageId を設定します。
これはインターネット向けの ALB インスタンスにのみ適用されます。Internet Shared Bandwidth インスタンスを購入するには、「Create an Internet Shared Bandwidth」をご参照ください。
spec:
config:
name: alb
addressType: Internet
edition: Standard
zoneMappings:
- vSwitchId: vsw-2vcqeyvwsnd***
- vSwitchId: vsw-2vcbhjlqu7y***
billingConfig:
bandWidthPackageId: cbwp-2vcjucp49otd8qolhm***複数の ALB インスタンスの作成と使用
複数の ALB インスタンスを使用するには、インスタンスごとに AlbConfig と IngressClass を個別に作成します。
1.
alb-2.yamlを作成します:apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-2 spec: config: name: alb-2 addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15****2. 適用します:
kubectl apply -f alb-2.yaml3.
ingress_class2.yamlを作成します:クラスター v1.19 以降
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb-2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-2クラスター v1.19 より前
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: alb-2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-24. 適用します:
kubectl apply -f ingress_class2.yaml5.
ingress2.yamlを作成します。ingressClassNameに、対象の ALB インスタンスの IngressClass 名を設定します。クラスター v1.19 以降
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress2 spec: ingressClassName: alb-2 rules: - http: paths: - path: /tea pathType: ImplementationSpecific backend: service: name: tea-svc port: number: 80 - path: /coffee pathType: ImplementationSpecific backend: service: name: coffee-svc port: number: 80クラスター v1.19 より前
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: cafe-ingress2 spec: ingressClassName: alb-2 rules: - http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80 - path: /coffee backend: serviceName: coffee-svc servicePort: 806. 適用します:
kubectl apply -f ingress2.yaml
IngressClass による AlbConfig と Ingress の関連付け
IngressClass を使用して、AlbConfig を ALB Ingress にバインドします。
IngressClass の作成
ingress_class.yaml を作成します:
クラスター v1.19 以降
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.alibabacloud/alb
parameters:
apiGroup: alibabacloud.com
kind: AlbConfig
name: albクラスター v1.19 より前
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.alibabacloud/alb
parameters:
apiGroup: alibabacloud.com
kind: AlbConfig
name: alb適用します:
kubectl apply -f ingress_class.yaml想定される出力:
ingressclass.networking.k8s.io/alb createdIngressClass を参照する Ingress の作成
ingress.yaml を作成し、ingressClassName を IngressClass 名に設定します:
クラスター v1.19 以降
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /tea
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
- path: /coffee
pathType: ImplementationSpecific
backend:
service:
name: coffee-svc
port:
number: 80クラスター v1.19 より前
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80適用します:
kubectl apply -f ingress.yaml想定される出力:
ingress.networking.k8s.io/cafe-ingress created再利用 ALB インスタンスの管理
既存の ALB インスタンスの再利用
spec.config.id をセットして、既存の ALB インスタンスを再利用します。ALB コンソールのスタンダードインスタンスと WAF 対応インスタンスがサポートされています。ベーシックインスタンスは再利用できません。ALB インスタンスは 1 つのクラスターでのみ再利用でき、かつそのクラスター内の 1 つの AlbConfig でのみ再利用できます。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: reuse-alb
spec:
config:
id: ****
forceOverride: false
listenerForceOverride: falseid、forceOverride、listenerForceOverride の相互作用は次のとおりです。
|
|
| 結果 |
未設定 | — | — | ALB インスタンスは再利用されません。 |
設定済み |
| — | ALB インスタンスとリスナーの属性が上書きされます。 |
設定済み |
|
|
|
設定済み |
|
| ALB インスタンスの属性は上書きされません。コントローラーはすべてのリスナーを管理します。リスナーの有無と設定は AlbConfig によって決まります。 |
再利用している ALB インスタンス上のリスナー名は変更しないでください。ingress-auto-listener-{port} という名前のリスナーは ALB Ingress コントローラーによって管理され、その他の名前のリスナーは ALB コンソールで管理されます。
再利用 ALB インスタンスの AlbConfig の削除
再利用している ALB インスタンスの AlbConfig を削除しても、ALB インスタンス自体は削除されません。
ALB Ingress コントローラー 2.10.0-aliyun.1 以前:
kubectl editを実行し、spec.listenersからすべてのエントリを削除します。これにより、AlbConfig を介して設定されたリスナーが削除されます。2.10.0-aliyun.1 より後のバージョンでは、この手順をスキップしてください。AlbConfig に関連付けられているすべての Ingress を削除してから、AlbConfig を削除します。
kubectl delete AlbConfig <AlbConfig_NAME>
詳細設定
SLS によるアクセスログの収集
spec.config.accessLogConfig で logProject と logStore を設定します:
spec:
config:
accessLogConfig:
logProject: "k8s-log-xz92lvykqj1siwvif****"
logStore: "alb_****"logStoreの値はalb_で始まる必要があります。指定した Logstore が存在しない場合、新しいものが自動的に作成されます。
ログプロジェクトは、ACK コンソールのクラスターの [クラスター情報] > [基本情報] で確認できます。
再利用された ALB インスタンス で SLS を有効にするには、forceOverride: true を設定します。有効化後、[基本情報] の [ログサービスプロジェクト] の横にあるプロジェクト名をクリックして、SLS でログを表示します。
IPv6 の有効化
addressIpVersion: DualStack を設定して、IPv4/IPv6 デュアルスタックを有効にします:
addressIpVersion は作成時にのみ有効で、後で変更することはできません。
spec:
config:
addressIpVersion: DualStackリスナーの設定
リスナーの作成
spec.listeners で port と protocol を設定することで、ALB がトラフィックを受信する方法を定義します。サポートされているプロトコル: HTTP、HTTPS、QUIC。
リスナーの port、protocol、またはその他の属性を変更すると、既存のリスナーが削除され、新しいリスナーが作成されます。異なるプロトコルで複数のリスナーを設定するには、必要なアノテーションを Ingress に追加してください。
HTTP リスナー
spec:
listeners:
- port: 80
protocol: HTTPHTTP はネイティブで WebSocket をサポートしています。追加の設定は必要ありません。
HTTPS リスナー
spec:
listeners:
- port: 443
protocol: HTTPSHTTPS リスナーには証明書が必要です。
QUIC リスナー
spec:
listeners:
- port: 443
protocol: QUICQUIC リスナーは、クライアントから HTTP/3 リクエストを受信します。
証明書の指定
HTTPS リスナーに証明書を追加するには、kubectl edit albconfig <Albconfig_Name> を実行し、certificates フィールドを設定します。
spec:
listeners:
- caEnabled: false
certificates:
- CertificateId: 756****-cn-hangzhou
IsDefault: true
port: 443
protocol: HTTPSデフォルト証明書が指定されていない場合、ALB Ingress は最初の証明書をデフォルトとして使用します。
証明書が指定されていない場合、Ingress が関連付けられ、ドメイン名に基づいて証明書が自動的に検出されるまで、リスナーの作成は延期されます。
詳細については、「暗号化通信のための HTTPS 証明書の設定」をご参照ください。
リスナーの削除
kubectl edit albconfig <Albconfig_Name> を実行し、spec.listeners からリスナーエントリを削除します。
リスナーを削除する前に、すべての Ingress をリスナーから関連付け解除してください。そうしないと、エラーが発生し、削除に失敗します。
例えば、ポート 8002 のリスナーを削除する場合:
# 変更前
listeners:
- port: 8001
protocol: HTTP
- port: 8002
protocol: HTTP
# 変更後
listeners:
- port: 8001
protocol: HTTPリスナー更新の仕組み
listeners 配列は、新しい設定を現在の状態および last-applied-configuration アノテーションと比較することでリコンサイルされます。
新しい設定 | 現在の設定 |
| 結果 |
あり | あり | — | リスナーは保持されます。 |
あり | なし | — | リスナーが追加されます。 |
なし | — | あり | リスナーが削除されます。フィールドはデフォルト値にリセットされる場合があります。 |
なし | あり | なし | リスナーが削除されます。 |
例:
次の 3 つの状態がある場合:
# 新しい設定
listeners:
- port: 8001
protocol: HTTP
- port: 8003
protocol: HTTP
- port: 8005 # 新規
protocol: HTTP
# 現在の設定
listeners:
- port: 8001
protocol: HTTP
- port: 8002
protocol: HTTP
- port: 8003
protocol: HTTP
- port: 8004
protocol: HTTP
# last-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: 削除 (新しい設定に存在しない、last-applied-configuration に存在)
# ポート 8004: 削除 (新しい設定に存在しない、現在の設定に存在、last-applied-configuration に存在しない)
接続タイムアウト期間の設定
requestTimeout を設定して、ALB がクライアントに HTTP 504 を返す前にバックエンドレスポンスを待機する時間を制御します。有効な範囲: 1~600秒。デフォルト: 60秒。
spec:
listeners:
- port: 80
protocol: HTTP
requestTimeout: 40
リスナーの高度な設定
データ圧縮の設定
圧縮を有効にするには、gzipEnabled: true に設定します。すべてのファイルタイプが Brotli 圧縮をサポートしており、以下のファイルタイプは Gzip 圧縮もサポートしています: text/xml、text/plain、text/css、application/javascript、application/x-javascript、application/rss+xml、application/atom+xml、application/xml、および application/json。
圧縮アルゴリズム: クライアントが Brotli と Gzip の両方をサポートしている場合、ALB はより効率的な Brotli を使用します。
圧縮条件: ALB は、
Content-Lengthレスポンスヘッダーが 1,024 バイトを超え、かつクライアントからのAccept-Encodingリクエストヘッダーに対応する圧縮アルゴリズムが含まれている場合にのみ、レスポンスを圧縮します。
spec:
listeners:
- port: 80
protocol: HTTP
gzipEnabled: trueクライアント IP アドレスの保持
ALB は、リクエストをバックエンドに転送する前に、クライアント IP アドレスを X-Forwarded-For ヘッダーに追加します。
HTTP および HTTPS リスナーでのみ使用できます。
XForwardedForEnabledはデフォルトで有効であり、無効にできません。
spec:
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForEnabled: true # このパラメーターは false に設定できません。複数のプロキシ層がある環境のベストプラクティス: XForwardedForEnabled: true はデフォルトで X-Forwarded-For ヘッダーを伝播しますが、リクエストが複数のプロキシを通過する際に IP 値が偽装される可能性があります。 複数のプロキシ層がある本番環境では、XForwardedForClientSourceIpsTrusted と共に XForwardedForClientSourceIpsEnabled: true を使用して、信頼できるプロキシチェーンからクライアント IP アドレスを取得する。
クライアント接続メタデータの取得
xForwardedForConfig を使用して、クライアントとリスナーのメタデータをバックエンドに転送されるリクエストヘッダーに追加します。以下のすべてのフィールドは、HTTP および HTTPS リスナーで利用可能です。
フィールド | ~に設定する場合: |
| クライアントが ALB インスタンスへの接続に使用したポートを追加します。 |
| ALB インスタンスが使用したリスナープロトコルを追加します。 |
| ALB インスタンス ID を追加します。 |
| ALB インスタンスのリッスンポートを追加します。 |
例 — 4 つすべてのヘッダーを追加する場合:
spec:
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSrcPortEnabled: true
XForwardedForProtoEnabled: true
XForwardedForSLBIdEnabled: true
XForwardedForSLBPortEnabled: true信頼できるプロキシチェーンからのクライアント IP アドレスの取得
リクエストが複数のプロキシを通過するときに X-Forwarded-For から実際のクライアント IP を抽出するには、XForwardedForClientSourceIpsEnabled: true を設定します。XForwardedForClientSourceIpsTrusted を使用して、信頼できるプロキシ IP または CIDR ブロックを指定します。ALB は X-Forwarded-For を右から左にたどり、信頼できない最初の IP をクライアント IP として扱います。
たとえば、X-Forwarded-For が <client IP, proxy-1, proxy-2> の場合、proxy-1 と proxy-2 を信頼リストに追加します。
HTTP および HTTPS リスナーでのみ使用できます。
spec:
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSourceIpsEnabled: true
XForwardedForClientSourceIpsTrusted: 192.168.x.x;192.168.x.x/16カスタム TLS セキュリティポリシーの設定
HTTPS リスナーで securityPolicyId を設定して、デフォルトまたはカスタムの TLS セキュリティポリシー を適用します。
spec:
listeners:
- port: 443
protocol: HTTPS
securityPolicyId: tls_cipher_policy_1_1信頼できるプロキシ IP アドレスの設定
信頼できるプロキシ IP アドレスの指定 をご参照ください。
ネットワーク ACL の設定
aclConfig を使用して、リスナーレベルで特定の IP アドレスまたは CIDR ブロックからのトラフィックを許可または拒否します。
spec:
listeners:
- port: 80
protocol: HTTP
aclConfig:
aclEntries:
- 127.0.0.1/32
aclType: Whiteパラメーター | 説明 |
|
|
| ACL ルールに含める IP アドレスまたは CIDR ブロック。例: |
ACL の設定 をご参照ください。
トラブルシューティング
AlbConfig YAML ファイルの保存時のエラー:alb: listener port number must between [1:65535], or you should set listen port explicitly in listener config.
原因
AlbConfig YAML ファイルでは、- は spec.listener セクションで単一のリスナー設定の開始を示します。左側の誤った例では、3 つの - が使用されており、3 つのリスナーが定義されています。最後の - エントリの certificates セクションに port 設定がないため、エラーが発生します。
解決策
各リスナー設定は、ハイフン (-) で始める必要があります。右側の修正後の例では、certificates の前のハイフン (-) が削除されているため、証明書の設定は HTTPS: 443 リスナーの一部になります。
誤った例: | 修正された例: |
AlbConfig YAML ファイルで ALB インスタンスのネットワークタイプ (addressType) や vSwitch (zoneMappings.vSwitchId) を変更しても反映されないのはなぜですか。
原因
Application Load Balancer (ALB) インスタンスのネットワークタイプや vSwitch 設定は、AlbConfig YAML ファイルで addressType や zoneMappings.vSwitchId を編集しても変更できません。

解決策
まず、ALB コンソールでインスタンスの設定の読み取り専用モードを無効にします。次に、ALB インスタンスのネットワークタイプまたは vSwitch 設定を手動で変更します。設定を変更した後、再度、設定の読み取り専用モードを有効にします。
ALB コンソールにログインします。対象リージョンで、AlbConfig ファイルの
status.loadBalancer.idに対応するインスタンス ID をクリックします。インスタンスの詳細 タブの インスタンスプロパティ セクションで、[設定の読み取り専用モードを無効にする] をクリックし、確認します。
ネットワークタイプの変更 または ゾーン/サブネットの変更 をクリックして、ALB インスタンスのネットワークタイプまたは vSwitch 設定を変更します。
変更が完了したら、再度、[設定の読み取り専用モード] を有効にします。
HTTPS リスナーのエラー:empty https listener default certs
原因
AlbConfig に HTTPS リスナーが設定されていますが、certificates フィールドに証明書 ID が指定されていません。関連付けられた Ingress が存在せず、ドメイン名に基づいて証明書を自動的に検出できないため、コントローラーはリスナーを作成できません。
解決策
方法1 (推奨):HTTPS リスナーの
certificatesフィールドに証明書 ID を指定します。詳細については、「証明書の指定」をご参照ください。listeners: - port: 443 protocol: HTTPS certificates: - CertificateId: <your-certificate-id> # 実際の証明書IDに置き換えてください。 IsDefault: true方法2:AlbConfig で、ポート 80 に HTTP リスナーを設定し、ターゲットドメイン名に関連付けられた Ingress リソースを作成します。Ingress が作成された後、ALB Ingress Controller はドメイン名に基づいて Ingress から証明書を自動的に検出し、HTTPS リスナーにアタッチします。