Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Ensure smooth Pod updates with a readiness gate

Última actualización: Sep 04, 2026

Cuando expone pods de backend mediante un Service LoadBalancer, las actualizaciones continuas pueden interrumpir el acceso si los pods se marcan como listos antes de que el load balancer los agregue al grupo de servidores backend. Configure un readiness gate para garantizar actualizaciones de pod sin interrupciones. Este tema explica cómo utilizar el mecanismo Pod Readiness Gate para lograr actualizaciones fluidas.

Requisitos previos

  • Un clúster administrado ACK o un clúster ACK Serverless que cumpla con los siguientes requisitos. Consulte Create an ACK managed cluster y Create an ACK Serverless cluster.

    • Para los clústeres administrados ACK, el complemento de red debe ser Terway.

    • La versión del clúster es 1.24 o posterior. Consulte Upgrade a cluster.

    • cloud-controller-manager tiene la versión v2.10.0 o posterior. Consulte Cloud Controller Manager.

    • Para la inyección automática de readiness gate: cloud-controller-manager v2.12.4 o posterior con Pod ReadinessGate Webhook habilitado. En Parameter Configuration de Cloud Controller Manager, seleccione Enable Pod ReadinessGate Webhook capability y luego haga clic en Confirm.

  • Un cliente kubectl conectado al clúster ACK. Para obtener más información, consulte Connect to an ACK cluster using kubectl.

Contexto

Exponer una aplicación con un Service LoadBalancer y realizar una actualización continua puede provocar breves interrupciones del servicio o fallos de conexión.

  • Causa

    A menudo, los nuevos Pods se marcan como listos antes de que el load balancer agregue su IP a la lista de servidores backend. La actualización continua podría entonces finalizar el Pod antiguo mientras el tráfico aún se dirige hacia él, lo que provoca fallos de conexión.

  • Solución

    Utilice Pod Readiness Gate en el YAML del Pod para agregar condiciones de preparación personalizadas, como service.readiness.alibabacloud.com/<Service Name> para un Service LoadBalancer. El Pod se marca como Ready y recibe tráfico solo después de cumplir estas condiciones.

  • Procedimiento de ejemplo

    image
  • Funcionamiento

    Con readinessGates configurado, un Pod se marca como listo de la siguiente manera:

    1. Preparación mediante sondeo del contenedor: El kubelet ejecuta el readinessProbe del contenedor. Una vez que el sondeo tiene éxito, ContainersReady cambia a True, pero el Pod permanece en estado no listo hasta que se confirmen todas las condiciones del readiness gate.

    2. CCM registra el backend: CCM detecta la preparación del contenedor, agrega la IP del Pod al grupo de servidores backend del load balancer y luego establece una condición como service.readiness.alibabacloud.com/my-svc en True.

    3. El Pod se marca completamente como listo: Después de que todas las condiciones del readiness gate sean True, el kubelet establece Ready en True. La actualización continua puede entonces finalizar de forma segura el Pod antiguo.

  • Notas de uso

    • El Service debe existir: El nombre del Service en readinessGates debe ser correcto y el Service debe existir en el clúster. Si el nombre es incorrecto o el Service se elimina durante el inicio del Pod, CCM no podrá registrar el backend y el Pod nunca alcanzará el estado Ready, lo que detendrá el despliegue.

    • Se admiten varios Services: Un Pod puede listar varias entradas readinessGates.conditionType para múltiples Services LoadBalancer. El Pod se marca como listo solo después de registrarse en todos los backends de los Services especificados.

Procedimiento

Automático

Después de habilitar Pod ReadinessGate Webhook, agregue la etiqueta k8s.alibabacloud.com/pod-readiness-gate-inject: enabled a un namespace para inyectar readiness gates en todos los Pods.

Los siguientes pasos habilitan la inyección automática para el namespace default.

Agregar la etiqueta de inyección automática

  1. Agregue la etiqueta k8s.alibabacloud.com/pod-readiness-gate-inject: enabled al namespace default.

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

    Salida esperada:

    namespace/default labeled
  2. Compruebe la etiqueta en el namespace.

    kubectl get namespace default -oyaml

    Salida 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

    La etiqueta se ha agregado al namespace.

Crear un Service LoadBalancer

  1. Cree my-svc.yaml a partir de la siguiente plantilla YAML. Cree una instancia de Classic Load Balancer (CLB) o Network Load Balancer (NLB) según sea necesario.

    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 el Service.

    kubectl apply -f my-svc.yaml
  3. Compruebe el estado del Service.

    kubectl get service my-svc

    Espere hasta que EXTERNAL-IP muestre una dirección IP o un nombre de dominio, lo que indica que se creó la instancia del 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

Crear un Deployment de ejemplo

  1. Cree my-nginx.yaml a partir de la siguiente plantilla YAML.

    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 el Deployment.

    kubectl apply -f my-nginx.yaml
  3. Compruebe el estado de los Pods y los readiness gates.

    kubectl get pod -owide -l app=nginx

    Salida 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

    Las ejecuciones repetidas muestran que READINESS GATES cambia de 0/1 a 1/1, lo que indica un registro exitoso en el grupo de servidores backend del load balancer.

Realizar una actualización continua

  1. Reinicie el Deployment.

    kubectl rollout restart deployment my-nginx

    Salida esperada:

    deployment.apps/my-nginx restarted
  2. Compruebe el estado de los Pods y los readiness gates.

    kubectl get pod -owide -l app=nginx

    Salida 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 la actualización continua, los Pods esperan al readiness gate antes de que continúe la actualización, lo que garantiza que los nuevos Pods se registren primero en el grupo de servidores backend del load balancer.

Manual

Crear un Service LoadBalancer

  1. Cree my-svc.yaml a partir de la siguiente plantilla YAML. Cree una instancia de Classic Load Balancer (CLB) o Network Load Balancer (NLB) según sea necesario.

    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 el Service.

    kubectl apply -f my-svc.yaml
  3. Compruebe el estado del Service.

    kubectl get service my-svc

    Espere hasta que EXTERNAL-IP muestre una dirección IP o un nombre de dominio, lo que indica que se creó la instancia del 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

Crear un Deployment de ejemplo

  1. Cree my-nginx.yaml. En la plantilla del Pod, establezca el readiness gate conditionType en 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 el Deployment.

    kubectl apply -f my-nginx.yaml
  3. Compruebe el estado de los Pods y los readiness gates.

    kubectl get pod -owide -l app=nginx

    Salida 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

    Las ejecuciones repetidas muestran que READINESS GATES cambia de 0/1 a 1/1, lo que indica un registro exitoso en el grupo de servidores backend del load balancer.

Realizar una actualización continua

  1. Reinicie el Deployment.

    kubectl rollout restart deployment my-nginx

    Salida esperada:

    deployment.apps/my-nginx restarted
  2. Compruebe el estado de los Pods y los readiness gates.

    kubectl get pod -owide -l app=nginx

    Salida 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 la actualización continua, los Pods esperan al readiness gate antes de que continúe la actualización, lo que garantiza que los nuevos Pods se registren primero en el grupo de servidores backend del load balancer.