Saat Anda mengekspos Pod backend melalui layanan LoadBalancer, pembaruan rolling dapat mengganggu akses jika Pod menjadi ready sebelum load balancer menambahkannya ke grup server backend. Konfigurasikan readiness gate untuk memastikan pembaruan Pod berjalan lancar. Topik ini menjelaskan cara menggunakan mekanisme Pod Readiness Gate guna mencapai pembaruan yang mulus.
Prasyarat
-
Kluster ACK yang dikelola atau kluster ACK Serverless memenuhi persyaratan berikut. Lihat Buat kluster ACK yang dikelola dan Buat kluster ACK Serverless.
-
Untuk kluster ACK yang dikelola, plug-in jaringan harus Terway.
-
Versi kluster adalah 1.24 atau lebih baru. Lihat Tingkatkan versi kluster.
-
cloud-controller-manager versi v2.10.0 atau lebih baru. Lihat Cloud Controller Manager.
-
Untuk injeksi readiness gate otomatis: cloud-controller-manager v2.12.4 atau lebih baru dengan Pod ReadinessGate Webhook diaktifkan. Di Cloud Controller Manager Parameter Configuration, pilih Enable Pod ReadinessGate Webhook capability, lalu klik Confirm.
-
Klien kubectl telah terhubung ke kluster ACK. Untuk informasi selengkapnya, lihat Hubungkan ke kluster ACK menggunakan kubectl.
Latar Belakang
Mengekspos aplikasi dengan layanan LoadBalancer dan melakukan pembaruan rolling dapat menyebabkan gangguan layanan singkat atau kegagalan koneksi.
-
Penyebab
Pod baru sering kali menjadi ready sebelum load balancer menambahkan IP-nya ke daftar server backend. Pembaruan rolling kemudian dapat menghentikan tugas Pod lama saat trafik masih diarahkan ke sana, sehingga menyebabkan kegagalan koneksi.
-
Solusi
Gunakan Pod Readiness Gate dalam YAML Pod untuk menambahkan kondisi readiness khusus, seperti
service.readiness.alibabacloud.com/<Nama Layanan>untuk layanan LoadBalancer. Pod ditandai sebagaiReadydan menerima trafik hanya setelah kondisi tersebut terpenuhi. -
Prosedur contoh
-
Cara kerja
Dengan
readinessGatesdikonfigurasi, Pod menjadi ready sebagai berikut:-
Readiness probe kontainer: kubelet menjalankan
readinessProbekontainer. Setelah probe berhasil,ContainersReadymenjadiTrue, tetapi Pod tetap tidak ready hingga semua kondisi readiness gate dikonfirmasi. -
CCM mendaftarkan backend: CCM mendeteksi kesiapan kontainer, menambahkan IP Pod ke grup server backend load balancer, lalu mengatur kondisi seperti
service.readiness.alibabacloud.com/my-svcmenjadiTrue. -
Pod menjadi fully ready: Setelah semua kondisi readiness gate bernilai
True, kubelet mengaturReadymenjadiTrue. Pembaruan rolling kemudian dapat menghentikan tugas Pod lama secara aman.
-
-
Catatan penggunaan
-
Layanan harus ada: Nama layanan dalam
readinessGatesharus benar dan layanan tersebut harus ada di kluster. Jika nama salah atau layanan dihapus selama startup Pod, CCM tidak dapat mendaftarkan backend dan Pod tidak pernah mencapai statusReady, sehingga deployment terhenti. -
Beberapa layanan didukung: Pod dapat mencantumkan beberapa entri
readinessGates.conditionTypeuntuk beberapa layananLoadBalancer. Pod menjadi ready hanya setelah terdaftar di semua backend layanan yang ditentukan.
-
Prosedur
Otomatis
Setelah Anda mengaktifkan Pod ReadinessGate Webhook, tambahkan label k8s.alibabacloud.com/pod-readiness-gate-inject: enabled ke namespace untuk menginjeksi readiness gate ke semua Pod.
Langkah-langkah berikut mengaktifkan injeksi otomatis untuk namespace default.
Tambahkan label injeksi otomatis
-
Tambahkan label
k8s.alibabacloud.com/pod-readiness-gate-inject: enabledke namespacedefault.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: ActiveLabel telah ditambahkan ke namespace.
Buat Layanan LoadBalancer
-
Buat file
my-svc.yamldari templat YAML berikut. Buat instans Classic Load Balancer (CLB) atau Network Load Balancer (NLB) sesuai kebutuhan.CLB
apiVersion: v1 kind: Service metadata: name: my-svc namespace: default # Namespace-nya adalah 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}" # Contoh: cn-hangzhou-k:vsw-i123456,cn-hangzhou-j:vsw-j654321. spec: loadBalancerClass: alibabacloud.com/nlb # Menentukan bahwa jenis load balancer adalah NLB. ports: - port: 80 targetPort: 80 protocol: TCP selector: app: nginx type: LoadBalancer -
Terapkan layanan tersebut.
kubectl apply -f my-svc.yaml -
Periksa status layanan.
kubectl get service my-svcTunggu hingga EXTERNAL-IP menampilkan alamat IP atau nama domain, yang menunjukkan bahwa instans
load balancertelah 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
Buat Deployment contoh
-
Buat file
my-nginx.yamldari templat YAML berikut.apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx # Nama contoh. namespace: default # Namespace-nya adalah default. labels: app: nginx spec: replicas: 2 # Menentukan jumlah replika. selector: matchLabels: app: nginx # Harus sesuai dengan selector layanan agar diekspos oleh layanan tersebut. 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 # Port ini harus diekspos di layanan. -
Terapkan Deployment tersebut.
kubectl apply -f my-nginx.yaml -
Periksa status Pod dan readiness gate.
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/1Jalankan perintah berulang kali dan Anda akan melihat READINESS GATES berubah dari 0/1 menjadi 1/1, yang menunjukkan pendaftaran berhasil ke grup server backend load balancer.
Lakukan pembaruan rolling
-
Restart Deployment.
kubectl rollout restart deployment my-nginxOutput yang diharapkan:
deployment.apps/my-nginx restarted -
Periksa status Pod dan readiness gate.
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/1Selama pembaruan rolling, Pod menunggu readiness gate sebelum pembaruan dilanjutkan, memastikan Pod baru terdaftar di grup server backend load balancer terlebih dahulu.
Manual
Buat Layanan LoadBalancer
-
Buat file
my-svc.yamldari templat YAML berikut. Buat instans Classic Load Balancer (CLB) atau Network Load Balancer (NLB) sesuai kebutuhan.CLB
apiVersion: v1 kind: Service metadata: name: my-svc namespace: default # Namespace-nya adalah 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}" # Contoh: cn-hangzhou-k:vsw-i123456,cn-hangzhou-j:vsw-j654321. spec: loadBalancerClass: alibabacloud.com/nlb # Menentukan bahwa jenis load balancer adalah NLB. ports: - port: 80 targetPort: 80 protocol: TCP selector: app: nginx type: LoadBalancer -
Terapkan layanan tersebut.
kubectl apply -f my-svc.yaml -
Periksa status layanan.
kubectl get service my-svcTunggu hingga EXTERNAL-IP menampilkan alamat IP atau nama domain, yang menunjukkan bahwa instans
load balancertelah 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
Buat Deployment contoh
-
Buat file
my-nginx.yaml. Di templat Pod, aturconditionTypereadiness gate menjadiservice.readiness.alibabacloud.com/my-svc.apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx # Nama contoh. namespace: default # Namespace-nya adalah default. labels: app: nginx spec: replicas: 2 # Menentukan jumlah replika. selector: matchLabels: app: nginx # Harus sesuai dengan selector layanan agar diekspos oleh layanan tersebut. template: metadata: labels: app: nginx spec: readinessGates: - conditionType: service.readiness.alibabacloud.com/my-svc # Atur readiness gate untuk layanan my-svc. containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # Port ini harus diekspos di layanan. -
Terapkan Deployment tersebut.
kubectl apply -f my-nginx.yaml -
Periksa status Pod dan readiness gate.
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/1Jalankan perintah berulang kali dan Anda akan melihat READINESS GATES berubah dari 0/1 menjadi 1/1, yang menunjukkan pendaftaran berhasil ke grup server backend load balancer.
Lakukan pembaruan rolling
-
Restart Deployment.
kubectl rollout restart deployment my-nginxOutput yang diharapkan:
deployment.apps/my-nginx restarted -
Periksa status Pod dan readiness gate.
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/1Selama pembaruan rolling, Pod menunggu readiness gate sebelum pembaruan dilanjutkan, memastikan Pod baru terdaftar di grup server backend load balancer terlebih dahulu.