Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Aug 11, 2026

Lorsque vous exposez des pods backend via un service LoadBalancer, les mises à jour progressives peuvent interrompre l'accès si les pods passent à l'état prêt avant que l'équilibreur de charge ne les ajoute au groupe de serveurs backend. Configurez une readiness gate pour garantir des mises à jour fluides des pods. Cette rubrique explique comment utiliser le mécanisme Pod Readiness Gate pour assurer des mises à jour sans interruption.

Prérequis

  • Un ACK managed cluster ou ACK Serverless cluster répond aux exigences suivantes. Consultez les rubriques Créer un ACK managed cluster et Créer un ACK Serverless cluster.

    • Pour les ACK managed cluster, le plug-in réseau doit être Terway.

    • La version du cluster est 1,24 ou ultérieure. Consultez la rubrique Mettre à niveau un cluster.

    • cloud-controller-manager est en version v2.10.0 ou ultérieure. Consultez la rubrique Cloud Controller Manager.

    • Pour l'injection automatique de readiness gate : cloud-controller-manager en version v2.12.4 ou ultérieure avec le webhook Pod ReadinessGate activé. Dans la section Parameter Configuration de Cloud Controller Manager, sélectionnez Enable Pod ReadinessGate Webhook capability, puis cliquez sur Confirm.

  • Un client kubectl est connecté au cluster ACK. Pour plus d'informations, consultez la rubrique Se connecter à un cluster ACK à l'aide de kubectl.

Contexte

L'exposition d'une application via un service LoadBalancer et l'exécution d'une mise à jour progressive peuvent entraîner de brèves interruptions de service ou des échecs de connexion.

  • Cause

    Les nouveaux pods passent souvent à l'état prêt avant que l'équilibreur de charge n'ajoute leur adresse IP à la liste des serveurs backend. La mise à jour progressive peut alors terminer l'ancien pod pendant que le trafic lui est toujours routé, provoquant des échecs de connexion.

  • Solution

    Utilisez Pod Readiness Gate dans le YAML du pod pour ajouter des conditions de disponibilité personnalisées, telles que service.readiness.alibabacloud.com/<Service Name> pour un service LoadBalancer. Le pod est marqué comme Ready et ne reçoit du trafic qu'une fois ces conditions remplies.

  • Exemple de procédure

    image
  • Fonctionnement

    Avec readinessGates configuré, un pod devient prêt selon les étapes suivantes :

    1. Disponibilité du sondage de conteneur : kubelet exécute le readinessProbe du conteneur. Une fois le sondage réussi, ContainersReady passe à True, mais le pod reste non prêt tant que toutes les conditions de readiness gate ne sont pas confirmées.

    2. Enregistrement du backend par CCM : CCM détecte la disponibilité du conteneur, ajoute l'adresse IP du pod au groupe de serveurs backend de l'équilibreur de charge, puis définit une condition telle que service.readiness.alibabacloud.com/my-svc sur True.

    3. Le pod est entièrement prêt : une fois que toutes les conditions de readiness gate sont définies sur True, kubelet définit Ready sur True. La mise à jour progressive peut alors terminer l'ancien pod en toute sécurité.

  • Remarques sur l'utilisation

    • Le service doit exister : le nom du service dans readinessGates doit être correct et le service doit exister dans le cluster. Si le nom est incorrect ou si le service est supprimé lors du démarrage du pod, CCM ne peut pas enregistrer le backend et le pod n'atteint jamais l'état Ready, ce qui bloque le déploiement.

    • Prise en charge de plusieurs services : un pod peut répertorier plusieurs entrées readinessGates.conditionType pour plusieurs services LoadBalancer. Le pod devient prêt uniquement après s'être enregistré auprès de tous les backends de service spécifiés.

Procédure

Automatique

Après avoir activé le webhook Pod ReadinessGate, ajoutez l'étiquette k8s.alibabacloud.com/pod-readiness-gate-inject: enabled à un namespace pour injecter des readiness gates dans tous les pods.

Les étapes suivantes permettent d'activer l'injection automatique pour le namespace default.

Ajouter l'étiquette d'injection automatique

  1. Ajoutez l'étiquette k8s.alibabacloud.com/pod-readiness-gate-inject: enabled au namespace default.

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

    Sortie attendue :

    namespace/default labeled
  2. Vérifiez l'étiquette sur le namespace.

    kubectl get namespace default -oyaml

    Sortie attendue :

    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

    L'étiquette est ajoutée au namespace.

Créer un service LoadBalancer

  1. Créez le fichier my-svc.yaml à partir du modèle YAML suivant. Créez une instance Classic Load Balancer (CLB) ou Network Load Balancer (NLB) selon vos besoins.

    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. Appliquez le service.

    kubectl apply -f my-svc.yaml
  3. Vérifiez l'état du service.

    kubectl get service my-svc

    Attendez que EXTERNAL-IP affiche une adresse IP ou un nom de domaine, indiquant que l'instance load balancer est créée.

    NAME     TYPE           CLUSTER-IP       EXTERNAL-IP                 PORT(S)        AGE
    my-svc   LoadBalancer   192.XX.XX.215    <IP address/domain name>     80:30493/TCP   8s

Créer un exemple de Deployment

  1. Créez le fichier my-nginx.yaml à partir du modèle YAML suivant.

    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. Appliquez le Deployment.

    kubectl apply -f my-nginx.yaml
  3. Vérifiez l'état des pods et les readiness gates.

    kubectl get pod -owide -l app=nginx

    Sortie attendue :

    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

    Des exécutions répétées montrent que READINESS GATES passe de 0/1 à 1/1, indiquant un enregistrement réussi auprès du groupe de serveurs backend de l'équilibreur de charge.

Effectuer une mise à jour progressive

  1. Redémarrez le Deployment.

    kubectl rollout restart deployment my-nginx

    Sortie attendue :

    deployment.apps/my-nginx restarted
  2. Vérifiez l'état des pods et les readiness gates.

    kubectl get pod -owide -l app=nginx

    Sortie attendue :

    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

    Pendant la mise à jour progressive, les pods attendent la readiness gate avant que la mise à jour ne se poursuive, garantissant ainsi que les nouveaux pods s'enregistrent d'abord auprès du groupe de serveurs backend de l'équilibreur de charge.

Manuel

Créer un service LoadBalancer

  1. Créez le fichier my-svc.yaml à partir du modèle YAML suivant. Créez une instance Classic Load Balancer (CLB) ou Network Load Balancer (NLB) selon vos besoins.

    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. Appliquez le service.

    kubectl apply -f my-svc.yaml
  3. Vérifiez l'état du service.

    kubectl get service my-svc

    Attendez que EXTERNAL-IP affiche une adresse IP ou un nom de domaine, indiquant que l'instance load balancer est créée.

    NAME     TYPE           CLUSTER-IP       EXTERNAL-IP                 PORT(S)        AGE
    my-svc   LoadBalancer   192.XX.XX.215    <IP address/domain name>     80:30493/TCP   8s

Créer un exemple de Deployment

  1. Créez le fichier my-nginx.yaml. Dans le modèle de pod, définissez la readiness gate conditionType sur 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. Appliquez le Deployment.

    kubectl apply -f my-nginx.yaml
  3. Vérifiez l'état des pods et les readiness gates.

    kubectl get pod -owide -l app=nginx

    Sortie attendue :

    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

    Des exécutions répétées montrent que READINESS GATES passe de 0/1 à 1/1, indiquant un enregistrement réussi auprès du groupe de serveurs backend de l'équilibreur de charge.

Effectuer une mise à jour progressive

  1. Redémarrez le Deployment.

    kubectl rollout restart deployment my-nginx

    Sortie attendue :

    deployment.apps/my-nginx restarted
  2. Vérifiez l'état des pods et les readiness gates.

    kubectl get pod -owide -l app=nginx

    Sortie attendue :

    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

    Pendant la mise à jour progressive, les pods attendent la readiness gate avant que la mise à jour ne se poursuive, garantissant ainsi que les nouveaux pods s'enregistrent d'abord auprès du groupe de serveurs backend de l'équilibreur de charge.