All Products
Search
Document Center

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

Last Updated:Aug 21, 2026

Saat Anda mengekspos Pod backend melalui layanan LoadBalancer, pembaruan rolling dapat mengganggu akses jika Pod menjadi ready sebelum load balancer menambahkannya ke grup server backend. Konfigurasikan readiness gate untuk memastikan pembaruan Pod berjalan lancar. Topik ini menjelaskan cara menggunakan mekanisme Pod Readiness Gate guna mencapai pembaruan yang mulus.

Prasyarat

  • Kluster ACK yang dikelola atau kluster ACK Serverless memenuhi persyaratan berikut. Lihat Buat kluster ACK yang dikelola dan Buat kluster ACK Serverless.

    • Untuk kluster ACK yang dikelola, plug-in jaringan harus Terway.

    • Versi kluster adalah 1.24 atau lebih baru. Lihat Tingkatkan versi kluster.

    • cloud-controller-manager versi v2.10.0 atau lebih baru. Lihat Cloud Controller Manager.

    • Untuk injeksi readiness gate otomatis: cloud-controller-manager v2.12.4 atau lebih baru dengan Pod ReadinessGate Webhook diaktifkan. Di Cloud Controller Manager Parameter Configuration, pilih Enable Pod ReadinessGate Webhook capability, lalu klik Confirm.

  • Klien kubectl telah terhubung ke kluster ACK. Untuk informasi selengkapnya, lihat Hubungkan ke kluster ACK menggunakan kubectl.

Latar Belakang

Mengekspos aplikasi dengan layanan LoadBalancer dan melakukan pembaruan rolling dapat menyebabkan gangguan layanan singkat atau kegagalan koneksi.

  • Penyebab

    Pod baru sering kali menjadi ready sebelum load balancer menambahkan IP-nya ke daftar server backend. Pembaruan rolling kemudian dapat menghentikan tugas Pod lama saat trafik masih diarahkan ke sana, sehingga menyebabkan kegagalan koneksi.

  • Solusi

    Gunakan Pod Readiness Gate dalam YAML Pod untuk menambahkan kondisi readiness khusus, seperti service.readiness.alibabacloud.com/<Nama Layanan> untuk layanan LoadBalancer. Pod ditandai sebagai Ready dan menerima trafik hanya setelah kondisi tersebut terpenuhi.

  • Prosedur contoh

  • Cara kerja

    Dengan readinessGates dikonfigurasi, Pod menjadi ready sebagai berikut:

    1. Readiness probe kontainer: kubelet menjalankan readinessProbe kontainer. Setelah probe berhasil, ContainersReady menjadi True, tetapi Pod tetap tidak ready hingga semua kondisi readiness gate dikonfirmasi.

    2. CCM mendaftarkan backend: CCM mendeteksi kesiapan kontainer, menambahkan IP Pod ke grup server backend load balancer, lalu mengatur kondisi seperti service.readiness.alibabacloud.com/my-svc menjadi True.

    3. Pod menjadi fully ready: Setelah semua kondisi readiness gate bernilai True, kubelet mengatur Ready menjadi True. Pembaruan rolling kemudian dapat menghentikan tugas Pod lama secara aman.

  • Catatan penggunaan

    • Layanan harus ada: Nama layanan dalam readinessGates harus benar dan layanan tersebut harus ada di kluster. Jika nama salah atau layanan dihapus selama startup Pod, CCM tidak dapat mendaftarkan backend dan Pod tidak pernah mencapai status Ready, sehingga deployment terhenti.

    • Beberapa layanan didukung: Pod dapat mencantumkan beberapa entri readinessGates.conditionType untuk beberapa layanan LoadBalancer. Pod menjadi ready hanya setelah terdaftar di semua backend layanan yang ditentukan.

Prosedur

Otomatis

Setelah Anda mengaktifkan Pod ReadinessGate Webhook, tambahkan label k8s.alibabacloud.com/pod-readiness-gate-inject: enabled ke namespace untuk menginjeksi readiness gate ke semua Pod.

Langkah-langkah berikut mengaktifkan injeksi otomatis untuk namespace default.

Tambahkan label injeksi otomatis

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

    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

    Label telah ditambahkan ke namespace.

Buat Layanan LoadBalancer

  1. Buat file my-svc.yaml dari templat YAML berikut. Buat instans Classic Load Balancer (CLB) atau Network Load Balancer (NLB) sesuai kebutuhan.

    CLB

    apiVersion: v1
    kind: Service
    metadata:
      name: my-svc
      namespace: default # Namespace-nya adalah 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}" # Contoh: cn-hangzhou-k:vsw-i123456,cn-hangzhou-j:vsw-j654321.
    spec:
      loadBalancerClass: alibabacloud.com/nlb # Menentukan bahwa jenis load balancer adalah NLB.
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: nginx
      type: LoadBalancer
  2. Terapkan layanan tersebut.

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

    kubectl get service my-svc

    Tunggu hingga EXTERNAL-IP menampilkan alamat IP atau nama domain, yang menunjukkan bahwa instans load balancer 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

Buat Deployment contoh

  1. Buat file my-nginx.yaml dari templat YAML berikut.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx    # Nama contoh.
      namespace: default # Namespace-nya adalah default.
      labels:
        app: nginx
    spec:
      replicas: 2       # Menentukan jumlah replika.
      selector:
        matchLabels:
          app: nginx     # Harus sesuai dengan selector layanan agar diekspos oleh layanan tersebut.
      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                                # Port ini harus diekspos di layanan.
  2. Terapkan Deployment tersebut.

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

    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

    Jalankan perintah berulang kali dan Anda akan melihat READINESS GATES berubah dari 0/1 menjadi 1/1, yang menunjukkan pendaftaran berhasil ke grup server backend load balancer.

Lakukan pembaruan rolling

  1. Restart Deployment.

    kubectl rollout restart deployment my-nginx

    Output yang diharapkan:

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

    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

    Selama pembaruan rolling, Pod menunggu readiness gate sebelum pembaruan dilanjutkan, memastikan Pod baru terdaftar di grup server backend load balancer terlebih dahulu.

Manual

Buat Layanan LoadBalancer

  1. Buat file my-svc.yaml dari templat YAML berikut. Buat instans Classic Load Balancer (CLB) atau Network Load Balancer (NLB) sesuai kebutuhan.

    CLB

    apiVersion: v1
    kind: Service
    metadata:
      name: my-svc
      namespace: default # Namespace-nya adalah 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}" # Contoh: cn-hangzhou-k:vsw-i123456,cn-hangzhou-j:vsw-j654321.
    spec:
      loadBalancerClass: alibabacloud.com/nlb # Menentukan bahwa jenis load balancer adalah NLB.
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: nginx
      type: LoadBalancer
  2. Terapkan layanan tersebut.

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

    kubectl get service my-svc

    Tunggu hingga EXTERNAL-IP menampilkan alamat IP atau nama domain, yang menunjukkan bahwa instans load balancer 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

Buat Deployment contoh

  1. Buat file 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    # Nama contoh.
      namespace: default # Namespace-nya adalah default.
      labels:
        app: nginx
    spec:
      replicas: 2       # Menentukan jumlah replika.
      selector:
        matchLabels:
          app: nginx     # Harus sesuai dengan selector layanan agar diekspos oleh layanan tersebut.
      template:
        metadata:
          labels:
            app: nginx
        spec:
          readinessGates:
          - conditionType: service.readiness.alibabacloud.com/my-svc # Atur 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                                # Port ini harus diekspos di layanan.
  2. Terapkan Deployment tersebut.

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

    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

    Jalankan perintah berulang kali dan Anda akan melihat READINESS GATES berubah dari 0/1 menjadi 1/1, yang menunjukkan pendaftaran berhasil ke grup server backend load balancer.

Lakukan pembaruan rolling

  1. Restart Deployment.

    kubectl rollout restart deployment my-nginx

    Output yang diharapkan:

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

    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

    Selama pembaruan rolling, Pod menunggu readiness gate sebelum pembaruan dilanjutkan, memastikan Pod baru terdaftar di grup server backend load balancer terlebih dahulu.