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

Container Service for Kubernetes:準備ゲートを使用してポッドをシームレスに更新する

最終更新日:Dec 05, 2024

LoadBalancerサービスを使用してバックエンドポッドを公開する場合、ポッドのローリング更新速度は、ロードバランサーのバックエンドサーバーグループのマウント速度よりも速い場合があります。 その結果、ポッドへのアクセスが中断される可能性があります。 準備ゲートを設定して、ポッドをシームレスに更新できます。 このトピックでは、準備ゲートを使用してポッドをシームレスに更新する方法について説明します。

前提条件

使用上の注意

LoadBalancerサービスを使用してバックエンドポッドを公開する場合、ポッドのローリング更新中にサービスが中断されることがあります。

  • 原因

    ポッドでローリングアップデートを実行する場合、LoadBalancerサービスを使用して、新しいポッドの起動速度がバックエンドポッドの更新速度よりも速くなる場合があります。 要求トラフィックは、段階的に廃止されているポッドにルーティングされ、一時的なアクセス障害が発生します。

  • 解決策

    ポッドのYAMLファイルで準備ゲートを設定し、カスタム条件を使用してポッドのステータスを制御できます。 準備ゲートを使用すると、LoadBalancerサービスに関連するカスタム条件service.readiness.alibabacloud.com/<サービス名> などのカスタム条件を指定できます。 準備完了ゲートで指定されたすべての条件が満たされると、ポッドのステータスが準備完了に変わり、トラフィックがポッドに転送されます。 複数のロードバランサーがポッドにマウントされている場合、ポッドに複数の準備ゲートを設定できます。

  • 手順

    image

手順1: CLBまたはNLBインスタンスの作成

  1. my-svc.yamlという名前のファイルを作成し、次のYAMLテンプレートに基づいてClassic Load Balancer (CLB) またはNetwork Load Balancer (NLB) インスタンスを作成します。

    CLB

    apiVersion: v1
    kind: Service
    metadata:
      name: my-svc
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: nginx
      type: LoadBalancer

    NLB

    apiVersion: v1
    kind: Service
    metadata:
      name: my-svc
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-zone-maps: "${zone-A}:${vsw-A},${zone-B}:${vsw-B}" # Example: cn-hangzhou-k:vsw-i123456,cn-hangzhou-j:vsw-j654321. 
    spec:
      loadBalancerClass: alibabacloud.com/nlb # Set to NLB. 
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: nginx
      type: LoadBalancer
  2. 次のコマンドを実行して、テストサービスを作成します。

    kubectl apply -f my-svc.yaml
  3. 次のコマンドを実行して、テストサービスのステータスを照会します。

    kubectl get service my-svc

    <IP address> が表示されると、対応するCLBまたはNLBインスタンスが作成されます。

    NAME     TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
    my-svc   LoadBalancer   192.XX.XX.215   <IP address>     80:30493/TCP   8s

ステップ2: テスト配置の作成

  1. 次のYAMLテンプレートを使用してmy-nginx.yamlという名前のファイルを作成し、準備ゲートのconditionTypeパラメーターをservice.readiness.alibabacloud.com/my-svcに設定します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx    # The name of the Deployment. 
      labels:
        app: nginx
    spec:
      replicas: 2       # The number of replicated pods. 
      selector:
        matchLabels:
          app: nginx     # You must specify the same value in the selector of the Service that is used to expose the Deployment. 
      template:
        metadata:
          labels:
            app: nginx
        spec:
          readinessGates:
          - conditionType: service.readiness.alibabacloud.com/my-svc # Configure readiness gates for the Service named my-svc.
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80                                # The port that you want to expose in the Service.
  2. 次のコマンドを実行して、テスト展開を展開します。

    kubectl apply -f my-nginx.yaml
  3. 次のコマンドを実行して、ポッドと準備ゲートのステータスを照会します。

    kubectl get pod -owide -l app=nginx

    期待される出力:

    NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE                         NOMINATED NODE   READINESS GATES
    my-nginx-d9f95dcf9-8dhwj   1/1     Running   0          14s   172.XX.XXX.188   cn-hangzhou.172.XX.XXX.174   <none>           0/1
    my-nginx-d9f95dcf9-z9hjm   1/1     Running   0          14s   172.XX.XXX.182   cn-hangzhou.172.XX.XXX.174   <none>           0/1

    コマンドを複数回実行すると、ポッドの準備ゲートのステータスが0から1に変わります。 これは、ポッドがCLBまたはNLBインスタンスのサーバーグループにマウントされていることを示します。

ステップ3: ポッドのローリングアップデートを実行する

  1. 次のコマンドを実行して、テストポッドを再デプロイします。

    kubectl rollout restart deployment my-nginx

    期待される出力:

    deployment.apps/my-nginx restarted
  2. 次のコマンドを実行して、ポッドと準備ゲートのステータスを照会します。

    kubectl get pod -owide -l app=nginx

    期待される出力:

    NAME                       READY   STATUS    RESTARTS   AGE    IP               NODE                         NOMINATED NODE   READINESS GATES
    my-nginx-d9f95dcf9-8dhwj   1/1     Running   0          113s   172.XX.XXX.188   cn-hangzhou.172.XX.XXX.174   <none>           1/1
    my-nginx-df5c9cf7d-6p5jc   1/1     Running   0          6s     172.XX.XXX.182   cn-hangzhou.172.XX.XXX.174   <none>           0/1
    my-nginx-df5c9cf7d-7dh2v   1/1     Running   0          15s    172.XX.XXX.189   cn-hangzhou.172.XX.XXX.174   <none>           1/1

    コマンドを複数回実行すると、ポッドはローリング更新プロセス中に準備ゲートのステータスが0から1に変わるのを待ちます。 準備ゲートのステータスが0から1に変わると、ポッドはCLBまたはNLBインスタンスのサーバーグループにマウントされ、ローリング更新が続行されます。