Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Garanta atualizações suaves de Pods com um readiness gate

Última atualização: Jun 27, 2026

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 como Ready e recebe tráfego somente após o atendimento dessas condições.

  • Exemplo de procedimento

    image
  • Funcionamento

    Com readinessGates configurado, um Pod torna-se pronto da seguinte forma:

    1. Prontidão via sonda do container: O kubelet executa a readinessProbe do container. Após o sucesso da sonda, ContainersReady torna-se True, mas o Pod permanece não pronto até a confirmação de todas as condições do readiness gate.

    2. 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-svc para True.

    3. Pod torna-se totalmente pronto: Depois que todas as condições do readiness gate forem True, o kubelet define Ready como True. 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 readinessGates deve 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 estado Ready, travando a implantação.

    • Suporte a múltiplos Services: Um Pod pode listar várias entradas readinessGates.conditionType para múltiplos Services do tipo LoadBalancer. 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

  1. Adicione o rótulo k8s.alibabacloud.com/pod-readiness-gate-inject: enabled ao namespace default.

    kubectl label namespace default k8s.alibabacloud.com/pod-readiness-gate-inject=enabled

    Saída esperada:

    namespace/default labeled
  2. Verifique o rótulo no namespace.

    kubectl get namespace default -oyaml

    Saí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: Active

    O rótulo foi adicionado ao namespace.

Criar um Service do tipo LoadBalancer

  1. Crie o arquivo my-svc.yaml usando 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: 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 # Specifies that the load balancer type is NLB.
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: nginx
      type: LoadBalancer
  2. Aplique o Service.

    kubectl apply -f my-svc.yaml
  3. Verifique o status do Service.

    kubectl get service my-svc

    Aguarde 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

  1. Crie o arquivo my-nginx.yaml com 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.
  2. Aplique o Deployment.

    kubectl apply -f my-nginx.yaml
  3. Verifique o status dos Pods e os readiness gates.

    kubectl get pod -owide -l app=nginx

    Saí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/1

    Execuçõ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

  1. Reinicie o Deployment.

    kubectl rollout restart deployment my-nginx

    Saída esperada:

    deployment.apps/my-nginx restarted
  2. Verifique o status dos Pods e os readiness gates.

    kubectl get pod -owide -l app=nginx

    Saí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/1

    Durante 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

  1. Crie o arquivo my-svc.yaml usando 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: 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 # Specifies that the load balancer type is NLB.
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: nginx
      type: LoadBalancer
  2. Aplique o Service.

    kubectl apply -f my-svc.yaml
  3. Verifique o status do Service.

    kubectl get service my-svc

    Aguarde 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

  1. Crie o arquivo my-nginx.yaml. No modelo do Pod, defina o readiness gate conditionType como service.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.
  2. Aplique o Deployment.

    kubectl apply -f my-nginx.yaml
  3. Verifique o status dos Pods e os readiness gates.

    kubectl get pod -owide -l app=nginx

    Saí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/1

    Execuçõ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

  1. Reinicie o Deployment.

    kubectl rollout restart deployment my-nginx

    Saída esperada:

    deployment.apps/my-nginx restarted
  2. Verifique o status dos Pods e os readiness gates.

    kubectl get pod -owide -l app=nginx

    Saí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/1

    Durante 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.