All Products
Search
Document Center

Container Service for Kubernetes:Raih pembaruan bergulir tanpa downtime dengan shutdown yang mulus

Last Updated:Jun 17, 2026

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:

  1. Fase startup: Pod baru (v2) dibuat. Kubernetes menunggu hingga lulus pemeriksaan kesiapan sebelum meneruskan traffic layanan kepadanya.

  2. Fase perpindahan traffic: Dengan readinessGates diaktifkan, 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.
  3. Fase shutdown yang mulus: Sebelum dihapus, Pod lama menjalankan hook preStop-nya dan menggunakan terminationGracePeriodSeconds untuk menyelesaikan pemrosesan koneksi, sementara SLB melakukan pengurasan permintaan yang sedang berjalan. Hal ini memastikan semua permintaan selesai sehingga pembaruan berlangsung tanpa downtime.

Prasyarat

Sebarkan aplikasi contoh

Contoh ini menyebarkan aplikasi NGINX tanpa status.

Konsol

  1. Pada halaman ACK Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Deployments.

  2. Pada halaman Deployments, klik Create from YAML. Tempel YAML berikut dan klik Create.

    YAML aplikasi contoh

    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
  3. Pada jendela pop-up, temukan aplikasi tersebut, klik View , dan pastikan status Pod adalah Running.

kubectl

  1. Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.

  2. 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
  3. Sebarkan aplikasi NGINX dan buat Service-nya.

    kubectl apply -f nginx-demo.yaml
  4. 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 setelah readinessProbe dan readinessGates keduanya 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 sinyal SIGKILL. Nilai default: 30 detik. Harus lebih lama daripada total waktu eksekusi hook preStop dan 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

  1. Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.

  2. 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
  3. 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_ENDPOINT

    Saat uji berjalan, buka terminal baru dan segera restart Penyebaran.

    kubectl rollout restart deployment nginx-deployment-demo
  4. Output yang diharapkan:

    Skenario penyebaran

    Output yang diharapkan

    Tanpa konfigurasi zero downtime

    YAML contoh tanpa konfigurasi tanpa downtime

    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
      template:
        metadata:
          labels:
            app: nginx-demo 
        spec:
          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
    ---           
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-demo-service
    spec:
      type: LoadBalancer
      selector:
        app: nginx-demo 
      ports:
        - protocol: TCP
          port: 80

    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 out

    Dengan 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 curl untuk memverifikasi respons pemeriksaan kesehatan.
  • Pemecahan masalah aplikasi: Periksa Events dan Logs Pod. Pilih Show the log of the last container exit.

Referensi

<