Saat Anda mengekspos pod melalui layanan LoadBalancer, pembaruan bergulir (rolling updates) dapat menyebabkan gangguan lalu lintas singkat. Kontainer pod menjadi siap lebih cepat daripada cloud-controller-manager (CCM) mampu mendaftarkannya ke kelompok server backend Classic Load Balancer (CLB) atau Network Load Balancer (NLB). Dengan mengonfigurasi readiness gate, hal ini dapat dicegah karena setiap pod akan ditahan dari siklus pembaruan bergulir hingga terdaftar sepenuhnya dan siap melayani lalu lintas.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster ACK yang dikelola atau kluster ACK Serverless dengan konfigurasi berikut:
Plugin jaringan diatur ke Terway (hanya untuk kluster ACK yang dikelola)
Versi Kubernetes 1.24 atau lebih baru. Untuk instruksi peningkatan, lihat Upgrade clusters.
Versi CCM 2.10.0 atau lebih baru. Untuk detail versi, lihat CCM.
kubectl yang terhubung ke kluster. Untuk instruksi pengaturan, lihat Obtain the kubeconfig file of a cluster and use kubectl to connect to the cluster.
Untuk pembuatan kluster, lihat Create an ACK managed cluster atau Create an ACK Serverless cluster.
Cara kerja
Tanpa readiness gate, urutan berikut menyebabkan gangguan lalu lintas selama pembaruan bergulir:
Pembaruan bergulir dimulai. Kubernetes menghentikan tugas pod lama dan memulai pod baru.
Kontainer pod baru lolos pemeriksaan kesehatan dan mencapai status
Runningdalam hitungan detik.Kubernetes menandai pod sebagai
Readydan mengarahkan lalu lintas kepadanya.CCM belum mendaftarkan pod ke kelompok server backend CLB atau NLB—pendaftaran biasanya memakan waktu lebih lama daripada startup kontainer.
Permintaan yang diarahkan ke pod gagal hingga proses pendaftaran selesai.
Saat Anda menambahkan readiness gate dengan conditionType: service.readiness.alibabacloud.com/<Service Name>, Kubernetes menambahkan kondisi kustom ke setiap pod. CCM hanya mengatur kondisi ini menjadi True setelah pod terdaftar dan sehat di kelompok server backend. Hingga kondisi tersebut terpenuhi, status READINESS GATES pod menunjukkan 0/1, dan Kubernetes tidak mengarahkan lalu lintas kepadanya atau melanjutkan pembaruan bergulir.
Jika sebuah pod dipasang ke beberapa load balancer, konfigurasikan satu readiness gate untuk setiap layanan LoadBalancer.
Langkah 1: Buat instans CLB atau NLB
Buat file bernama
my-svc.yamlmenggunakan salah satu templat 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: LoadBalancerTerapkan manifes layanan:
kubectl apply -f my-svc.yamlTunggu hingga layanan memiliki alamat IP eksternal:
kubectl get service my-svcInstans CLB atau NLB siap digunakan ketika alamat IP muncul di kolom
EXTERNAL-IP:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-svc LoadBalancer 192.XX.XX.215 <IP address> 80:30493/TCP 8s
Langkah 2: Buat Penyebaran uji coba
Buat file bernama
my-nginx.yaml. AturconditionTypekeservice.readiness.alibabacloud.com/my-svcuntuk mengaitkan readiness gate pod dengan layananmy-svc.apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx # Nama Penyebaran. labels: app: nginx spec: replicas: 2 # Jumlah pod replikasi. selector: matchLabels: app: nginx # Harus sesuai dengan selector di layanan. template: metadata: labels: app: nginx spec: readinessGates: - conditionType: service.readiness.alibabacloud.com/my-svc # 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: 80Terapkan Penyebaran:
kubectl apply -f my-nginx.yamlPeriksa status pod dan kondisi readiness gate:
kubectl get pod -owide -l app=nginxPada awalnya,
READINESS GATESmenunjukkan0/1, artinya CCM belum mendaftarkan pod: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 tersebut lagi setelah menunggu sebentar. Ketika
READINESS GATESberubah menjadi1/1, pod telah terdaftar ke kelompok server backend CLB atau NLB dan siap melayani lalu lintas.
Langkah 3: Lakukan pembaruan bergulir
Picu pembaruan bergulir:
kubectl rollout restart deployment my-nginxOutput yang diharapkan:
deployment.apps/my-nginx restartedMonitor status pod saat pembaruan bergulir berlangsung:
kubectl get pod -owide -l app=nginxSelama pembaruan, pod lama dan baru berjalan bersamaan. Pod baru menunggu pada
READINESS GATES: 0/1hingga CCM mendaftarkannya: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/1Pembaruan bergulir beralih ke pod berikutnya hanya setelah pod baru saat ini mencapai
READINESS GATES: 1/1, sehingga memastikan lalu lintas tidak terganggu selama pembaruan.
Pemecahan Masalah
Readiness gate tetap pada 0/1 dalam waktu lama
Jika READINESS GATES pod tidak berubah menjadi 1/1 setelah beberapa menit, periksa kondisi status pod untuk mengetahui penyebabnya:
kubectl get pod <pod-name> -o yaml | grep -A8 'service.readiness.alibabacloud.com'Output menampilkan kondisi yang ditetapkan oleh CCM, termasuk bidang reason yang menjelaskan mengapa pendaftaran belum selesai. Penyebab umum meliputi versi CCM di bawah 2.10.0, Terway bukan plugin jaringan aktif, atau kelompok server backend belum disediakan.
Periksa log CCM untuk informasi lebih lanjut:
kubectl logs -n kube-system -l app=cloud-controller-manager --tail=100