Kubernetes クラスターでは、Service を使用して Pod を外部アクセスに公開し、フロントエンドとバックエンドを分離します。これにより、疎結合のマイクロサービス設計が可能になります。ACK Edge クラスターでは、通常、LoadBalancer Service を使用してアプリケーションを公開します。このトピックでは、Edge Load Balancer (ELB) インスタンスを使用して、複数リージョンの Edge Node Service (ENS) ノードプールにデプロイされた Service を公開する方法について説明します。
概要
ACK Edge クラスターのノードプールは、クラウドノードプールとエッジノードプールに分類できます。ACK Edge クラスターでは、LoadBalancer Service を使用して、クラウドノードプールまたはエッジノードプールにデプロイされたアプリケーションを公開できます。
このトピックでは、ELB Service を使用してエッジノードプールにデプロイされたアプリケーションを公開します。次の図では、ACK Edge クラスターのコントロールプレーンが Virtual Private Cloud (VPC) にデプロイされています。異なるネットワークのデータセンターにあるコンピューティングリソースをクラウドに接続し、LoadBalancer Service を使用して異なるリージョンにあるアプリケーションのグループを公開できます。これは、LoadBalancer Service が複数のデータセンターのエンドポイントにマッピングされることを意味します。
この例では、ENS ノードプールが中国 (合肥) と中国 (成都) リージョンに作成されます。ELB インスタンスは、2 つのリージョンのアプリケーションからのリクエストを分散するために使用されます。
ACK Edge クラスターでは、カスタムクラスターリソース PoolService を作成できます。edge-controller-manager (ECM) コンポーネントは、作成した LoadBalancer Service に基づいてノードプールによって管理される PoolService を自動的に選択し、同じリージョン内の Server Load Balancer (SLB) インスタンスのライフサイクルを PoolService にバインドできます。
注意事項
ECM は、タイプが
Type=LoadBalancerの Service に対してのみ SLB インスタンスを構成します。ECM のバージョンは 2.1.0 以降である必要があります。ECM によって管理される ELB インスタンスは、
k8s/${Service_Name}/${Service_Namespace}/${NodePool_Id}/${Cluster_Id}というフォーマットで命名されます。同じ名前の ELB インスタンスが誤って削除されるのを防ぐため、重複した名前は使用しないでください。ECM によって管理される Elastic IP アドレス (EIP) は、
k8s/${Service_Name}/${Service_Namespace}/${NodePool_Id}/${Cluster_Id}というフォーマットで命名されます。同じ名前の EIP が誤って削除されるのを防ぐため、重複した名前は使用しないでください。1 つの ELB インスタンスを共有する複数の Service を作成するには、自己管理型の EIP と ELB インスタンスを選択する必要があります。さらに、外部トラフィックポリシーのタイプは Cluster である必要があります。
エッジネットワークを作成し、Elastic Network Interface (ENI) が割り当てられていない ENS インスタンスを作成し、ELB インスタンスを使用して ENS インスタンスを公開することを推奨します。ENS インスタンスのインターネットアクセスを有効にするには、ENS インスタンスに EIP を割り当てるか、NAT を設定します。
ENI が割り当てられた ENS インスタンスを作成する場合も、ELB インスタンスが必要です。この場合、ENS インスタンスのホストネットワークにルーティングルールを追加する必要があります。
# この例では、10.0.0.3 は内部ネットワークインターフェースコントローラーを示し、10.0.0.1 は内部ゲートウェイアドレスを示します。 ip rule add from 10.0.0.3 lookup 4 ip route add default via 10.0.0.1 table 4
ステップ 1:アプリケーションのデプロイ
この例では、cube という名前のアプリケーションが ENS ノードプールの各ノードにデプロイされます。
次の YAML ファイルは DaemonSet を作成します。
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アプリケーションのステータスを照会します。
kubectl get ds cube期待される出力:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE cube 4 4 4 4 4 <none> 3d1h
ステップ 2:すべてのノードプールへの属性アノテーションと Service ラベルの追加
エッジにあるすべての ENS ノードプールに属性アノテーションと Service ラベルを追加する必要があります。この例では、中国 (合肥) および中国 (成都) リージョンの ENS ノードプールに対して次の操作を実行します。
ノードプール名を取得します。
kubectl get nodepoolネットワーク ID を追加します。
kubectl annotate nodepool np-xxx alibabacloud.com/ens-network-id=n-xxxENS ノード ID (VPC ID) を追加します。
kubectl annotate nodepool np-xxx alibabacloud.com/ens-region-id=cn-xxx-xxxvSwitch ID を追加します。
kubectl annotate nodepool np-xxx alibabacloud.com/ens-vswitch-id=vsw-xxx,vsw-xxxService ラベルを追加します。
kubectl label nodepool np-xxx k8s-svc=cube
ステップ 3:複数リージョンの ELB Service を使用したアプリケーションの公開
Service を作成するときは、Service タイプを
type: LoadBalancerに設定します。ELB Service を作成するには、LoadBalancer タイプを
loadBalancerClass: alibabacloud.com/elbに設定する必要があります。
既存の ELB インスタンスを使用してアプリケーションを公開できます。利用可能な ELB インスタンスがない場合は、自動的に作成された ELB インスタンスを使用してアプリケーションを公開できます。
ELB の更新ポリシーは、アプリケーションを公開するために使用するメソッドによって異なります。詳細については、「ELB の更新ポリシー」をご参照ください。
自動作成された複数リージョンの ELB Service を使用したアプリケーションの公開
次の操作は、自動的に作成された ELB インスタンスと EIP を削除します。注意して進めてください。
ELB Service を削除すると、すべてのノードプールに対応する ELB インスタンスが削除されます。
ノードプールを削除すると、対応する ELB インスタンスも削除されます。
Service のノードプールセレクターを更新すると、セレクターに一致しないノードプールに対応する ELB インスタンスも削除されます。
ノードプールのラベルを更新すると、ノードプールが Service のノードプールセレクターに一致しなくなる可能性があります。その結果、ノードプールに対応する ELB インスタンスが削除されます。
cube-svc.yaml という名前のファイルを作成し、次の YAML コンテンツをファイルに追加します。
apiVersion: v1 kind: Service metadata: name: cube-svc labels: app: cube annotations: openyurt.io/topologyKeys: openyurt.io/nodepool # Service トポロジー機能を有効にします。 service.openyurt.io/nodepool-labelselector: k8s-svc=cube # ENS ノードプールを選択します。 spec: selector: app: cube type: LoadBalancer loadBalancerClass: alibabacloud.com/elb externalTrafficPolicy: Local ports: - name: cube port: 80 protocol: TCP targetPort: 80cube-svcという名前の Service をデプロイし、その Service を使用してアプリケーションを公開します。kubectl apply -f cube-svc.yamlcube-svcService が作成されたことを確認します。kubectl get 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アプリケーションにアクセスします。
説明前の手順で返された
EXTERNAL-IPを<YOUR-External-IP>に置き換えてください。curl http://<YOUR-External-IP>:80
既存の複数リージョンの ELB Service を使用したアプリケーションの公開
cube-svc という名前のファイルを作成し、次の YAML コンテンツをファイルに追加します。
apiVersion: v1 kind: Service metadata: name: cube-svc labels: app: cube annotations: openyurt.io/topologyKeys: openyurt.io/nodepool # Service トポロジー機能を有効にします。 service.openyurt.io/nodepool-labelselector: k8s-svc=cube # ENS ノードプールを選択します。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true" # Service を自己管理のロードバランサーにマウントします。 spec: selector: app: cube type: LoadBalancer loadBalancerClass: alibabacloud.com/elb externalTrafficPolicy: Local ports: - name: cube port: 80 protocol: TCP targetPort: 80cube-svcという名前の Service をデプロイし、その Service を使用してアプリケーションを公開します。kubectl apply -f cube-svc.yaml自動的に作成された PoolService を照会します。
kubectl get ps期待される出力:
NAME AGE cube-svc-np-heifei 32s cube-svc-np-chengdu 32s各リージョンの PoolService に既存の ELB インスタンスを指定します。
この例では、中国 (合肥) および中国 (成都) リージョンの各 PoolService に既存の ELB インスタンスが指定されます。
中国 (合肥) リージョンのノードプールに既存の ELB インスタンスを指定します。
kubectl annotate ps cube-svc-np-heifei service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx中国 (成都) リージョンのノードプールに、既存の ELB インスタンスを指定します。
kubectl annotate ps cube-svc-np-chengdu service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx
cube-svcService が作成されたことを確認します。kubectl get 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アプリケーションにアクセスします。
説明前の手順で返された
EXTERNAL-IPを<YOUR-External-IP>に置き換えてください。curl http://<YOUR-External-IP>:80
ELB の更新ポリシー
リソースオブジェクト | ユーザー管理の ELB インスタンス (手動で作成された ELB インスタンス) | ECM 管理の ELB インスタンス (自動で作成された ELB インスタンス) |
ELB 属性 |
|
|
バックエンドサーバーグループ |
|
|
リスナー |
|
|
EIP 属性 |
|
|
関連ドキュメント
Service の YAML ファイルにアノテーションを追加して、さまざまなロードバランシング機能を使用できます。詳細については、「アノテーションを使用した ELB インスタンスの設定」をご参照ください。
ELB の詳細については、「ELB とは」をご参照ください。