Saat menggunakan Layanan LoadBalancer untuk mengekspos pod backend, kecepatan pembaruan bergulir pod mungkin lebih cepat daripada kecepatan pemasangan grup server backend dari load balancer. Hal ini dapat menyebabkan gangguan akses ke pod. Anda dapat mengonfigurasi readiness gates untuk memastikan pembaruan pod berjalan dengan lancar. Topik ini menjelaskan cara menggunakan readiness gates untuk mencapai pembaruan pod yang mulus.
Prasyarat
Sebuah ACK managed cluster atau ACK Serverless cluster telah dibuat. Kluster tersebut harus memenuhi persyaratan berikut. Untuk informasi lebih lanjut, lihat Buat ACK managed cluster atau Buat ACK Serverless cluster.
Setel plug-in jaringan menjadi Terway untuk ACK managed cluster.
Versi Kubernetes kluster harus 1.24 atau lebih baru. Untuk informasi lebih lanjut, lihat Tingkatkan kluster.
Versi komponen cloud-controller-manager harus 2.10.0 atau lebih baru. Untuk informasi lebih lanjut, lihat Cloud Controller Manager.
Klien kubectl terhubung ke kluster ACK. Untuk informasi lebih lanjut, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Catatan penggunaan
Jika Anda menggunakan Layanan LoadBalancer untuk mengekspos pod backend, layanan tersebut mungkin mengalami gangguan selama pembaruan bergulir pod.
Penyebab
Selama pembaruan bergulir pod, kecepatan startup pod baru mungkin lebih cepat daripada kecepatan pembaruan pod backend melalui Layanan LoadBalancer. Lalu lintas permintaan diarahkan ke pod yang sedang dihapus, sehingga menyebabkan kegagalan akses sementara.
Solusi
Anda dapat mengonfigurasi readiness gates dalam file YAML pod untuk mengontrol status pod menggunakan kondisi kustom. Readiness gates memungkinkan Anda menentukan kondisi kustom, seperti kondisi kustom
service.readiness.alibabacloud.com/<Service Name>yang terkait dengan Layanan LoadBalancer. Ketika semua kondisi yang ditentukan dalam readiness gates terpenuhi, status pod berubah menjadi Ready dan lalu lintas diteruskan ke pod. Jika beberapa load balancer dipasang pada pod, Anda dapat mengonfigurasi beberapa readiness gates untuk pod tersebut.Prosedur
Langkah 1: Buat instance CLB atau NLB
Buat file bernama
my-svc.yamluntuk membuat instance Classic Load Balancer (CLB) atau Network Load Balancer (NLB) berdasarkan template YAML berikut.CLB
apiVersion: v1 kind: Service metadata: name: my-svc 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 # Atur ke NLB. ports: - port: 80 targetPort: 80 protocol: TCP selector: app: nginx type: LoadBalancerJalankan perintah berikut untuk membuat Layanan uji:
kubectl apply -f my-svc.yamlJalankan perintah berikut untuk memeriksa status Layanan uji:
kubectl get service my-svcSetelah
<alamat IP>muncul, instance CLB atau NLB yang sesuai telah dibuat.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-svc LoadBalancer 192.XX.XX.215 <alamat IP> 80:30493/TCP 8s
Langkah 2: Buat Deployment uji
Gunakan template YAML berikut untuk membuat file bernama
my-nginx.yaml, dan atur parameterconditionTypedari readiness gate menjadiservice.readiness.alibabacloud.com/my-svc.apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx # Nama Deployment. labels: app: nginx spec: replicas: 2 # Jumlah replika pod. selector: matchLabels: app: nginx # Anda harus menentukan nilai yang sama dalam pemilih Layanan yang digunakan untuk mengekspos Deployment. template: metadata: labels: app: nginx spec: readinessGates: - conditionType: service.readiness.alibabacloud.com/my-svc # Konfigurasikan readiness gates untuk Layanan bernama my-svc. containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # Port yang ingin Anda ekspos dalam Layanan.Jalankan perintah berikut untuk menyebarkan Deployment uji:
kubectl apply -f my-nginx.yamlJalankan perintah berikut untuk memeriksa status pod dan readiness gates:
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/1Setelah menjalankan perintah beberapa kali, status readiness gates pod berubah dari 0 menjadi 1. Ini menunjukkan bahwa pod telah dipasang ke grup server instance CLB atau NLB.
Langkah 3: Lakukan pembaruan bergulir pada pod
Jalankan perintah berikut untuk menerapkan ulang pod uji:
kubectl rollout restart deployment my-nginxOutput yang diharapkan:
deployment.apps/my-nginx restartedJalankan perintah berikut untuk memeriksa status pod dan readiness gates:
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/1Ketika perintah dijalankan beberapa kali, pod menunggu status readiness gates berubah dari 0 menjadi 1 selama proses pembaruan bergulir. Setelah status readiness gates berubah menjadi 1, pod dipasang ke grup server instance CLB atau NLB, dan pembaruan bergulir dilanjutkan.