すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:南北のトラフィックの管理

最終更新日:Mar 26, 2026

ALB マルチクラスターゲートウェイを使用して、複数の ACK クラスターにまたがる南北のトラフィックを管理します。ゾーン間のアクティブな冗長性、負荷分散、ヘッダーに基づくルーティングを実現でき、各クラスターごとに個別の Ingress コントローラーを管理する必要はありません。

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

仕組み

トラフィックは、インターネットから ALB インスタンスを経由し、関連付けられたクラスター内の Pod へと流れます。

インターネット → ALB インスタンス → ACK One Fleet インスタンス → 関連付けられたクラスター 1(Pod)
                                                  → 関連付けられたクラスター 2(Pod)

Fleet インスタンスはコントロールプレーンとして機能します。Fleet インスタンス上に作成された AlbConfig オブジェクトにより ALB インスタンスがプロビジョニングされます。また、Fleet インスタンス上の Ingress ルールによって、ALB がすべての関連付けられたクラスターの Pod に対してトラフィックをどのようにルーティングするかが制御されます。

手順 1:ALB マルチクラスターゲートウェイの作成

Fleet インスタンス上で AlbConfig オブジェクトを作成し、ALB インスタンスをプロビジョニングするとともに、関連付けられたクラスターをトラフィックターゲットとして登録します。

  1. Fleet インスタンスが配置されている VPC 内の 2 つの vSwitch の ID を取得します。

  2. 以下の内容で 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
  3. マニフェストを適用して ALB マルチクラスターゲートウェイおよび IngressClass を作成します。

    kubectl apply -f gateway.yaml
  4. 1~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
  5. 関連付けられたクラスターがゲートウェイに正しく接続されていることを確認します。

    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 インスタンスと正しく関連付けられていることを確認してください。

次のステップ