All Products
Search
Document Center

Container Service for Kubernetes:Pastikan pembaruan Pod berjalan lancar dengan readiness gate

Last Updated:Jun 22, 2026

Saat menggunakan layanan LoadBalancer untuk mengekspos Pod backend, pembaruan rolling dapat menyebabkan gangguan layanan jika Pod diperbarui lebih cepat daripada proses pendaftarannya ke grup server backend load balancer. Anda dapat mengonfigurasi readiness gate untuk memastikan pembaruan Pod berjalan lancar. Topik ini menjelaskan cara menggunakan fitur readiness gate guna memastikan kelancaran pembaruan Pod.

Prasyarat

  • Anda memiliki ACK managed cluster atau ACK Serverless cluster yang memenuhi persyaratan berikut. Untuk informasi selengkapnya, lihat Create an ACK managed cluster dan Create an ACK Serverless cluster.

    • Jika menggunakan ACK managed cluster, plug-in jaringan harus Terway.

    • Versi kluster adalah 1.24 atau lebih baru. Untuk informasi selengkapnya, lihat Upgrade a cluster.

    • Komponen cloud-controller-manager versi v2.10.0 atau lebih baru. Untuk informasi selengkapnya, lihat Cloud Controller Manager.

    • Untuk menggunakan fitur injeksi readiness gate otomatis, pastikan komponen cloud-controller-manager versi v2.12.4 atau lebih baru dan kemampuan Pod ReadinessGate Webhook diaktifkan dalam parameter komponen tersebut. Di bagian Parameter Configuration Cloud Controller Manager, centang kotak Enable Pod ReadinessGate Webhook capability, lalu klik Confirm.

  • Klien kubectl telah terhubung ke kluster ACK. Untuk informasi selengkapnya, lihat Connect to an ACK cluster using kubectl.

Latar Belakang

Saat menggunakan layanan LoadBalancer untuk mengekspos aplikasi dan melakukan pembaruan rolling, Anda mungkin mengalami gangguan layanan singkat atau kegagalan koneksi.

  • Penyebab

    Pod baru sering kali mulai lebih cepat daripada load balancer dapat memperbarui daftar server backend-nya. Ketika kontainer Pod baru sudah siap tetapi alamat IP-nya belum ditambahkan ke backend load balancer, proses pembaruan rolling mungkin telah mulai menghentikan tugas Pod lama. Akibatnya, sebagian trafik masih diarahkan ke Pod lama yang sedang dihentikan atau telah dihapus dari load balancer, sehingga menyebabkan kegagalan koneksi.

  • Solusi

    Anda dapat menggunakan mekanisme Pod Readiness Gate dalam konfigurasi YAML Pod untuk mengontrol status siapnya dengan kondisi kustom. Readiness gate memungkinkan Anda menetapkan kondisi kustom, seperti service.readiness.alibabacloud.com/<Service Name> untuk layanan LoadBalancer. Hanya ketika kondisi-kondisi tersebut terpenuhi, Pod akan ditandai sebagai Ready dan mulai menerima trafik.

  • Prosedur contoh

  • Cara kerja

    Saat sebuah Pod dikonfigurasi dengan readinessGates, proses kesiapannya adalah sebagai berikut:

    1. Kesiapan probe kontainer: kubelet menjalankan readinessProbe kontainer. Setelah probe berhasil, status ContainersReady Pod berubah menjadi True. Pada titik ini, Pod secara keseluruhan belum siap dan menunggu status readiness gate lainnya dikonfirmasi.

    2. CCM mendaftarkan backend: cloud-controller-manager (CCM) mendeteksi bahwa kontainer sudah siap dan menambahkan alamat IP Pod ke grup server backend load balancer yang ditentukan. Setelah pendaftaran berhasil, CCM menambahkan kondisi untuk Service yang sesuai ke dalam Pod, misalnya service.readiness.alibabacloud.com/my-svc, dan mengatur statusnya menjadi True.

    3. Pod menjadi sepenuhnya siap: kubelet memastikan bahwa semua kondisi readiness gate bernilai True, lalu mengatur status akhir Ready Pod menjadi True. Baru pada saat itulah Pod secara resmi dianggap siap, dan proses pembaruan rolling dapat dengan aman menghentikan tugas Pod lama.

  • Catatan

    • Service harus ada: Pastikan nama Service yang dirujuk dalam readinessGates benar dan Service tersebut ada di kluster. Jika nama Service salah atau Service dihapus saat Pod sedang dimulai, CCM tidak dapat mendaftarkan backend. Pod tidak akan pernah mencapai status Ready, sehingga proses deployment akan macet.

    • Beberapa Service didukung: Sebuah Pod dapat dikonfigurasi dengan beberapa entri readinessGates.conditionType untuk beberapa layanan LoadBalancer. Dalam kasus ini, Pod hanya menjadi siap setelah berhasil terdaftar di backend semua Service yang ditentukan.

Prosedur

Otomatis

Setelah mengaktifkan Pod ReadinessGate Webhook, Anda dapat menambahkan label k8s.alibabacloud.com/pod-readiness-gate-inject: enabled ke namespace untuk mengaktifkan injeksi readiness gate otomatis bagi semua Pod di namespace tersebut.

Langkah-langkah berikut menjelaskan cara mengaktifkan injeksi otomatis untuk namespace default.

Langkah 1: Tambahkan label injeksi otomatis

  1. Tambahkan label k8s.alibabacloud.com/pod-readiness-gate-inject: enabled ke namespace default untuk mengaktifkan injeksi otomatis.

    kubectl label namespace default k8s.alibabacloud.com/pod-readiness-gate-inject=enabled

    Output yang diharapkan:

    namespace/default labeled
  2. Verifikasi label pada namespace.

    kubectl get namespace default -oyaml

    Output yang diharapkan:

    apiVersion: v1
    kind: Namespace
    metadata:
      creationTimestamp: "2025-11-13T07:18:37Z"
      labels:
        k8s.alibabacloud.com/pod-readiness-gate-inject: enabled
        kubernetes.io/metadata.name: default
      name: default
      resourceVersion: "6440182"
      uid: 73aff814-ae29-465a-98a4-6d37b9b8ee1a
    spec:
      finalizers:
      - kubernetes
    status:
      phase: Active

    Output menunjukkan bahwa label telah ditambahkan ke namespace.

Langkah 2: Buat layanan load balancer

  1. Buat file bernama my-svc.yaml berdasarkan templat YAML berikut. Anda dapat membuat instans Classic Load Balancer (CLB) atau Network Load Balancer (NLB) sesuai kebutuhan.

    CLB

    apiVersion: v1
    kind: Service
    metadata:
      name: my-svc
      namespace: default # The namespace is default.
    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}" # Example: cn-hangzhou-k:vsw-i123456,cn-hangzhou-j:vsw-j654321.
    spec:
      loadBalancerClass: alibabacloud.com/nlb # Specifies that the load balancer type is NLB.
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: nginx
      type: LoadBalancer
  2. Buat layanan contoh.

    kubectl apply -f my-svc.yaml
  3. Periksa status layanan.

    kubectl get service my-svc

    Tunggu hingga alamat IP atau nama domain muncul di kolom EXTERNAL-IP. Hal ini menunjukkan bahwa instans load balancer yang sesuai telah dibuat.

    NAME     TYPE           CLUSTER-IP       EXTERNAL-IP                 PORT(S)        AGE
    my-svc   LoadBalancer   192.XX.XX.215    <IP address/domain name>     80:30493/TCP   8s

Langkah 3: Buat Deployment contoh

  1. Buat file bernama my-nginx.yaml berdasarkan templat YAML berikut.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx    # Example name.
      namespace: default # The namespace is default.
      labels:
        app: nginx
    spec:
      replicas: 2       # Specifies the number of replicas.
      selector:
        matchLabels:
          app: nginx     # Must match the Service selector to be exposed by the Service.
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80                                # This port must be exposed in the Service.
  2. Terapkan Deployment contoh.

    kubectl apply -f my-nginx.yaml
  3. Periksa status Pod dan readiness gate-nya.

    kubectl get pod -owide -l app=nginx

    Output 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/1

    Menjalankan perintah ini beberapa kali menunjukkan status READINESS GATES berubah dari 0/1 menjadi 1/1. Perubahan ini menunjukkan bahwa Pod telah berhasil terdaftar di grup server backend load balancer.

Langkah 4: Lakukan pembaruan rolling

  1. Restart Deployment contoh.

    kubectl rollout restart deployment my-nginx

    Output yang diharapkan:

    deployment.apps/my-nginx restarted
  2. Periksa status Pod dan readiness gate-nya.

    kubectl get pod -owide -l app=nginx

    Output 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/1

    Jika Anda menjalankan perintah ini beberapa kali selama pembaruan rolling, Anda akan mengamati bahwa Pod menunggu readiness gate menjadi siap. Pembaruan rolling hanya dilanjutkan setelah readiness gate siap, memastikan bahwa Pod baru telah terdaftar di grup server backend load balancer.

Manual

Langkah 1: Buat layanan load balancer

  1. Buat file bernama my-svc.yaml berdasarkan templat YAML berikut. Anda dapat membuat instans Classic Load Balancer (CLB) atau Network Load Balancer (NLB) sesuai kebutuhan.

    CLB

    apiVersion: v1
    kind: Service
    metadata:
      name: my-svc
      namespace: default # The namespace is default.
    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}" # Example: cn-hangzhou-k:vsw-i123456,cn-hangzhou-j:vsw-j654321.
    spec:
      loadBalancerClass: alibabacloud.com/nlb # Specifies that the load balancer type is NLB.
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: nginx
      type: LoadBalancer
  2. Buat layanan contoh.

    kubectl apply -f my-svc.yaml
  3. Periksa status layanan.

    kubectl get service my-svc

    Tunggu hingga alamat IP atau nama domain muncul di kolom EXTERNAL-IP. Hal ini menunjukkan bahwa instans load balancer yang sesuai telah dibuat.

    NAME     TYPE           CLUSTER-IP       EXTERNAL-IP                 PORT(S)        AGE
    my-svc   LoadBalancer   192.XX.XX.215    <IP address/domain name>     80:30493/TCP   8s

Langkah 2: Buat Deployment contoh

  1. Buat file bernama my-nginx.yaml. Di templat Pod, atur conditionType readiness gate menjadi service.readiness.alibabacloud.com/my-svc.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx    # Example name.
      namespace: default # The namespace is default.
      labels:
        app: nginx
    spec:
      replicas: 2       # Specifies the number of replicas.
      selector:
        matchLabels:
          app: nginx     # Must match the Service selector to be exposed by the Service.
      template:
        metadata:
          labels:
            app: nginx
        spec:
          readinessGates:
          - conditionType: service.readiness.alibabacloud.com/my-svc # Set the readiness gate for the my-svc Service.
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80                                # This port must be exposed in the Service.
  2. Terapkan Deployment contoh.

    kubectl apply -f my-nginx.yaml
  3. Periksa status Pod dan readiness gate-nya.

    kubectl get pod -owide -l app=nginx

    Output 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/1

    Menjalankan perintah ini beberapa kali menunjukkan status READINESS GATES berubah dari 0/1 menjadi 1/1. Perubahan ini menunjukkan bahwa Pod telah berhasil terdaftar di grup server backend load balancer.

Langkah 3: Lakukan pembaruan rolling

  1. Restart Deployment contoh.

    kubectl rollout restart deployment my-nginx

    Output yang diharapkan:

    deployment.apps/my-nginx restarted
  2. Periksa status Pod dan readiness gate-nya.

    kubectl get pod -owide -l app=nginx

    Output 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/1

    Jika Anda menjalankan perintah ini beberapa kali selama pembaruan rolling, Anda akan mengamati bahwa Pod menunggu readiness gate menjadi siap. Pembaruan rolling hanya dilanjutkan setelah readiness gate siap, memastikan bahwa Pod baru telah terdaftar di grup server backend load balancer.