Ao expor pods de backend por meio de um Service do tipo LoadBalancer, as atualizações contínuas podem interromper o acesso se os pods ficarem prontos antes que o balanceador de carga os adicione ao grupo de servidores de backend. Configure um readiness gate para garantir atualizações suaves dos pods. Este tópico explica como usar o mecanismo de Pod Readiness Gate para atualizações sem interrupções.
Pré-requisitos
-
Um cluster gerenciado ACK ou cluster ACK Serverless que atenda aos seguintes requisitos. Consulte Criar um cluster gerenciado ACK e Criar um cluster ACK Serverless.
Para clusters gerenciados ACK, o plug-in de rede deve ser o Terway.
A versão do cluster é 1.24 ou posterior. Consulte Atualizar um cluster.
O cloud-controller-manager está na versão v2.10.0 ou posterior. Consulte Cloud Controller Manager.
Para injeção automática de readiness gate: cloud-controller-manager v2.12.4 ou posterior com o Pod ReadinessGate Webhook ativado. Na Parameter Configuration do Cloud Controller Manager, selecione Enable Pod ReadinessGate Webhook capability e clique em Confirm.
Um cliente kubectl conectado ao cluster ACK. Para mais informações, consulte Conectar-se a um cluster ACK usando kubectl.
Contexto
Expor uma aplicação com um Service LoadBalancer e executar uma atualização contínua pode causar breves interrupções de serviço ou falhas de conexão.
-
Causa
Novos Pods frequentemente ficam prontos antes que o balanceador de carga adicione seus IPs à lista de servidores de backend. A atualização contínua pode então encerrar o Pod antigo enquanto o tráfego ainda é roteado para ele, causando falhas de conexão.
-
Solução
Use o Pod Readiness Gate no YAML do Pod para adicionar condições personalizadas de prontidão, como
service.readiness.alibabacloud.com/<Service Name>para um Service do tipo LoadBalancer. O Pod é marcado comoReadye recebe tráfego somente após o atendimento dessas condições. -
Exemplo de procedimento
-
Funcionamento
Com
readinessGatesconfigurado, um Pod torna-se pronto da seguinte forma:Prontidão via sonda do container: O kubelet executa a
readinessProbedo container. Após o sucesso da sonda,ContainersReadytorna-seTrue, mas o Pod permanece não pronto até a confirmação de todas as condições do readiness gate.CCM registra o backend: O CCM detecta a prontidão do container, adiciona o IP do Pod ao grupo de servidores de backend do balanceador de carga e define uma condição como
service.readiness.alibabacloud.com/my-svcparaTrue.Pod torna-se totalmente pronto: Depois que todas as condições do readiness gate forem
True, o kubelet defineReadycomoTrue. A atualização contínua pode então encerrar o Pod antigo com segurança.
-
Observações de uso
O Service deve existir: O nome do Service em
readinessGatesdeve estar correto e o Service deve existir no cluster. Se o nome estiver incorreto ou o Service for excluído durante a inicialização do Pod, o CCM não consegue registrar o backend e o Pod nunca atinge o estadoReady, travando a implantação.Suporte a múltiplos Services: Um Pod pode listar várias entradas
readinessGates.conditionTypepara múltiplos Services do tipoLoadBalancer. O Pod só fica pronto após o registro nos backends de todos os Services especificados.
Procedimento
Automático
Após ativar o Pod ReadinessGate Webhook, adicione o rótulo k8s.alibabacloud.com/pod-readiness-gate-inject: enabled a um namespace para injetar readiness gates em todos os Pods.
Os passos a seguir habilitam a injeção automática para o namespace default.
Adicionar o rótulo de injeção automática
-
Adicione o rótulo
k8s.alibabacloud.com/pod-readiness-gate-inject: enabledao namespacedefault.kubectl label namespace default k8s.alibabacloud.com/pod-readiness-gate-inject=enabledSaída esperada:
namespace/default labeled -
Verifique o rótulo no namespace.
kubectl get namespace default -oyamlSaída esperada:
apiVersion: v1 kind: Namespace metadata: creationTimestamp: "2025-11-13T07:18:37Z" labels: k8s.alibabacloud.com/pod-readiness-gate-inject: enabled kubernetes.io/metadata.name: default name: default resourceVersion: "6440182" uid: 73aff814-ae29-465a-98a4-6d37b9b8ee1a spec: finalizers: - kubernetes status: phase: ActiveO rótulo foi adicionado ao namespace.
Criar um Service do tipo LoadBalancer
-
Crie o arquivo
my-svc.yamlusando o modelo YAML abaixo. Crie uma instância de Classic Load Balancer (CLB) ou Network Load Balancer (NLB) conforme necessário.CLB
apiVersion: v1 kind: Service metadata: name: my-svc namespace: default # The namespace is default. spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: nginx type: LoadBalancerNLB
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 # Specifies that the load balancer type is NLB. ports: - port: 80 targetPort: 80 protocol: TCP selector: app: nginx type: LoadBalancer -
Aplique o Service.
kubectl apply -f my-svc.yaml -
Verifique o status do Service.
kubectl get service my-svcAguarde até que EXTERNAL-IP exiba um endereço IP ou nome de domínio, indicando a criação da instância do
load balancer.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-svc LoadBalancer 192.XX.XX.215 <IP address/domain name> 80:30493/TCP 8s
Criar um Deployment de exemplo
-
Crie o arquivo
my-nginx.yamlcom base no modelo YAML a seguir.apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx # Example name. namespace: default # The namespace is default. labels: app: nginx spec: replicas: 2 # Specifies the number of replicas. selector: matchLabels: app: nginx # Must match the Service selector to be exposed by the Service. template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # This port must be exposed in the Service. -
Aplique o Deployment.
kubectl apply -f my-nginx.yaml -
Verifique o status dos Pods e os readiness gates.
kubectl get pod -owide -l app=nginxSaída esperada:
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/1Execuções repetidas mostram READINESS GATES mudando de 0/1 para 1/1, indicando registro bem-sucedido no grupo de servidores de backend do balanceador de carga.
Realizar uma atualização contínua
-
Reinicie o Deployment.
kubectl rollout restart deployment my-nginxSaída esperada:
deployment.apps/my-nginx restarted -
Verifique o status dos Pods e os readiness gates.
kubectl get pod -owide -l app=nginxSaída esperada:
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/1Durante a atualização contínua, os Pods aguardam o readiness gate antes que a atualização prossiga, garantindo que os novos Pods se registrem primeiro no grupo de servidores de backend do balanceador de carga.
Manual
Criar um Service do tipo LoadBalancer
-
Crie o arquivo
my-svc.yamlusando o modelo YAML abaixo. Crie uma instância de Classic Load Balancer (CLB) ou Network Load Balancer (NLB) conforme necessário.CLB
apiVersion: v1 kind: Service metadata: name: my-svc namespace: default # The namespace is default. spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: nginx type: LoadBalancerNLB
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 # Specifies that the load balancer type is NLB. ports: - port: 80 targetPort: 80 protocol: TCP selector: app: nginx type: LoadBalancer -
Aplique o Service.
kubectl apply -f my-svc.yaml -
Verifique o status do Service.
kubectl get service my-svcAguarde até que EXTERNAL-IP exiba um endereço IP ou nome de domínio, indicando a criação da instância do
load balancer.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-svc LoadBalancer 192.XX.XX.215 <IP address/domain name> 80:30493/TCP 8s
Criar um Deployment de exemplo
-
Crie o arquivo
my-nginx.yaml. No modelo do Pod, defina o readiness gateconditionTypecomoservice.readiness.alibabacloud.com/my-svc.apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx # Example name. namespace: default # The namespace is default. labels: app: nginx spec: replicas: 2 # Specifies the number of replicas. selector: matchLabels: app: nginx # Must match the Service selector to be exposed by the Service. template: metadata: labels: app: nginx spec: readinessGates: - conditionType: service.readiness.alibabacloud.com/my-svc # Set the readiness gate for the my-svc Service. containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # This port must be exposed in the Service. -
Aplique o Deployment.
kubectl apply -f my-nginx.yaml -
Verifique o status dos Pods e os readiness gates.
kubectl get pod -owide -l app=nginxSaída esperada:
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/1Execuções repetidas mostram READINESS GATES mudando de 0/1 para 1/1, indicando registro bem-sucedido no grupo de servidores de backend do balanceador de carga.
Realizar uma atualização contínua
-
Reinicie o Deployment.
kubectl rollout restart deployment my-nginxSaída esperada:
deployment.apps/my-nginx restarted -
Verifique o status dos Pods e os readiness gates.
kubectl get pod -owide -l app=nginxSaída esperada:
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/1Durante a atualização contínua, os Pods aguardam o readiness gate antes que a atualização prossiga, garantindo que os novos Pods se registrem primeiro no grupo de servidores de backend do balanceador de carga.