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é commeReadyet ne reçoit du trafic qu'une fois ces conditions remplies. -
Exemple de procédure
-
Fonctionnement
Avec
readinessGatesconfiguré, un pod devient prêt selon les étapes suivantes :Disponibilité du sondage de conteneur : kubelet exécute le
readinessProbedu conteneur. Une fois le sondage réussi,ContainersReadypasse àTrue, mais le pod reste non prêt tant que toutes les conditions de readiness gate ne sont pas confirmées.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-svcsurTrue.Le pod est entièrement prêt : une fois que toutes les conditions de readiness gate sont définies sur
True, kubelet définitReadysurTrue. 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
readinessGatesdoit ê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'étatReady, ce qui bloque le déploiement.Prise en charge de plusieurs services : un pod peut répertorier plusieurs entrées
readinessGates.conditionTypepour plusieurs servicesLoadBalancer. 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
-
Ajoutez l'étiquette
k8s.alibabacloud.com/pod-readiness-gate-inject: enabledau namespacedefault.kubectl label namespace default k8s.alibabacloud.com/pod-readiness-gate-inject=enabledSortie attendue :
namespace/default labeled -
Vérifiez l'étiquette sur le namespace.
kubectl get namespace default -oyamlSortie 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: ActiveL'étiquette est ajoutée au namespace.
Créer un service LoadBalancer
-
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: 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 -
Appliquez le service.
kubectl apply -f my-svc.yaml -
Vérifiez l'état du service.
kubectl get service my-svcAttendez que EXTERNAL-IP affiche une adresse IP ou un nom de domaine, indiquant que l'instance
load balancerest 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
-
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. -
Appliquez le Deployment.
kubectl apply -f my-nginx.yaml -
Vérifiez l'état des pods et les readiness gates.
kubectl get pod -owide -l app=nginxSortie 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/1Des 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
-
Redémarrez le Deployment.
kubectl rollout restart deployment my-nginxSortie attendue :
deployment.apps/my-nginx restarted -
Vérifiez l'état des pods et les readiness gates.
kubectl get pod -owide -l app=nginxSortie 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/1Pendant 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
-
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: 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 -
Appliquez le service.
kubectl apply -f my-svc.yaml -
Vérifiez l'état du service.
kubectl get service my-svcAttendez que EXTERNAL-IP affiche une adresse IP ou un nom de domaine, indiquant que l'instance
load balancerest 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
-
Créez le fichier
my-nginx.yaml. Dans le modèle de pod, définissez la readiness gateconditionTypesurservice.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. -
Appliquez le Deployment.
kubectl apply -f my-nginx.yaml -
Vérifiez l'état des pods et les readiness gates.
kubectl get pod -owide -l app=nginxSortie 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/1Des 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
-
Redémarrez le Deployment.
kubectl rollout restart deployment my-nginxSortie attendue :
deployment.apps/my-nginx restarted -
Vérifiez l'état des pods et les readiness gates.
kubectl get pod -owide -l app=nginxSortie 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/1Pendant 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.