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 comoReadyy recibe tráfico solo después de cumplir estas condiciones. -
Procedimiento de ejemplo
-
Funcionamiento
Con
readinessGatesconfigurado, un Pod se marca como listo de la siguiente manera:Preparación mediante sondeo del contenedor: El kubelet ejecuta el
readinessProbedel contenedor. Una vez que el sondeo tiene éxito,ContainersReadycambia aTrue, pero el Pod permanece en estado no listo hasta que se confirmen todas las condiciones del readiness gate.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-svcenTrue.El Pod se marca completamente como listo: Después de que todas las condiciones del readiness gate sean
True, el kubelet estableceReadyenTrue. 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
readinessGatesdebe 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 estadoReady, lo que detendrá el despliegue.Se admiten varios Services: Un Pod puede listar varias entradas
readinessGates.conditionTypepara múltiples ServicesLoadBalancer. 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
-
Agregue la etiqueta
k8s.alibabacloud.com/pod-readiness-gate-inject: enabledal namespacedefault.kubectl label namespace default k8s.alibabacloud.com/pod-readiness-gate-inject=enabledSalida esperada:
namespace/default labeled -
Compruebe la etiqueta en el namespace.
kubectl get namespace default -oyamlSalida 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: ActiveLa etiqueta se ha agregado al namespace.
Crear un Service LoadBalancer
-
Cree
my-svc.yamla 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: 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 el Service.
kubectl apply -f my-svc.yaml -
Compruebe el estado del Service.
kubectl get service my-svcEspere 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
-
Cree
my-nginx.yamla 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. -
Aplique el Deployment.
kubectl apply -f my-nginx.yaml -
Compruebe el estado de los Pods y los readiness gates.
kubectl get pod -owide -l app=nginxSalida 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/1Las 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
-
Reinicie el Deployment.
kubectl rollout restart deployment my-nginxSalida esperada:
deployment.apps/my-nginx restarted -
Compruebe el estado de los Pods y los readiness gates.
kubectl get pod -owide -l app=nginxSalida 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 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
-
Cree
my-svc.yamla 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: 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 el Service.
kubectl apply -f my-svc.yaml -
Compruebe el estado del Service.
kubectl get service my-svcEspere 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
-
Cree
my-nginx.yaml. En la plantilla del Pod, establezca el readiness gateconditionTypeenservice.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 el Deployment.
kubectl apply -f my-nginx.yaml -
Compruebe el estado de los Pods y los readiness gates.
kubectl get pod -owide -l app=nginxSalida 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/1Las 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
-
Reinicie el Deployment.
kubectl rollout restart deployment my-nginxSalida esperada:
deployment.apps/my-nginx restarted -
Compruebe el estado de los Pods y los readiness gates.
kubectl get pod -owide -l app=nginxSalida 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 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.