全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan ALB Ingress untuk melakukan rilis canary di klaster ACK

更新时间:Jul 06, 2025

Selama proses iterasi dan peningkatan layanan, rilis canary diperlukan untuk memastikan stabilitas sistem. Application Load Balancer (ALB) Ingress mendukung penggunaan anotasi canary untuk mengimplementasikan rilis canary berdasarkan header, cookie, dan bobot. Urutan prioritas aturan rilis canary adalah sebagai berikut: berbasis header > berbasis cookie > berbasis bobot. Jika Anda mengonfigurasi beberapa aturan secara bersamaan, aturan dengan prioritas tertinggi akan diterapkan terlebih dahulu.

Prasyarat

Catatan Penggunaan

  • Aturan berbasis header dan berbasis cookie tidak dapat dikonfigurasikan bersamaan dengan aturan berbasis bobot pada Ingress yang sama. Anda harus mengonfigurasikannya pada dua Ingress terpisah atau menggunakan aturan routing kustom.

  • Saat menggunakan anotasi canary untuk melakukan rilis canary, urutan efektif aturan routing ALB Ingress bergantung pada urutan leksikografis dari namespace atau nama Ingress. Untuk memastikan bahwa aturan rilis canary diterapkan dalam urutan yang benar, Anda dapat menggunakan anotasi alb.ingress.kubernetes.io/order untuk menentukan urutan. Nilai valid dari alb.ingress.kubernetes.io/order adalah 1 hingga 1.000. Nilai defaultnya adalah 10. Semakin kecil nilainya, semakin tinggi prioritasnya. Misalnya, jika Anda ingin meningkatkan prioritas suatu Ingress, kurangi nilai dari pengaturan alb.ingress.kubernetes.io/order-nya.

  • Anda dapat menggunakan aturan routing kustom untuk melakukan rilis canary berdasarkan kondisi routing yang lebih kompleks. Untuk informasi lebih lanjut, lihat Kustomisasi Aturan Routing ALB Ingress.

Langkah 1: Buat aplikasi

  1. Terapkan Layanan bernama tea.

    1. Buat file bernama tea-deploy.yaml dan salin konten berikut ke dalam file:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tea
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tea
        template:
          metadata:
            labels:
              app: tea
          spec:
            containers:
            - name: tea
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest
              ports:
              - containerPort: 80
    2. Jalankan perintah berikut untuk menerapkan Layanan tea:

      kubectl apply -f tea-deploy.yaml
  2. Terapkan Layanan bernama tea-svc.

    1. Buat file bernama tea-svc.yaml dan salin konten berikut ke dalam file:

      apiVersion: v1
      kind: Service
      metadata:
        name: tea-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: tea
        type: NodePort
    2. Jalankan perintah berikut untuk menerapkan Layanan tea-svc:

      kubectl apply -f tea-svc.yaml
  3. Terapkan Ingress bernama tea-ingress.

    1. Buat file bernama tea-ingress.yaml dan salin konten berikut ke dalam file:

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: tea-ingress
      spec:
        ingressClassName: alb
        rules:
         - host: demo.domain.ingress.top # Ganti dengan nama domain Anda dan pastikan itu dapat diresolusi ke alamat IP load balancer tempat kontroler Ingress berada. 
           http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: tea-svc
                  port:
                    number: 80
    2. Jalankan perintah berikut untuk menerapkan Ingress:

      kubectl apply -f tea-ingress.yaml

Langkah 2: Lakukan rilis canary untuk versi baru Layanan

Terapkan versi baru layanan dan Ingress baru sehingga ketika header permintaan adalah location: hz, lalu lintas diarahkan ke layanan canary versi baru. Permintaan dengan header lain atau tanpa header akan diarahkan ke layanan canary versi baru dengan bobot 50%.

  1. Terapkan versi baru layanan bernama canary.

    1. Buat file bernama canary-deploy.yaml dan salin konten berikut ke dalam file:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: canary
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: canary
        template:
          metadata:
            labels:
              app: canary
          spec:
            containers:
            - name: canary
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginx:latest
              ports:
              - containerPort: 80
    2. Jalankan perintah berikut untuk menerapkan layanan canary:

      kubectl apply -f canary-deploy.yaml
  2. Terapkan layanan bernama canary-svc.

    1. Buat file bernama canary-svc.yaml dan salin konten berikut ke dalam file:

      apiVersion: v1
      kind: Service
      metadata:
        name: canary-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: canary
        type: NodePort
    2. Jalankan perintah berikut untuk menerapkan layanan canary-svc:

      kubectl apply -f canary-svc.yaml
  3. Terapkan Ingress untuk merutekan permintaan berdasarkan header.

    1. Buat file bernama canary-header-ingress.yaml dan salin konten berikut ke dalam file:

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        annotations:
          alb.ingress.kubernetes.io/canary: "true"
          alb.ingress.kubernetes.io/canary-by-header: "location"
          alb.ingress.kubernetes.io/canary-by-header-value: "hz"
        name: canary-header-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: demo.domain.ingress.top # Ganti dengan nama domain Anda dan pastikan itu dapat diresolusi ke alamat IP load balancer tempat kontroler Ingress berada. 
            http:
              paths:
                - backend:
                    service:
                      name: canary-svc
                      port:
                        number: 80
                  path: /
                  pathType: Prefix
      • Setel alb.ingress.kubernetes.io/canary ke true untuk mengaktifkan anotasi canary.

      • Setel alb.ingress.kubernetes.io/canary-by-header dan alb.ingress.kubernetes.io/canary-by-header-value ke kunci dan nilai header yang ingin dicocokkan. Dalam contoh ini, pasangan KV header disetel ke location: hz. Semua permintaan yang membawa header location: hz diarahkan ke versi baru layanan. Permintaan yang membawa header lain dicocokkan dengan aturan rilis canary lain berdasarkan prioritas aturan dan kemudian diarahkan ke versi layanan yang sesuai dengan aturan yang cocok.

    2. Jalankan perintah berikut untuk menerapkan Ingress untuk merutekan permintaan berdasarkan header:

      kubectl apply -f canary-header-ingress.yaml
  4. Terapkan Ingress untuk merutekan permintaan berdasarkan bobot.

    1. Buat file bernama canary-weight-ingress.yaml dan salin konten berikut ke dalam file:

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        annotations:
          alb.ingress.kubernetes.io/canary: "true"
          alb.ingress.kubernetes.io/canary-weight: "50"
        name: canary-weight-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: demo.domain.ingress.top # Ganti dengan nama domain Anda dan pastikan itu dapat diresolusi ke alamat IP load balancer tempat kontroler Ingress berada. 
            http:
              paths:
                - backend:
                    service:
                      name: canary-svc
                      port:
                        number: 80
                  path: /
                  pathType: Prefix

      alb.ingress.kubernetes.io/canary-weight: Menentukan persentase lalu lintas yang diarahkan ke versi baru layanan. Dalam contoh ini, nilainya disetel ke 50, yang menunjukkan bahwa 50% lalu lintas diarahkan ke versi baru layanan.

    2. Jalankan perintah berikut untuk menerapkan Ingress untuk merutekan permintaan berdasarkan bobot:

      kubectl apply -f canary-weight-ingress.yaml
  5. Periksa apakah rilis canary berhasil.

    1. Jalankan perintah berikut untuk menanyakan alamat IP instance ALB:

      kubectl get ing

      Output yang diharapkan:

      NAME                    CLASS   HOSTS                     ADDRESS                                              PORTS   AGE
      canary-header-ingress   alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      8m23s
      canary-weight-ingress   alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      8m16s
      tea-ingress             alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      7m5s
    2. Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang membawa header location: hz ke layanan:

      curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      Output yang diharapkan:

      new

      new dikembalikan untuk permintaan yang membawa header location: hz. Permintaan yang membawa header location: hz diarahkan ke versi baru layanan.

    3. Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang tidak membawa header ke layanan:

      curl -H Host:demo.domain.ingress.top  http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      new dikembalikan untuk 50% permintaan yang tidak membawa header dan old dikembalikan untuk sisa 50% permintaan. 50% permintaan yang tidak membawa header diarahkan ke versi baru layanan.

    4. Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang membawa header location: bj ke layanan:

      curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      new dikembalikan untuk 50% permintaan yang membawa header location: bj dan old dikembalikan untuk sisa 50% permintaan. 50% permintaan yang membawa header location: bj diarahkan ke versi baru layanan.

    Semua permintaan yang membawa header location: hz diarahkan ke versi baru layanan bernama canary. Hanya 50% permintaan yang membawa header lain dan tidak membawa header yang diarahkan ke versi baru layanan. Rilis canary berhasil.

Langkah 3: Deprecate versi lama Layanan

Setelah versi baru layanan berjalan seperti yang diharapkan selama periode waktu tertentu, Anda perlu mendeprecate versi lama layanan dan hanya menyimpan versi baru layanan. Untuk melakukannya, ubah layanan di Ingress versi lama menjadi versi baru layanan sehingga Ingress dapat merutekan lalu lintas ke versi baru layanan. Kemudian, hapus Ingress canary.

  1. Jalankan perintah berikut untuk memodifikasi file tea-ingress.yaml:

    vim tea-ingress.yaml

    Jalankan perintah berikut untuk mengubah layanan di file tea-ingress.yaml dari tea-svc menjadi canary-svc:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: tea-ingress
    spec:
      ingressClassName: alb
      rules:
       - host: demo.domain.ingress.top # Ganti dengan nama domain Anda dan pastikan itu dapat diresolusi ke alamat IP load balancer tempat kontroler Ingress berada. 
         http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: canary-svc # Ubah tea-svc menjadi canary-svc. 
                port:
                  number: 80
  2. Jalankan perintah berikut agar Ingress yang dimodifikasi berlaku:

    kubectl apply -f tea-ingress.yaml
  3. Periksa apakah versi lama layanan telah dideprecate.

    1. Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang membawa header location: hz ke layanan:

      curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      Output yang diharapkan:

      new

      new dikembalikan untuk permintaan yang membawa header location: hz. Permintaan yang membawa header location: hz diarahkan ke versi baru layanan.

    2. Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang tidak membawa header ke layanan:

      curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      Output yang diharapkan:

      new

      new dikembalikan untuk permintaan yang tidak membawa header. Permintaan yang tidak membawa header diarahkan ke versi baru layanan.

    3. Jalankan perintah berikut beberapa kali untuk mengirim permintaan yang membawa header location: bj ke layanan:

      curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      Output yang diharapkan:

      new

      new dikembalikan untuk permintaan yang membawa header location: bj. Permintaan yang membawa header location: bj diarahkan ke versi baru layanan.

    Permintaan yang membawa header location: hz, permintaan yang membawa header lain, dan permintaan yang tidak membawa header semuanya diarahkan ke versi baru layanan. Versi lama layanan telah dideprecate.

  4. Jalankan perintah berikut untuk menghapus Ingress canary bernama canary-weight-ingress dan canary-header-ingress:

    kubectl delete ing canary-weight-ingress canary-header-ingress