Saat menggunakan layanan LoadBalancer untuk mengekspos Pod backend, pembaruan rolling dapat menyebabkan gangguan layanan jika Pod diperbarui lebih cepat daripada proses pendaftarannya ke grup server backend load balancer. Anda dapat mengonfigurasi readiness gate untuk memastikan pembaruan Pod berjalan lancar. Topik ini menjelaskan cara menggunakan fitur readiness gate guna memastikan kelancaran pembaruan Pod.
Prasyarat
-
Anda memiliki ACK managed cluster atau ACK Serverless cluster yang memenuhi persyaratan berikut. Untuk informasi selengkapnya, lihat Create an ACK managed cluster dan Create an ACK Serverless cluster.
-
Jika menggunakan ACK managed cluster, plug-in jaringan harus Terway.
-
Versi kluster adalah 1.24 atau lebih baru. Untuk informasi selengkapnya, lihat Upgrade a cluster.
-
Komponen cloud-controller-manager versi v2.10.0 atau lebih baru. Untuk informasi selengkapnya, lihat Cloud Controller Manager.
-
Untuk menggunakan fitur injeksi readiness gate otomatis, pastikan komponen cloud-controller-manager versi v2.12.4 atau lebih baru dan kemampuan Pod ReadinessGate Webhook diaktifkan dalam parameter komponen tersebut. Di bagian Parameter Configuration Cloud Controller Manager, centang kotak Enable Pod ReadinessGate Webhook capability, lalu klik Confirm.
-
Klien kubectl telah terhubung ke kluster ACK. Untuk informasi selengkapnya, lihat Connect to an ACK cluster using kubectl.
Latar Belakang
Saat menggunakan layanan LoadBalancer untuk mengekspos aplikasi dan melakukan pembaruan rolling, Anda mungkin mengalami gangguan layanan singkat atau kegagalan koneksi.
-
Penyebab
Pod baru sering kali mulai lebih cepat daripada load balancer dapat memperbarui daftar server backend-nya. Ketika kontainer Pod baru sudah siap tetapi alamat IP-nya belum ditambahkan ke backend load balancer, proses pembaruan rolling mungkin telah mulai menghentikan tugas Pod lama. Akibatnya, sebagian trafik masih diarahkan ke Pod lama yang sedang dihentikan atau telah dihapus dari load balancer, sehingga menyebabkan kegagalan koneksi.
-
Solusi
Anda dapat menggunakan mekanisme Pod Readiness Gate dalam konfigurasi YAML Pod untuk mengontrol status siapnya dengan kondisi kustom. Readiness gate memungkinkan Anda menetapkan kondisi kustom, seperti
service.readiness.alibabacloud.com/<Service Name>untuk layanan LoadBalancer. Hanya ketika kondisi-kondisi tersebut terpenuhi, Pod akan ditandai sebagaiReadydan mulai menerima trafik. -
Prosedur contoh
-
Cara kerja
Saat sebuah Pod dikonfigurasi dengan
readinessGates, proses kesiapannya adalah sebagai berikut:-
Kesiapan probe kontainer: kubelet menjalankan
readinessProbekontainer. Setelah probe berhasil, statusContainersReadyPod berubah menjadiTrue. Pada titik ini, Pod secara keseluruhan belum siap dan menunggu status readiness gate lainnya dikonfirmasi. -
CCM mendaftarkan backend: cloud-controller-manager (CCM) mendeteksi bahwa kontainer sudah siap dan menambahkan alamat IP Pod ke grup server backend load balancer yang ditentukan. Setelah pendaftaran berhasil, CCM menambahkan kondisi untuk Service yang sesuai ke dalam Pod, misalnya
service.readiness.alibabacloud.com/my-svc, dan mengatur statusnya menjadiTrue. -
Pod menjadi sepenuhnya siap: kubelet memastikan bahwa semua kondisi readiness gate bernilai
True, lalu mengatur status akhirReadyPod menjadiTrue. Baru pada saat itulah Pod secara resmi dianggap siap, dan proses pembaruan rolling dapat dengan aman menghentikan tugas Pod lama.
-
-
Catatan
-
Service harus ada: Pastikan nama Service yang dirujuk dalam
readinessGatesbenar dan Service tersebut ada di kluster. Jika nama Service salah atau Service dihapus saat Pod sedang dimulai, CCM tidak dapat mendaftarkan backend. Pod tidak akan pernah mencapai statusReady, sehingga proses deployment akan macet. -
Beberapa Service didukung: Sebuah Pod dapat dikonfigurasi dengan beberapa entri
readinessGates.conditionTypeuntuk beberapa layananLoadBalancer. Dalam kasus ini, Pod hanya menjadi siap setelah berhasil terdaftar di backend semua Service yang ditentukan.
-
Prosedur
Otomatis
Setelah mengaktifkan Pod ReadinessGate Webhook, Anda dapat menambahkan label k8s.alibabacloud.com/pod-readiness-gate-inject: enabled ke namespace untuk mengaktifkan injeksi readiness gate otomatis bagi semua Pod di namespace tersebut.
Langkah-langkah berikut menjelaskan cara mengaktifkan injeksi otomatis untuk namespace default.
Langkah 1: Tambahkan label injeksi otomatis
-
Tambahkan label
k8s.alibabacloud.com/pod-readiness-gate-inject: enabledke namespacedefaultuntuk mengaktifkan injeksi otomatis.kubectl label namespace default k8s.alibabacloud.com/pod-readiness-gate-inject=enabledOutput yang diharapkan:
namespace/default labeled -
Verifikasi label pada namespace.
kubectl get namespace default -oyamlOutput yang diharapkan:
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: ActiveOutput menunjukkan bahwa label telah ditambahkan ke namespace.
Langkah 2: Buat layanan load balancer
-
Buat file bernama
my-svc.yamlberdasarkan templat YAML berikut. Anda dapat membuat instans Classic Load Balancer (CLB) atau Network Load Balancer (NLB) sesuai kebutuhan.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 -
Buat layanan contoh.
kubectl apply -f my-svc.yaml -
Periksa status layanan.
kubectl get service my-svcTunggu hingga alamat IP atau nama domain muncul di kolom EXTERNAL-IP. Hal ini menunjukkan bahwa instans
load balanceryang sesuai telah dibuat.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-svc LoadBalancer 192.XX.XX.215 <IP address/domain name> 80:30493/TCP 8s
Langkah 3: Buat Deployment contoh
-
Buat file bernama
my-nginx.yamlberdasarkan templat YAML berikut.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. -
Terapkan Deployment contoh.
kubectl apply -f my-nginx.yaml -
Periksa status Pod dan readiness gate-nya.
kubectl get pod -owide -l app=nginxOutput yang diharapkan:
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/1Menjalankan perintah ini beberapa kali menunjukkan status READINESS GATES berubah dari 0/1 menjadi 1/1. Perubahan ini menunjukkan bahwa Pod telah berhasil terdaftar di grup server backend load balancer.
Langkah 4: Lakukan pembaruan rolling
-
Restart Deployment contoh.
kubectl rollout restart deployment my-nginxOutput yang diharapkan:
deployment.apps/my-nginx restarted -
Periksa status Pod dan readiness gate-nya.
kubectl get pod -owide -l app=nginxOutput yang diharapkan:
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/1Jika Anda menjalankan perintah ini beberapa kali selama pembaruan rolling, Anda akan mengamati bahwa Pod menunggu readiness gate menjadi siap. Pembaruan rolling hanya dilanjutkan setelah readiness gate siap, memastikan bahwa Pod baru telah terdaftar di grup server backend load balancer.
Manual
Langkah 1: Buat layanan load balancer
-
Buat file bernama
my-svc.yamlberdasarkan templat YAML berikut. Anda dapat membuat instans Classic Load Balancer (CLB) atau Network Load Balancer (NLB) sesuai kebutuhan.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 -
Buat layanan contoh.
kubectl apply -f my-svc.yaml -
Periksa status layanan.
kubectl get service my-svcTunggu hingga alamat IP atau nama domain muncul di kolom EXTERNAL-IP. Hal ini menunjukkan bahwa instans
load balanceryang sesuai telah dibuat.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-svc LoadBalancer 192.XX.XX.215 <IP address/domain name> 80:30493/TCP 8s
Langkah 2: Buat Deployment contoh
-
Buat file bernama
my-nginx.yaml. Di templat Pod, aturconditionTypereadiness gate menjadiservice.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. -
Terapkan Deployment contoh.
kubectl apply -f my-nginx.yaml -
Periksa status Pod dan readiness gate-nya.
kubectl get pod -owide -l app=nginxOutput yang diharapkan:
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/1Menjalankan perintah ini beberapa kali menunjukkan status READINESS GATES berubah dari 0/1 menjadi 1/1. Perubahan ini menunjukkan bahwa Pod telah berhasil terdaftar di grup server backend load balancer.
Langkah 3: Lakukan pembaruan rolling
-
Restart Deployment contoh.
kubectl rollout restart deployment my-nginxOutput yang diharapkan:
deployment.apps/my-nginx restarted -
Periksa status Pod dan readiness gate-nya.
kubectl get pod -owide -l app=nginxOutput yang diharapkan:
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/1Jika Anda menjalankan perintah ini beberapa kali selama pembaruan rolling, Anda akan mengamati bahwa Pod menunggu readiness gate menjadi siap. Pembaruan rolling hanya dilanjutkan setelah readiness gate siap, memastikan bahwa Pod baru telah terdaftar di grup server backend load balancer.