Kubernetesクラスターでは、フロントエンドとバックエンドを分離するために、サービスを使用してポッドを外部アクセスに公開します。 これにより、疎結合のマイクロサービスデザインを使用できます。 ACK Edgeクラスターでは、通常、LoadBalancerサービスを使用してアプリケーションを公開します。 このトピックでは、Edge Load Balancer (ELB) インスタンスを使用して、複数のリージョンのEdge Node Service (ENS) ノードプールにデプロイされたサービスを公開する方法について説明します。
概要
ACK Edgeクラスター内のノードプールは、クラウドノードプールとエッジノードプールに分類できます。 ACK Edgeクラスターでは、LoadBalancer Servicesを使用して、オンクラウドノードプールまたはエッジノードプールにデプロイされたアプリケーションを公開できます。
このトピックでは、ELBサービスを使用して、エッジノードプールにデプロイされたアプリケーションを公開します。 次の図では、ACK Edgeクラスターの制御プレーンが仮想プライベートクラウド (VPC) にデプロイされています。 さまざまなネットワークのデータセンターのコンピューティングリソースをクラウドに接続し、LoadBalancerサービスを使用してさまざまなリージョンのアプリケーショングループを公開できます。 つまり、LoadBalancerサービスは複数のデータセンターのエンドポイントにマッピングされます。
この例では、ENSノードプールは中国 (合肥) および中国 (成都) リージョンで作成されます。 ELBインスタンスは、2つのリージョンのアプリケーションからの要求を分散するために使用されます。
ACK Edgeクラスターを使用すると、カスタムクラスターリソースPoolServicesを作成できます。 edge-controller-manager (ECM) コンポーネントは、作成したLoadBalancerサービスに基づいてノードプールによって管理されるPoolServiceを自動的に選択し、同じリージョンのServer Load Balancer (SLB) インスタンスのライフサイクルをPoolServiceにバインドできます。
注意事項
ECMは、タイプが
Type=LoadBalancer
のサービスに対してのみ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インスタンスを共有する複数のサービスを作成するには、セルフマネージドEIPとELBインスタンスを選択する必要があります。 また、外部トラフィックポリシーのタイプはクラスターである必要があります。
エッジネットワークを作成し、elastic network Interface (ENI) が割り当てられていないENSインスタンスを作成し、ELBインスタンスを使用してENSインスタンスを公開することを推奨します。 ENSインスタンスのインターネットアクセスを有効にするには、EIPをENSインスタンスに割り当てるか、NATを設定します。
ENIが割り当てられたENSインスタンスを作成する場合は、ELBインスタンスも必要です。 この場合、ENSインスタンスのホストネットワークにルーティングルールを追加する必要があります。
# In this example, 10.0.0.3 indicates the internal network interface controller, and 10.0.0.1 indicates the internal gateway address. 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ファイルはDeamonSetを作成します。
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 #Expose the port.
次のコマンドを実行して、アプリケーションをデプロイします。
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: すべてのノードプールに属性注釈とサービスラベルを追加する
エッジのすべてのENSノードプールに属性アノテーションとサービスラベルを追加する必要があります。 この例では、中国 (合肥) および中国 (成都) リージョンのENSノードプールで次の操作を実行します。
次のコマンドを実行して、ネットワークIDを追加します。
kubectl annotate np np-chengdu alibabacloud.com/ens-network-id=n-xxx
に注釈を付ける
次のコマンドを実行して、ENSノードID (VPC ID) を追加します。
kubectl annotate np np-chengdu alibabacloud.com/ens-region-id=cn-xxx-xxx
に注釈を付ける
次のコマンドを実行してvSwitch IDを追加します。
kubectl annotate np np-chengdu alibabacloud.com/ens-vswitch-id=vsw-xxx,vsw-xxx
に注釈を付ける
次のコマンドを実行して、サービスラベルを追加します。
kubectl label nodepool np-chengdu k8s-svc=cube
ステップ3: マルチリージョンELBサービスを使用してアプリケーションを公開する
サービスを作成するときに、サービスタイプを
type: LoadBalancer
に設定します。ELBサービスを作成するには、LoadBalancerタイプを
loadBalancerClass: alibabacloud.com/elb
に設定する必要があります。
既存のELBインスタンスを使用してアプリケーションを公開できます。 使用可能なELBインスタンスがない場合は、自動的に作成されたELBインスタンスを使用してアプリケーションを公開できます。
ELB更新ポリシーは、アプリケーションの公開に使用する方法によって異なります。 詳細については、「ELB更新ポリシー」をご参照ください。
自動的に作成されたマルチリージョンELBサービスを使用してアプリケーションを公開する
次の操作では、自動的に作成されたELBインスタンスとEIPが削除されます。 作業は慎重に行ってください。
ELBサービスを削除すると、すべてのノードプールに対応するELBインスタンスが削除されます。
ノードプールを削除すると、対応するELBインスタンスも削除されます。
サービスのノードプールセレクターを更新すると、セレクターと一致しないノードプールに対応するELBインスタンスも削除されます。
ノードプールのラベルを更新すると、ノードプールがサービスのノードプールセレクターと一致しない場合があります。 その結果、ノードプールに対応するELBインスタンスが削除される。
cube-svc.yamlという名前のファイルを作成し、次のYAMLコンテンツをファイルに追加します。
apiVersion: v1 kind: Service metadata: name: cube-svc labels: app: cube annotations: openyurt.io/topologyKeys: openyurt.io/nodepool #Enable the Service topology feature. 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
次のコマンドを実行してcube-svcという名前のサービスをデプロイし、サービスを使用してアプリケーションを公開します。
kubectl apply -f cube-svc.yaml
次のコマンドを実行して、cube-svc Serviceが作成されたことを確認します。
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
次のコマンドを実行して、アプリケーションにアクセスします。
説明<YOUR-External-IP> を、前の手順で返された
EXTERNAL-IP
に置き換えます。curl http://<YOUR-External-IP>:80
既存のマルチリージョンELBサービスを使用してアプリケーションを公開する
cube-svcという名前のファイルを作成し、次のYAMLコンテンツをファイルに追加します。
apiVersion: v1 種類: サービス メタデータ: 名前: cube-svc ラベル: アプリ: キューブ アノテーション: openyurt.io/topologyKeys: openyurt.io/nodepool# サービストポロジ機能を有効にします。 service.openyurt.io/nodepool-labelselector: k8s-svc=cube# ENSノードプールを選択します。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true"# サービスを自己管理型ロードバランサーにマウントします。 仕様: セレクタ: アプリ: キューブ type: LoadBalancer loadBalancerClass: alibabacloud.com/elb externalTrafficPolicy: Local ポート: -name: キューブ ポート: 80 protocol: TCP targetPort: 80
次のコマンドを実行してcube-svcという名前のサービスをデプロイし、サービスを使用してアプリケーションを公開します。
kubectl apply -f cube-svc.yaml
次のコマンドを実行して、自動的に作成されたPoolServicesを照会します。
kubectl get ps
期待される出力:
名前の年齢 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-svc Serviceが作成されたことを確認します。
kubectl get cube-svc
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 cube-svc LoadBalancer 192.168.xxx.xxx 39.106.XX.XX、144.121.XX.XX 80:30081/TCP 5m
次のコマンドを実行して、アプリケーションにアクセスします。
説明<YOUR-External-IP> を、前の手順で返された
EXTERNAL-IP
に置き換えます。curl http:// <あなたの外部IP>:80
ELB更新ポリシー
リソースオブジェクト | お客様が管理するELBインスタンス (手動で作成したELBインスタンス) | ECMによって管理されるELBインスタンス (自動的に作成されるELBインスタンス) |
ELB属性 |
|
|
バックエンドサーバーグループ |
|
|
リスナー |
|
|
EIP属性 |
|
|
関連ドキュメント
サービスのYAMLファイルにアノテーションを追加して、さまざまな負荷分散機能を使用できます。 詳細については、「アノテーションを使用したELBインスタンスの設定」をご参照ください。
ELBの詳細については、「」をご参照ください。ELBとは何ですか?