Distributed Cloud Container Platform for Kubernetes (ACK One) が提供するApplication Load Balancer (ALB) マルチクラスターゲートウェイは、ALB Ingressのマルチクラスターモードです。 ゲートウェイでは、アクティブゾーン冗長性、トラフィック負荷分散、ヘッダーベースのトラフィックルーティングなどの機能を使用できます。 このトピックでは、ALBマルチクラスタゲートウェイを使用して南北トラフィックを管理する方法について説明します。
前提条件
ALBが活性化される。
フリート管理機能が有効になっています。 詳細については、「マルチクラスター管理の有効化」をご参照ください。
ACK Oneフリートインスタンスは、ACK Oneフリートインスタンスと同じ仮想プライベートクラウド (VPC) にデプロイされている2つのACKクラスターに関連付けられています。 詳細については、「関連クラスターの管理」をご参照ください。
フリートインスタンスのkubeconfigファイルはACK Oneコンソールで取得され、kubectlクライアントはフリートインスタンスに接続されています。
Alibaba Cloud CLIの最新バージョンがインストールされ、Alibaba Cloud CLIが設定されています。
手順1: ACK One Fleetインスタンスでkubectlを使用してALBマルチクラスタゲートウェイを作成する
ACK One FleetインスタンスにAlbConfigオブジェクトを作成してALBマルチクラスタゲートウェイを作成し、関連するクラスタにALBマルチクラスタゲートウェイを追加します。
ACK One Fleetインスタンスが存在するVPCから2つのvSwitchのIDを取得します。
gateway.yaml
という名前のファイルを作成し、次のコンテンツをファイルにコピーします。説明${vsw-id1}
と${vsw-id2}
を前の手順で取得したvSwitch IDに置き換え、${cluster1}
と${cluster2}
を追加する関連クラスターのIDに置き換えます。関連付けられているクラスター
${cluster1}
および${cluster2}
の場合、vSwitch CIDRブロックのすべてのIPアドレスとポートからのアクセスを許可するように、セキュリティグループのインバウンドルールを設定する必要があります。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: ackone-gateway-demo annotations: # Add associated clusters that are used to handle traffic to the ALB multi-cluster instance. 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
下表に、各パラメーターを説明します。
パラメーター
必須 / 任意
説明
metadata.name
可
AlbConfigの名前。
metadata.annotations:
alb.ingress.kubernetes.io/remote-clusters
可
ALBマルチクラスタゲートウェイに追加される関連クラスタのリスト。 ここにリストされているクラスターIDはフリートインスタンスに関連付けられています。
spec.config.name
不可
ALBインスタンスの名前。
spec.config.addressType
不可
ALBインスタンスのネットワークタイプ。 有効な値:
インターネット (デフォルト): パブリックネットワーク。 ALBインスタンスはインターネットにサービスを提供し、インターネット経由でアクセスできます。
説明ALBインスタンスがインターネット接続サービスを提供できるようにするには、ALBインスタンスをelastic IPアドレス (EIP) に関連付ける必要があります。 インターネット接続のALBインスタンスを使用している場合、関連するEIPのインスタンス料金と帯域幅またはデータ転送料金が課金されます。 詳細については、「従量課金」をご参照ください。
イントラネット: プライベートネットワーク。 ALBインスタンスはVPC内でサービスを提供し、インターネット経由でアクセスすることはできません。
spec.config.zoneMappings
可
ALBインスタンスに関連付けられているvSwitchのID。 vSwitchの作成方法の詳細については、「vSwitchの作成と管理」をご参照ください。
説明指定されたvSwitchは、ALBインスタンスでサポートされているゾーンにデプロイし、クラスターと同じVPCにデプロイする必要があります。 ALBでサポートされているリージョンとゾーンの詳細については、「ALBが利用可能なリージョンとゾーン」をご参照ください。
ALBはマルチゾーン展開をサポートしています。 現在のリージョンで2つ以上のゾーンがサポートされている場合は、高可用性を確保するために2つ以上のゾーンのvSwitchを選択します。
spec.listeners
不可
ALBインスタンスのリスナーポートとプロトコル。 このトピックの例では、ポート8001でHTTPリスナーを構成します。
リスナーは、ALBがトラフィックを受信する方法を定義します。 リスナーの構成を保持することを推奨します。 それ以外の場合は、ALB Ingressを使用する前にリスナーを作成する必要があります。
次のコマンドを実行して
gateway.yaml
ファイルをデプロイし、ALBマルチクラスタゲートウェイとIngressClassを作成します。kubectl apply -f gateway.yaml
次のコマンドを実行して、ALBマルチクラスタゲートウェイが1〜3分以内に作成されるかどうかを確認します。
kubectl get albconfig ackone-gateway-demo
期待される出力:
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を使用してさまざまなシナリオでトラフィックをスケジュールする
IngressのIngressClassをALB Ingressに設定してALB Ingressを作成し、異なるアノテーションを持つトラフィック管理機能を使用できます。 ALB Ingressは、一般的に使用されるNginx-Ingressのアノテーションをサポートし、ALBインスタンスに拡張機能を提供します。 ALB Ingressの設定の詳細については、「ALB Ingress GlobalConfigurationディクショナリ」をご参照ください。 次の例では、マルチクラスタトラフィック管理の使用シナリオについて説明します。
例1: 負荷分散を使用して、デフォルトですべてのバックエンドポッドにトラフィックを分散する
レプリカの数に基づいてトラフィックを異なるクラスターに分配します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
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: 指定されたクラスターのみにトラフィックを分配する
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/cluster-weight.c63a55242bdb342ed9cbd3ab3b1a9904c: "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: ヘッダーに一致するトラフィックを指定されたクラスターに分配する
aalb.ingress.kubernetes.io/cluster-weight.{clusterID}
アノテーションを使用してクラスターを指定します。 指定されたクラスターが存在しない場合、システムはクラスターをスキップします。alb.ingress.kubernetes.io/condition.{backend.service.name}
アノテーションを使用して、リクエストヘッダーパラメーターを設定します。 リクエストヘッダーに基づいてトラフィックルーティングを制御できます。
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.c63a55242bdb342ed9cbd3ab3b1a9904c: "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: 重みに基づいてトラフィックを分配する
alb.ingress.kubernetes.io/cluster-weight
アノテーションを使用して、トラフィックを複数のバックエンドサービスに分散します。 重みの合計は100に等しくなければなりません。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: |
[{"HTTP": 8001}]
alb.ingress.kubernetes.io/cluster-weight.c63a55242bdb342ed9cbd3ab3b1a9904c: "60"
alb.ingress.kubernetes.io/cluster-weight.cd174e5d9394b4b4a8728f08d16203793: "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