All Products
Search
Document Center

Container Compute Service:Gunakan ALB Ingress untuk Melakukan Rilis Canary

Last Updated:Jul 02, 2025

Rilis canary adalah strategi peluncuran perangkat lunak yang umum digunakan. Ini memungkinkan Anda secara bertahap mendorong versi layanan baru ke semua pengguna guna memastikan stabilitas sistem di lingkungan produksi selama iterasi layanan. Application Load Balancer (ALB) Ingresses memungkinkan Anda menggunakan anotasi canary untuk melakukan rilis canary berdasarkan header, cookie, dan bobot. Topik ini menjelaskan cara menambahkan anotasi canary ke ALB Ingress untuk melaksanakan rilis canary.

Prasyarat

Pertimbangan

  • Prioritas aturan rilis canary yang dilaksanakan berdasarkan anotasi canary adalah sebagai berikut: Header > Cookie > Bobot. Saat semua kebijakan di atas dikonfigurasi, aturan berbasis header akan diprioritaskan. Untuk informasi lebih lanjut tentang anotasi canary, lihat Anotasi Canary ALB Ingress.

  • Aturan berbasis header dan cookie tidak dapat dikonfigurasikan dengan aturan berbasis bobot pada Ingress yang sama. Anda harus mengonfigurasikannya pada dua Ingress terpisah atau menggunakan aturan routing kustom. Anda dapat menggunakan aturan routing kustom untuk melakukan rilis canary berdasarkan kondisi routing yang lebih kompleks. Untuk informasi lebih lanjut, lihat Sesuaikan Aturan Routing ALB Ingress.

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

Langkah 1: Buat aplikasi

  1. Sebarkan Service bernama tea.

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

      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 Service tea:

      kubectl apply -f tea-deploy.yaml
  2. Sebarkan Service bernama tea-svc.

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

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

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

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

      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 diselesaikan 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
  4. Verifikasi bahwa penerapan berhasil.

    1. Jalankan perintah berikut untuk mengakses Service.

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

      Hasil yang Diharapkan:

      old

Langkah 2: Lakukan rilis canary untuk versi layanan baru

Sebarkan versi layanan baru dan Ingress baru untuk merutekan semua permintaan yang membawa header location: hz ke versi layanan baru bernama canary dan merutekan 50% dari permintaan lainnya ke versi layanan baru. Permintaan lainnya termasuk permintaan yang membawa header lain dan permintaan yang tidak membawa header.

  1. Sebarkan versi layanan baru bernama canary.

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

      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 Service canary:

      kubectl apply -f canary-deploy.yaml
  2. Sebarkan Service bernama canary-svc.

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

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

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

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

      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 diselesaikan 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 Anda cocokkan. Dalam contoh ini, pasangan KV header disetel ke location: hz. Semua permintaan yang membawa header location: hz dirutekan ke versi layanan baru. Permintaan yang membawa header lain dicocokkan dengan aturan rilis canary lainnya berdasarkan prioritas aturan dan kemudian dirutekan ke versi layanan yang terkait dengan aturan yang cocok.

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

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

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

      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 diselesaikan 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 dirutekan ke versi layanan baru. Dalam contoh ini, nilainya disetel ke 50, yang menunjukkan bahwa 50% lalu lintas dirutekan ke versi layanan baru.

    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 ingress

      Hasil 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 dengan header location: hz ke Service:

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

      Hasil yang Diharapkan:

      new

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

    3. Jalankan perintah berikut beberapa kali untuk mengirim permintaan tanpa header ke Service:

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

      new dikembalikan untuk 50% permintaan tanpa header, sedangkan old dikembalikan untuk sisanya. Sebanyak 50% permintaan tanpa header akan dirutekan ke versi layanan baru.

    4. Jalankan perintah berikut beberapa kali untuk mengirim permintaan dengan header location: bj ke Service:

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

      new dikembalikan untuk 50% permintaan yang menyertakan header location: bj, sedangkan old dikembalikan untuk sisa 50%. Permintaan yang membawa header location: bj sebesar 50% akan dirutekan ke versi layanan baru.

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

Langkah 3: Deprecate versi layanan lama

Setelah versi layanan baru beroperasi sesuai harapan selama periode tertentu, Anda perlu mendeprecate versi layanan lama dan hanya mempertahankan versi layanan baru. Untuk melakukannya, ubah Service dalam Ingress versi layanan lama menjadi versi layanan baru agar Ingress dapat merutekan lalu lintas ke versi layanan baru. Kemudian, hapus Ingress canary.

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

    vim tea-ingress.yaml

    Jalankan perintah berikut untuk mengubah Service dalam 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 diselesaikan 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 diterapkan:

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

    1. Jalankan perintah berikut beberapa kali untuk mengirim permintaan dengan header location: hz ke Service:

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

      Hasil yang Diharapkan:

      new

      new dikembalikan untuk permintaan dengan header location: hz. Permintaan dengan header location: hz dirutekan ke versi layanan baru.

    2. Jalankan perintah berikut beberapa kali untuk mengirim permintaan tanpa header ke Service:

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

      Hasil yang Diharapkan:

      new

      new dikembalikan untuk permintaan tanpa header. Permintaan tanpa header dirutekan ke versi layanan baru.

    3. Jalankan perintah berikut beberapa kali untuk mengirim permintaan dengan header location: bj ke Service:

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

      Hasil yang Diharapkan:

      new

      new dikembalikan untuk permintaan dengan header location: bj. Permintaan dengan header location: bj dirutekan ke versi layanan baru.

    Permintaan dengan header location: hz, permintaan dengan header lain, dan permintaan tanpa header semuanya dirutekan ke versi layanan baru. Versi layanan lama telah didiskreditkan.

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

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