Mengonfigurasi pemeriksaan kesiapan, readinessGates, panggilan balik preStop, dan pengurasan koneksi Server Load Balancer (SLB) untuk pembaruan bergulir tanpa waktu henti di ACK.
Cara kerja
Strategi Rolling Update pada Penyebaran mengganti Pod satu per satu untuk memastikan ketersediaan layanan yang berkelanjutan. Proses ini terdiri dari tiga fase:
-
Fase startup: Pod baru (v2) dibuat. Kubernetes menunggu hingga lulus pemeriksaan kesiapan sebelum meneruskan traffic layanan kepadanya.
-
Fase perpindahan traffic: Dengan
readinessGatesdiaktifkan, Pod baru harus lulus pemeriksaan kesiapan. IP-nya kemudian didaftarkan ke Service Endpoints dan grup server backend SLB. Sistem lalu menghentikan Pod lama (v1) dan menghapus IP-nya dari Endpoints.Lihat Cara kerja readinessGates.
-
Fase shutdown yang mulus: Sebelum dihapus, Pod lama menjalankan hook preStop-nya dan menggunakan
terminationGracePeriodSecondsuntuk menyelesaikan pemrosesan koneksi, sementara SLB melakukan pengurasan permintaan yang sedang berjalan. Hal ini memastikan semua permintaan selesai sehingga pembaruan berlangsung tanpa downtime.
Prasyarat
-
Versi kluster adalah 1.24 atau lebih baru. Tingkatkan kluster jika diperlukan.
-
Komponen cloud-controller-manager versi v2.10.0 atau lebih baru. Lihat Cloud Controller Manager.
Sebarkan aplikasi contoh
Contoh ini menyebarkan aplikasi NGINX tanpa status.
Konsol
Pada halaman ACK Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Pada halaman Deployments, klik Create from YAML. Tempel YAML berikut dan klik Create.
-
Pada jendela pop-up, temukan aplikasi tersebut, klik View , dan pastikan status Pod adalah
Running.
kubectl
-
Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
-
Simpan YAML berikut sebagai nginx-demo.yaml.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-demo spec: replicas: 1 # Atur ke 2 atau lebih untuk HA produksi. Atur ke 1 untuk tujuan demonstrasi. selector: matchLabels: app: nginx-demo # Strategi pembaruan bergulir: memastikan ketersediaan layanan selama pembaruan. # strategy: # type: RollingUpdate # Strategi default untuk Deployments. # rollingUpdate: # maxUnavailable: "25%" # Default. Maksimal 25% Pod boleh tidak tersedia selama pembaruan. # maxSurge: "25%" # Default. Maksimal 25% Pod tambahan boleh dibuat melebihi jumlah replika yang diinginkan. template: metadata: labels: app: nginx-demo spec: # Batas shutdown mulus tingkat Pod. Harus lebih besar daripada jumlah waktu eksekusi preStop dan pembersihan aplikasi. terminationGracePeriodSeconds: 60 readinessGates: - conditionType: service.readiness.alibabacloud.com/nginx-demo-service # Tetapkan Readiness Gate untuk layanan nginx-demo-service. containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 resources: requests: cpu: 500m memory: 1Gi limits: cpu: 500m # --- Pemeriksaan kesehatan --- # startup probe: Memastikan aplikasi dalam kontainer telah dimulai. startupProbe: httpGet: path: / # Mengakses jalur root NGINX default menandakan startup berhasil. port: 80 # Berikan waktu cukup untuk startup. Total timeout = failureThreshold * periodSeconds. # Di sini: 30 * 10 = 300 detik. failureThreshold: 30 periodSeconds: 10 # readiness probe: Menentukan apakah kontainer siap menerima traffic. readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 # Pemeriksaan dimulai 5 detik setelah kontainer dimulai. periodSeconds: 5 # Periksa setiap 5 detik. timeoutSeconds: 2 # Durasi timeout pemeriksaan. successThreshold: 1 # 1 keberhasilan menandai Pod sebagai siap. failureThreshold: 3 # 3 kegagalan berturut-turut menandai Pod sebagai tidak siap. # --- Konfigurasi shutdown mulus Pod --- lifecycle: preStop: exec: # Untuk shutdown mulus yang andal, definisikan hook kustom yang menangani permintaan yang sedang berjalan berdasarkan logika aplikasi Anda. # Menggunakan sleep saja tidak disarankan karena tidak menjamin keluaran yang bersih. command: ["sh", "-c", "sleep 30 && /usr/sbin/nginx -s quit"] --- apiVersion: v1 kind: Service metadata: name: nginx-demo-service annotations: # Timeout untuk pengurasan koneksi. Nilai ini harus selaras dengan logika preStop aplikasi. Rentang: 10-900. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: "30" # Aktifkan pengurasan koneksi. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: "on" spec: type: LoadBalancer selector: app: nginx-demo ports: - protocol: TCP port: 80 -
Sebarkan aplikasi NGINX dan buat Service-nya.
kubectl apply -f nginx-demo.yaml -
Verifikasi bahwa Pod berstatus
Running.kubectl get pod | grep nginx-deployment-demo
-
Pemeriksaan kesiapan Pod
-
startupProbe(startup probe): Memeriksa apakah aplikasi yang membutuhkan waktu lama untuk startup, seperti aplikasi Java, telah berjalan. Hingga berhasil, pemeriksaan kesiapan dan kelangsungan hidup dijeda untuk mencegah restart kontainer yang prematur. -
readinessProbe(readiness probe): Menentukan apakah kontainer dapat menangani permintaan. Jika berhasil, IP Pod ditambahkan ke Service Endpoints sehingga menerima traffic. -
readinessGates: Pod dianggap siap hanya setelahreadinessProbedanreadinessGateskeduanya lolos.
-
-
Graceful Shutdown
-
Shutdown mulus aplikasi
-
preStop: Hook yang dijalankan sebelum terminasi kontainer. Konfigurasikan untuk menguras permintaan yang sedang berjalan agar shutdown tidak mengganggu layanan.Gunakan hook kustom. Menggunakan sleep saja mungkin tidak menghasilkan keluaran yang benar.
-
terminationGracePeriodSeconds: Waktu maksimum dari terminasi Pod hingga sinyalSIGKILL. Nilai default: 30 detik. Harus lebih lama daripada total waktu eksekusi hookpreStopdan pembersihan aplikasi.
-
-
Pengurasan koneksi SLB
-
Anotasi
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: Mengaktifkan pengurasan koneksi SLB. -
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: Timeout pengurasan koneksi dalam detik. Atur nilai ini mendekati waktu pemrosesan hook preStop.
-
-
-
Strategi pembaruan bergulir
-
strategy: Strategi default Penyebaran adalah RollingUpdate. Secara bertahap membuat Pod baru dan menghapus Pod lama setelah siap, memastikan ketersediaan layanan. -
maxUnavailable: Jumlah maksimum Pod yang tidak tersedia selama pembaruan bergulir. Nilai default: 25%. Juga menerima angka absolut. -
maxSurge: Jumlah maksimum Pod tambahan di atas jumlah replika yang diinginkan selama pembaruan bergulir. Nilai lebih tinggi mempercepat pembaruan tetapi mengonsumsi lebih banyak sumber daya. Nilai default: 25%. Juga menerima angka absolut.
-
Verifikasi penyebaran bergulir tanpa downtime
-
Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
-
Dapatkan URL aplikasi contoh.
export NGINX_ENDPOINT=$(kubectl get service nginx-demo-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}{":"}{.spec.ports[0].port}') echo $NGINX_ENDPOINT -
Instal hey. Jalankan uji beban dengan 200 koneksi bersamaan dan total 50.000 permintaan. Satu replika menyelesaikan ini dalam waktu sekitar satu menit.
hey -c 200 -n 50000 -disable-keepalive http://$NGINX_ENDPOINTSaat uji berjalan, buka terminal baru dan segera restart Penyebaran.
kubectl rollout restart deployment nginx-deployment-demo -
Output yang diharapkan:
Skenario penyebaran
Output yang diharapkan
Tanpa konfigurasi zero downtime
Terjadi kehilangan traffic.
Status code distribution: [200] 49644 responses Error distribution: [320] Get "http://114.215.XXX.XXX": dial tcp 114.215.XXX.XXX:80: connect: connection refused [18] Get "http://114.215.XXX.XXX": dial tcp 114.215.XXX.XXX:80: connect: no route to host [18] Get "http://114.215.XXX.XXX": dial tcp 114.215.XXX.XXX:80: connect: operation timed outDengan konfigurasi tanpa downtime
Tidak ada kehilangan traffic.
Status code distribution: [200] 50000 responses
FAQ
Status Pod: Running tetapi tidak ready
Penyebab: Biasanya disebabkan oleh kegagalan pemeriksaan startup atau kesiapan.
Solusi:
-
Konfigurasi pemeriksaan kesiapan: Pada halaman Edit Workloads yang dituju, verifikasi bahwa jalur (misalnya, /healthz) dan port pemeriksaan kesehatan sesuai dengan aplikasi. Untuk aplikasi yang membutuhkan waktu lama untuk startup, tingkatkan Unhealthy Threshold untuk menghindari kegagalan prematur.
Nonaktifkan sementara pemeriksaan Readiness, login ke terminal Pod, dan gunakan perintah seperti
curluntuk memverifikasi respons pemeriksaan kesehatan. -
Pemecahan masalah aplikasi: Periksa Events dan Logs Pod. Pilih Show the log of the last container exit.