LoadBalancerサービスを使用してバックエンドポッドを公開する場合、ポッドのローリング更新速度は、ロードバランサーのバックエンドサーバーグループのマウント速度よりも速い場合があります。 その結果、ポッドへのアクセスが中断される可能性があります。 準備ゲートを設定して、ポッドをシームレスに更新できます。 このトピックでは、準備ゲートを使用してポッドをシームレスに更新する方法について説明します。
前提条件
ACKマネージドクラスターまたはACKサーバーレスクラスターが作成されます。 クラスターは次の要件を満たしています。 詳細については、「ACKマネージドクラスターの作成」または「ACKサーバーレスクラスターの作成」をご参照ください。
ACK管理クラスターのネットワークプラグインをTerwayに設定します。
クラスターのKubernetesバージョンは1.24以降である必要があります。 詳細については、「クラスターのアップグレード」をご参照ください。
cloud-controller-managerコンポーネントのバージョンは2.10.0以降である必要があります。 詳細については、「CCM」をご参照ください。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
使用上の注意
LoadBalancerサービスを使用してバックエンドポッドを公開する場合、ポッドのローリング更新中にサービスが中断されることがあります。
原因
ポッドでローリングアップデートを実行する場合、LoadBalancerサービスを使用して、新しいポッドの起動速度がバックエンドポッドの更新速度よりも速くなる場合があります。 要求トラフィックは、段階的に廃止されているポッドにルーティングされ、一時的なアクセス障害が発生します。
解決策
ポッドのYAMLファイルで準備ゲートを設定し、カスタム条件を使用してポッドのステータスを制御できます。 準備ゲートを使用すると、LoadBalancerサービスに関連するカスタム条件
service.readiness.alibabacloud.com/<サービス名>
などのカスタム条件を指定できます。 準備完了ゲートで指定されたすべての条件が満たされると、ポッドのステータスが準備完了に変わり、トラフィックがポッドに転送されます。 複数のロードバランサーがポッドにマウントされている場合、ポッドに複数の準備ゲートを設定できます。手順
手順1: CLBまたはNLBインスタンスの作成
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
次のコマンドを実行して、テストサービスを作成します。
kubectl apply -f my-svc.yaml
次のコマンドを実行して、テストサービスのステータスを照会します。
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: テスト配置の作成
次の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.
次のコマンドを実行して、テスト展開を展開します。
kubectl apply -f my-nginx.yaml
次のコマンドを実行して、ポッドと準備ゲートのステータスを照会します。
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: ポッドのローリングアップデートを実行する
次のコマンドを実行して、テストポッドを再デプロイします。
kubectl rollout restart deployment my-nginx
期待される出力:
deployment.apps/my-nginx restarted
次のコマンドを実行して、ポッドと準備ゲートのステータスを照会します。
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インスタンスのサーバーグループにマウントされ、ローリング更新が続行されます。