ALB マルチクラスターゲートウェイを使用して、複数の ACK クラスターにまたがる南北のトラフィックを管理します。ゾーン間のアクティブな冗長性、負荷分散、ヘッダーに基づくルーティングを実現でき、各クラスターごとに個別の Ingress コントローラーを管理する必要はありません。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
フリート管理が有効 — 「マルチクラスター管理を有効化する」をご参照ください。
VPC(仮想プライベートクラウド)内に同一の VPC に属する 2 つの ACK クラスターと関連付けられた ACK One Fleet インスタンス — 「関連付けられたクラスターの管理」をご参照ください。
ACK One コンソールからダウンロードした Fleet インスタンスの kubeconfig ファイル(kubectl が Fleet インスタンスに接続済み)
仕組み
トラフィックは、インターネットから ALB インスタンスを経由し、関連付けられたクラスター内の Pod へと流れます。
インターネット → ALB インスタンス → ACK One Fleet インスタンス → 関連付けられたクラスター 1(Pod)
→ 関連付けられたクラスター 2(Pod)Fleet インスタンスはコントロールプレーンとして機能します。Fleet インスタンス上に作成された AlbConfig オブジェクトにより ALB インスタンスがプロビジョニングされます。また、Fleet インスタンス上の Ingress ルールによって、ALB がすべての関連付けられたクラスターの Pod に対してトラフィックをどのようにルーティングするかが制御されます。
手順 1:ALB マルチクラスターゲートウェイの作成
Fleet インスタンス上で AlbConfig オブジェクトを作成し、ALB インスタンスをプロビジョニングするとともに、関連付けられたクラスターをトラフィックターゲットとして登録します。
Fleet インスタンスが配置されている VPC 内の 2 つの vSwitch の ID を取得します。
以下の内容で
gateway.yamlを作成します。${vsw-id1}および${vsw-id2}をそれぞれの vSwitch ID に置き換え、${cluster1}および${cluster2}を関連付けられたクラスターの ID に置き換えます。各関連付けられたクラスター(
${cluster1}および${cluster2})について、セキュリティグループのインバウンドルールを設定し、vSwitch CIDR ブロック内のすべての IP アドレスおよびポートからのトラフィックを許可します。パラメーター 必須 説明 metadata.nameはい AlbConfig の名前です。 metadata.annotations: alb.ingress.kubernetes.io/remote-clustersはい ALB マルチクラスターゲートウェイに追加するクラスター ID のカンマ区切りリストです。各クラスター ID は、事前に Fleet インスタンスと関連付けられている必要があります。 spec.config.nameいいえ ALB インスタンスの名前です。 spec.config.addressTypeいいえ ALB インスタンスのネットワークタイプです。 Internet(デフォルト):パブリック向け、EIP(Elastic IP Address)が必要であり、インスタンス料金および帯域幅課金が発生します。Intranet:非公開、VPC 内でのみアクセス可能です。spec.config.zoneMappingsはい ALB インスタンスの vSwitch ID。vSwitch は、ALB がサポートするゾーン内にあり、クラスターと同じ VPC 内にある必要があります。高可用性を確保するには、リージョンが対応している場合、少なくとも 2 つのゾーンで vSwitch を使用してください。対応するリージョンおよびゾーンの詳細については、「ALB の利用可能なリージョンとゾーン」をご参照ください。 spec.listenersいいえ リスナーのポートおよびプロトコルです。例ではポート 8001 上の HTTP を使用しています。この構成は必ず保持してください。リスナーが設定されていない場合、ALB イングレスは使用できません。 apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: ackone-gateway-demo annotations: # トラフィック処理用に使用される関連付けられたクラスターを ALB マルチクラスターゲートウェイに追加します。 alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2} spec: config: name: one-alb-demo addressType: Internet addressAllocatedMode: Fixed zoneMappings: - vSwitchId: ${vsw-id1} - vSwitchId: ${vsw-id2} listeners: - port: 8001 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: ackone-gateway-demoマニフェストを適用して ALB マルチクラスターゲートウェイおよび IngressClass を作成します。
kubectl apply -f gateway.yaml1~3 分後に、ゲートウェイが正常に作成されたことを確認します。
kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'期待される出力:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE ackone-gateway-demo alb-xxxx alb-xxxx.<regionid>.alb.aliyuncs.com 4d9h関連付けられたクラスターがゲートウェイに正しく接続されていることを確認します。
kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'出力はクラスター ID のリストになります。
手順 2:Ingress を使用したトラフィックルーティング
ingressClassName: alb を指定した Ingress を作成し、ALB マルチクラスターゲートウェイを利用します。ALB イングレスは、一般的に使用される Nginx イングレスのアノテーションをサポートしており、ALB インスタンス向けに拡張された機能も提供します。サポートされるアノテーションの完全な一覧については、「アノテーションによる ALB イングレスの構成」をご参照ください。
以下に、本セクションで取り扱う 4 つのルーティングシナリオをまとめた表を示します。
| シナリオ | 使用するケース | 主なアノテーション |
|---|---|---|
| デフォルトの負荷分散 | レプリカ数に応じてすべてのクラスターにトラフィックを分散する場合 | 不要 |
| 単一クラスターへのルーティング | すべてのトラフィックを 1 つのクラスターに送信する場合(隔離またはテスト目的) | alb.ingress.kubernetes.io/cluster-weight.{clusterID}: "100" |
| ヘッダーに基づくルーティング | 特定の HTTP ヘッダー値を持つリクエストを指定されたクラスターにルーティングする場合 | alb.ingress.kubernetes.io/conditions.{service} |
| 重み付きルーティング | 定義された割合でクラスター間でトラフィックを分割する場合 | alb.ingress.kubernetes.io/cluster-weight.{clusterID}(複数指定可能) |
例 1:デフォルトの負荷分散
関連付けられたクラスター内のすべてのバックエンド Pod に対して、レプリカ数に応じた重みでトラフィックを分散します。クラスター重みのアノテーションは不要です。クラスターごとの重みをカスタマイズせずに、シンプルかつ自動的な負荷分散を実現したい場合に使用します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
alb.ingress.kubernetes.io/cluster-weight.c6XXXXXXXXXXXXXXXXXXXXXXXXX: "60"
alb.ingress.kubernetes.io/cluster-weight.cdXXXXXXXXXXXXXXXXXXXXXXXXX: "40"
name: alb-ingress
namespace: demo
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80例 2:単一クラスターへのルーティング
すべてのトラフィックを特定のクラスターにルーティングします。たとえば、インシデント発生時のクラスター隔離や、カナリアトラフィックを 1 つのクラスターに集中させる場合などに使用します。クラスターの重みを "100" に設定します。指定されたクラスターが存在しない場合、システムはそのクラスターをスキップします。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
alb.ingress.kubernetes.io/cluster-weight.c6XXXXXXXXXXXXXXXXXXXXXXXXX: "100"
name: alb-ingress
namespace: demo
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80例 3:ヘッダーに基づくルーティング
特定の HTTP ヘッダー値を持つリクエストを指定されたクラスターにルーティングします。たとえば、stage: gray というヘッダーを持つリクエストをグレーリリース用クラスターに送信する場合などです。alb.ingress.kubernetes.io/conditions.{service} アノテーションでヘッダー一致ルールを定義し、alb.ingress.kubernetes.io/cluster-weight.{clusterID} アノテーションで対象クラスターを指定します。指定されたクラスターが存在しない場合、システムはそのクラスターをスキップします。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
alb.ingress.kubernetes.io/conditions.service1: |
[{
"type": "Header",
"headerConfig": {
"key":"stage",
"values": [
"gray"
]
}
}]
alb.ingress.kubernetes.io/cluster-weight.c6XXXXXXXXXXXXXXXXXXXXXXXXX: "100"
name: alb-ingress
namespace: demo
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80例 4:重み付きルーティング
定義された割合でクラスター間でトラフィックを分割します。たとえば、移行中に 1 つのクラスターから別のクラスターへ段階的にトラフィックを切り替える場合などに使用します。すべてのクラスター重みの合計は 100 である必要があります。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
alb.ingress.kubernetes.io/cluster-weight.c6XXXXXXXXXXXXXXXXXXXXXXXXX: "60"
alb.ingress.kubernetes.io/cluster-weight.cdXXXXXXXXXXXXXXXXXXXXXXXXX: "40"
name: alb-ingress
namespace: demo
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80トラブルシューティング
3 分経過後もゲートウェイが作成されない
エラーの詳細を確認するために、AlbConfig のステータスを確認します。
kubectl describe albconfig ackone-gateway-demo主な原因:
vSwitch が ALB でサポートされているゾーンにありません。ALB が利用可能なリージョンとゾーンで確認してください。
関連付けられたクラスターのセキュリティグループのインバウンドルールが、vSwitch CIDR ブロックからのトラフィックを許可していません。
subClusters に関連付けられたクラスターが表示されない
alb.ingress.kubernetes.io/remote-clusters アノテーション内のクラスター ID が、Fleet インスタンスと関連付けられたクラスターの ID と一致しているか確認します。
kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'出力が空の場合、gateway.yaml 内のクラスター ID が正しいこと、およびクラスターが Fleet インスタンスと正しく関連付けられていることを確認してください。
次のステップ
アノテーションによる ALB イングレスの構成 — ALB イングレスのアノテーションに関する完全なリファレンス
関連付けられたクラスターの管理 — Fleet インスタンスへのクラスターの追加または削除
従量課金 — インターネット向け ALB インスタンスの課金の詳細