ACK Edge クラスターでは、複数のエッジリージョンにわたるコンピューティングリソースをクラウドに接続し、単一の LoadBalancer Service を介して公開できます。このトピックでは、Edge Load Balancer (ELB) インスタンスを使用して、複数のリージョンにデプロイされた Edge Node Service (ENS) ノードプール内の Service を公開する方法について説明します。
仕組み
ACK Edge クラスターのノードプールは、クラウドノードプールまたはエッジノードプールに分類されます。ELB インスタンスはエッジノードプールの負荷分散を処理し、各 ELB インスタンスは単一リージョンにスコープされます。
LoadBalancer Service を作成すると、edge-controller-manager (ECM) は、一致するノードプールごとに PoolService を自動的に作成します。各 PoolService は、そのリージョン内の ELB インスタンスのライフサイクルを管理します。その結果、単一の LoadBalancer Service は、複数のデータセンターのエンドポイント (リージョンごとに 1 つの ELB インスタンス) にマップされます。
次の図は、このアーキテクチャを示しています。ENS ノードプールは 2 つのリージョン (中国 (合肥) と中国 (成都)) にデプロイされており、LoadBalancer Service は個別の ELB インスタンスを介して両方のリージョンでアプリケーションを公開します。
前提条件
開始する前に、次のことを確認してください。
-
ターゲットリージョンに ENS ノードプールを持つ ACK Edge クラスター
-
ECM バージョン 2.1.0 以降
-
クラスターに接続するように構成された
kubectlCLI -
(セルフマネージド ELB の場合) 各ターゲットリージョンに既存の ELB インスタンス
注意事項
-
ECM は、
type: LoadBalancerを持つ Service に対してのみ ELB インスタンスを構成します。 -
ECM によって管理される ELB インスタンスは、
k8s/${Service_Name}/${Service_Namespace}/${NodePool_Id}/${Cluster_Id}形式で命名されます。誤削除を防ぐため、重複する名前は避けてください。 -
ECM によって管理される Elastic IP アドレス (EIP) も同じ命名形式に従います。誤削除を防ぐため、重複する名前は避けてください。
-
複数の Service で 1 つの ELB インスタンスを共有するには、セルフマネージド EIP と ELB インスタンスを使用し、
externalTrafficPolicyをClusterに設定します。 -
Elastic Network Interface (ENI) を持たない ENS インスタンスの場合は、エッジネットワークを作成し、ELB インスタンスを使用して公開します。インターネットアクセスを有効にするには、ENS インスタンスに EIP を割り当てるか、NAT を構成します。
-
ENI を持つ ENS インスタンスの場合は、ホストネットワークにルーティングルールを追加します。
# 10.0.0.3: internal network interface controller; 10.0.0.1: internal gateway address ip rule add from 10.0.0.3 lookup 4 ip route add default via 10.0.0.1 table 4
ELB 管理アプローチの選択
ECM が ELB ライフサイクルを完全に管理するか、既存の ELB インスタンスの制御を維持するかによって、2 つのアプローチが利用可能です。
| 基準 | 自動管理 ELB | セルフマネージド ELB |
|---|---|---|
| EIP 管理 | リージョンごとに自動的に作成および削除される | 手動。EIP は自動的に作成または削除されません |
| ELB インスタンスの制御 | ECM はインスタンスを自動的に作成および命名します | ノードプールごとに既存の ELB インスタンス ID を指定します |
| 複数の Service で 1 つの ELB を共有 | サポートされていません | サポートされています (externalTrafficPolicy: Cluster が必要) |
| Service またはノードプール削除時のクリーンアップ | ELB インスタンスと EIP は自動的に削除されます | ELB インスタンスと EIP は保持されます。手動でのクリーンアップが必要です |
| 使用する場合 | ゼロコンフィグレーションの負荷分散が必要な場合 | ELB インスタンスを正確に制御する必要がある場合、または複数の Service で 1 つの ELB を共有する場合 |
自動管理 ELB Service またはそれに関連付けられたノードプールを削除すると、対応する ELB インスタンスと EIP も削除されます。ノードプールセレクターまたはノードプールラベルを更新すると、ノードプールがセレクターに一致しなくなった場合に ELB インスタンスの削除がトリガーされることもあります。
ステップ 1: アプリケーションのデプロイ
ENS ノードプール内のすべてのノードに cube という名前の DaemonSet をデプロイします。
-
次の内容で
cube.yamlという名前のファイルを作成します。apiVersion: apps/v1 kind: DaemonSet metadata: name: cube labels: app: cube spec: selector: matchLabels: app: cube template: metadata: labels: app: cube spec: containers: - name: cube image: registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube:1.0 ports: - containerPort: 80 -
マニフェストを適用します。
kubectl apply -f cube.yaml -
DaemonSet が実行中であることを確認します。
kubectl get ds cube期待される出力:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE cube 4 4 4 4 4 <none> 3d1h
ステップ 2: ノードプールへのアノテーションの追加
各 ENS ノードプールにネットワークアノテーションと Service ラベルを追加します。この例では、中国 (合肥) および中国 (成都) のノードプールに対して、各リージョンで繰り返します。
-
ノードプール名を取得します。
kubectl get nodepool -
ネットワーク ID アノテーションを追加します。
kubectl annotate nodepool np-xxx alibabacloud.com/ens-network-id=n-xxx -
リージョン ID アノテーションを追加します。
kubectl annotate nodepool np-xxx alibabacloud.com/ens-region-id=cn-xxx-xxx -
vSwitch ID アノテーションを追加します。
kubectl annotate nodepool np-xxx alibabacloud.com/ens-vswitch-id=vsw-xxx,vsw-xxx -
LoadBalancer Service がこのノードプールを選択できるように Service ラベルを追加します。
kubectl label nodepool np-xxx k8s-svc=cube
ステップ 3: マルチリージョン ELB Service でアプリケーションを公開
2 つのオプションがあります。既存の ELB インスタンスがない場合は、オプション A を使用します。既存の ELB インスタンスがあり、それらを制御する必要がある場合は、オプション B を使用します。
オプション A:自動管理 ELB
ECM は、一致する各リージョンで ELB インスタンスと EIP を自動的に作成および管理します。
-
次の内容で
cube-svc.yamlという名前のファイルを作成します。apiVersion: v1 kind: Service metadata: name: cube-svc labels: app: cube annotations: openyurt.io/topologyKeys: openyurt.io/nodepool # Enable Service topology service.openyurt.io/nodepool-labelselector: k8s-svc=cube # Select ENS node pools spec: selector: app: cube type: LoadBalancer loadBalancerClass: alibabacloud.com/elb externalTrafficPolicy: Local ports: - name: cube port: 80 protocol: TCP targetPort: 80 -
マニフェストを適用します。
kubectl apply -f cube-svc.yaml -
サービスが作成され、外部 IP が割り当てられていることを確認します。
kubectl get svc cube-svc期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cube-svc LoadBalancer 192.168.xxx.xxx 39.106.XX.XX,144.121.XX.XX 80:30081/TCP 5mEXTERNAL-IPフィールドには、リージョンごとに 1 つの IP がカンマ区切りでリストされます。 -
アプリケーションへのアクセスを確認します。
curl http://<EXTERNAL-IP>:80前のステップで取得した IP アドレスのいずれかで
<EXTERNAL-IP>を置き換えます。
オプション B:自己管理 ELB
ノードプールごとに独自の ELB インスタンスを指定します。ECM は PoolService を自動的に作成しますが、ELB インスタンスのライフサイクルは管理しません。
-
次の内容で
cube-svc.yamlという名前のファイルを作成します。apiVersion: v1 kind: Service metadata: name: cube-svc labels: app: cube annotations: openyurt.io/topologyKeys: openyurt.io/nodepool # Enable Service topology service.openyurt.io/nodepool-labelselector: k8s-svc=cube # Select ENS node pools service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true" # Use self-managed ELB spec: selector: app: cube type: LoadBalancer loadBalancerClass: alibabacloud.com/elb externalTrafficPolicy: Local ports: - name: cube port: 80 protocol: TCP targetPort: 80 -
マニフェストを適用します。
kubectl apply -f cube-svc.yaml -
各ノードプールに対して PoolService が作成されていることを確認します。
kubectl get ps期待される出力:
NAME AGE cube-svc-np-heifei 32s cube-svc-np-chengdu 32s各 PoolService は 1 つのノードプールに対応します。この時点では、ELB インスタンスはまだアタッチされていません。
-
既存の ELB インスタンスを各 PoolService にバインドします。
-
中国 (合肥) ノードプール:
kubectl annotate ps cube-svc-np-heifei service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx -
中国 (成都) ノードプール:
kubectl annotate ps cube-svc-np-chengdu service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx
-
-
サービスに外部 IP が割り当てられていることを確認します。
kubectl get svc cube-svc期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE cube-svc LoadBalancer 192.168.xxx.xxx 39.106.XX.XX,144.121.XX.XX 80:30081/TCP 5m -
アプリケーションへのアクセスを確認します。
curl http://<EXTERNAL-IP>:80前のステップで取得した IP アドレスのいずれかで
<EXTERNAL-IP>を置き換えます。
ELB 更新ポリシー
次の表は、自動管理 ELB インスタンスとセルフマネージド ELB インスタンスのどちらを使用するかに基づいて、ELB リソースがどのように管理されるかを示しています。
| リソース | セルフマネージド ELB | 自動管理 ELB |
|---|---|---|
| ELB 属性 | 作成: service.openyurt.io/nodepool-labelselector と service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user を使用して、ノードプールセレクターと ELB インスタンス ID を指定します。更新: 属性は更新できません。削除: ELB インスタンスは自動的にリリースされません。 |
作成: service.openyurt.io/nodepool-labelselector を使用してノードプールセレクターを指定します。更新: 属性は更新できません。削除: ELB インスタンスは自動的に削除されません。 |
| バックエンドサーバーグループ | 作成: Service と Pod のステータスに基づいて更新されます。更新: バックエンドサーバーは動的に追加または削除されます (ローカルモード)。削除: バックエンドサーバーグループは自動的に削除されません。手動での削除が必要です。 | 作成: Service と Pod のステータスに基づいて更新されます。更新: バックエンドサーバーは動的に追加または削除されます (ローカルモード)。削除: すべてのバックエンドサーバーグループは自動的に削除されます。 |
| リスナー | 作成: spec.ports に基づいて自動的に追加されます。更新: ポートの変更に基づいて自動的に追加、更新、削除されます。削除: リスナーは自動的に削除されません。手動での削除が必要です。 |
作成: spec.ports に基づいて自動的に追加されます。更新: ポートの変更に基づいて自動的に追加、更新、削除されます。削除: すべてのリスナーは自動的に削除されます。 |
| EIP 属性 | 作成: EIP は自動的に作成されません。手動での管理が必要です。更新: EIP 属性は更新できません。削除: EIP は自動的に削除されません。 | 作成: EIP は各リージョンで自動的に作成されます。更新: EIP 帯域幅は増減できます。削除: EIP は自動的に削除されます。 |
次のステップ
-
アノテーションを使用して高度な負荷分散オプションを構成する方法については、「ELB インスタンスを構成するためのアノテーションの使用」をご参照ください。
-
ELB プロダクトの詳細については、「ELB とは」をご参照ください。