All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan Readiness Gates untuk memastikan pembaruan pod berjalan lancar

Last Updated:Mar 27, 2026

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:

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:

  1. Pembaruan bergulir dimulai. Kubernetes menghentikan tugas pod lama dan memulai pod baru.

  2. Kontainer pod baru lolos pemeriksaan kesehatan dan mencapai status Running dalam hitungan detik.

  3. Kubernetes menandai pod sebagai Ready dan mengarahkan lalu lintas kepadanya.

  4. CCM belum mendaftarkan pod ke kelompok server backend CLB atau NLB—pendaftaran biasanya memakan waktu lebih lama daripada startup kontainer.

  5. 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

  1. Buat file bernama my-svc.yaml menggunakan 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: LoadBalancer

    NLB

    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: LoadBalancer
  2. Terapkan manifes layanan:

    kubectl apply -f my-svc.yaml
  3. Tunggu hingga layanan memiliki alamat IP eksternal:

    kubectl get service my-svc

    Instans 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

  1. Buat file bernama my-nginx.yaml. Atur conditionType ke service.readiness.alibabacloud.com/my-svc untuk mengaitkan readiness gate pod dengan layanan my-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: 80
  2. Terapkan Penyebaran:

    kubectl apply -f my-nginx.yaml
  3. Periksa status pod dan kondisi readiness gate:

    kubectl get pod -owide -l app=nginx

    Pada awalnya, READINESS GATES menunjukkan 0/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/1

    Jalankan perintah tersebut lagi setelah menunggu sebentar. Ketika READINESS GATES berubah menjadi 1/1, pod telah terdaftar ke kelompok server backend CLB atau NLB dan siap melayani lalu lintas.

Langkah 3: Lakukan pembaruan bergulir

  1. Picu pembaruan bergulir:

    kubectl rollout restart deployment my-nginx

    Output yang diharapkan:

    deployment.apps/my-nginx restarted
  2. Monitor status pod saat pembaruan bergulir berlangsung:

    kubectl get pod -owide -l app=nginx

    Selama pembaruan, pod lama dan baru berjalan bersamaan. Pod baru menunggu pada READINESS GATES: 0/1 hingga 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/1

    Pembaruan 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