All Products
Search
Document Center

Microservices Engine:Implementasikan peluncuran kanari ujung ke ujung dengan pipeline CI/CD Jenkins

Last Updated:Mar 12, 2026

Integrasikan tata kelola lalu lintas Microservices Engine (MSE) dengan pipeline CI/CD Jenkins untuk mengotomatiskan rilis canary bagi aplikasi layanan mikro. Alur kerja ini menggabungkan build, penerapan, verifikasi, dan promosi (atau rollback) ke dalam satu pipeline, sehingga mengurangi risiko penerapan sekaligus mempertahankan kecepatan rilis.

Cara kerja

Pipeline Jenkins mengotomatiskan seluruh siklus hidup rilis:

  1. Build — Kemas kode sumber dan bangun gambar kontainer.

  2. Deploy canary — Terapkan versi baru berdampingan dengan versi dasar yang stabil.

  3. Route canary traffic — MSE mengarahkan sebagian trafik ke canary berdasarkan header, cookie, atau parameter permintaan yang Anda tentukan.

  4. Verify — Pastikan perilaku canary sesuai harapan.

  5. Promote or roll back — Promosikan canary ke produksi penuh jika lolos verifikasi, atau kembalikan ke versi dasar.

Diagram berikut menggambarkan arsitektur tersebut:

Architecture diagram

MSE mendukung tiga strategi routing canary:

StrategiDeskripsi
Berdasarkan persentaseArahkan persentase tetap trafik ke canary.
Berdasarkan aturanArahkan trafik yang sesuai dengan header, cookie, atau parameter permintaan tertentu.
Berdasarkan tagTandai trafik canary dengan header bawaan seperti x-mse-tag: gray dan arahkan melalui seluruh rantai panggilan.

Tutorial ini menggunakan routing berbasis tag dengan header x-mse-tag: gray.

Prasyarat

Sebelum memulai, pastikan Anda telah:

Sebarkan aplikasi demo

Tutorial ini menggunakan lima aplikasi yang diterapkan di kluster ACK:

AplikasiPeranPort kontainer
spring-cloud-zuulGerbang masuk (ingress gateway)20000
spring-cloud-aAplikasi A20001
spring-cloud-bAplikasi B8080
spring-cloud-cAplikasi C20003
nacos-serverRegistrasi layanan (mode standalone)--

Rantai panggilan adalah: spring-cloud-zuul -> spring-cloud-a -> spring-cloud-b -> spring-cloud-c.

Gerbang spring-cloud-zuul menangani trafik normal sebesar 100 QPS dan tambahan 10 QPS trafik canary. Permintaan dengan header x-mse-tag: gray secara otomatis diarahkan ke node downstream yang ditandai dengan gray. Anda dapat mengganti gray dengan nilai tag kustom apa pun sesuai kebutuhan Anda.

Langkah 1: Buat penerapan (deployment)

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, temukan dan klik nama kluster Anda.

  3. Di panel navigasi kiri, pilih Workloads > Deployments.

  4. Klik Create from YAML dan terapkan file YAML berikut.

spring-cloud-zuul (gerbang masuk)

Show YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-zuul
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-zuul
  template:
    metadata:
      labels:
        app: spring-cloud-zuul
        msePilotCreateAppName: spring-cloud-zuul
    spec:
      containers:
        - name: spring-cloud-zuul
          image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.1
          imagePullPolicy: Always
          ports:
            - containerPort: 20000

spring-cloud-a (versi dasar)

Show YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spring-cloud-a
  template:
    metadata:
      labels:
        app: spring-cloud-a
        msePilotCreateAppName: spring-cloud-a
    spec:
      containers:
      - name: spring-cloud-a
        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
        imagePullPolicy: Always
        ports:
        - containerPort: 20001
        livenessProbe:
          tcpSocket:
            port: 20001
          initialDelaySeconds: 10
          periodSeconds: 30

spring-cloud-b (versi dasar)

Show YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-b
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spring-cloud-b
  strategy:
  template:
    metadata:
      labels:
        app: spring-cloud-b
        msePilotCreateAppName: spring-cloud-b
    spec:
      containers:
      - name: spring-cloud-b
        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 20002
          initialDelaySeconds: 10
          periodSeconds: 30

spring-cloud-c (versi dasar)

Show YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-c
  template:
    metadata:
      labels:
        app: spring-cloud-c
        msePilotCreateAppName: spring-cloud-c
    spec:
      containers:
      - name: spring-cloud-c
        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.1-SNAPSHOT
        imagePullPolicy: Always
        ports:
        - containerPort: 20003
        livenessProbe:
          tcpSocket:
            port: 20003
          initialDelaySeconds: 10
          periodSeconds: 30

nacos-server (registrasi layanan) dan layanan SLB

Show YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nacos-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nacos-server
  template:
    metadata:
      labels:
        app: nacos-server
    spec:
      containers:
      - env:
        - name: MODE
          value: standalone
        image: nacos/nacos-server:v2.2.0
        imagePullPolicy: Always
        name: nacos-server
      dnsPolicy: ClusterFirst
      restartPolicy: Always

# SLB service for the spring-cloud-zuul gateway
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
  name: zuul-slb
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 20000
  selector:
    app: spring-cloud-zuul
  type: LoadBalancer

Langkah 2: Verifikasi penerapan

Setelah semua aplikasi diterapkan, buka Konsol MSE dan periksa trafik untuk Aplikasi A. Seluruh trafik harus mengalir ke node untagged, tanpa trafik pada node canary.

Buat jalur (lane) untuk routing canary

Jalur menentukan cara MSE mengarahkan trafik canary melalui rantai panggilan layanan mikro. Pertama-tama, siapkan grup jalur, lalu buat jalur dengan aturan routing.

Langkah 1: Buat grup jalur

  1. Masuk ke Konsol MSE dan pilih Wilayah di bilah navigasi atas.

  2. Di panel navigasi kiri, pilih Microservices Governance > Full link grayscale.

  3. Klik Create Lane Group and Lane. Jika grup jalur sudah ada di namespace layanan mikro Anda, klik + Create Lane Group.

  4. Konfigurasikan grup jalur:

    ParameterNilai
    Lane Group NameNama deskriptif untuk grup jalur.
    Ingress TypePilih Java Microservice Gateway.
    Lane Group Traffic EntryPilih aplikasi ingress Anda (spring-cloud-zuul).
    Lane Group ApplicationPilih semua aplikasi dalam rantai panggilan.
  5. Klik OK.

Setelah pembuatan, verifikasi bahwa aplikasi ingress dan aplikasi terkait muncul di bagian applications involved in the lane group pada halaman Full link grayscale. Untuk mengubah grup jalur, klik Edit.

Langkah 2: Buat jalur

  1. Di halaman Full link grayscale, pilih namespace layanan mikro yang sama dengan grup jalur Anda.

  2. Klik Click to Create First Split Lane. Jika jalur sudah ada, klik Create Lane.

    Penting

    Setelah Anda mengonfigurasi peluncuran kanari ujung ke ujung untuk aplikasi, aplikasi tersebut tidak lagi mendukung fitur seperti rilis canary dan routing berbasis tag.

  3. Konfigurasikan parameter jalur: Kondisi routing mendukung jenis parameter berikut:

    Penting

    Trafik yang tidak sesuai dengan kondisi routing canary mana pun akan diarahkan ke node untagged pada versi dasar.

    ParameterDeskripsi
    Add Node TagTambahkan tag (misalnya, gray) untuk mengidentifikasi node canary.
    Enter lane informationAtur Lane Tag dan gunakan Confirm Matching Relationship untuk memverifikasi jumlah node bertag.
    Configure Routing and Canary Release RulesTentukan kondisi routing (lihat tabel berikut).
    Jenis parameterDeskripsi
    ParameterParameter permintaan
    HeaderHeader permintaan
    CookieCookie HTTP
    Body ContentBadan permintaan berformat JSON
  4. Klik OK.

Setelah konfigurasi, gerbang mengarahkan trafik sebagai berikut:

  • Trafik yang tidak sesuai dengan aturan canary dialihkan ke versi dasar. Base version traffic routing

  • Trafik yang sesuai dengan aturan canary dialihkan ke versi canary. Canary version traffic routing

Konfigurasikan pipeline Jenkins

Langkah 1: Siapkan kredensial registri gambar

Buat Kubernetes Secret agar Jenkins dapat mendorong gambar ke registri kontainer Anda. Setelah menghasilkan file config.json dengan kredensial registri Anda, jalankan:

kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json

Untuk detailnya, lihat Siapkan Jenkins untuk membangun pipeline pengiriman aplikasi.

Langkah 2: Buat pipeline

  1. Di Dasbor Jenkins, klik New Item di panel navigasi kiri.

  2. Masukkan nama pipeline, pilih Pipeline sebagai tipe, lalu klik OK.

  3. Di halaman konfigurasi, klik tab Pipeline dan atur hal berikut:

    • Definition: Pilih Pipeline script from SCM.

    • SCM: Pilih Git.

    • Repository URL: Masukkan URL repositori Git Anda. Tutorial ini menggunakan https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demo. > Catatan: Jika instans Jenkins Anda tidak dapat mengakses GitHub, gunakan mirror Gitee sebagai gantinya.

    • Script Path: Masukkan Jenkinsfile.

  4. Klik Save.

Jenkinsfile menentukan empat tahap pipeline:

Show Jenkinsfile

#!groovy
pipeline {

    // Build agent label
    agent{
        node{
          label 'slave-pipeline'
        }
    }

    // Image registry path, assembled from parameters
    environment{
        IMAGE = sh(returnStdout: true,script: 'echo registry.$image_region.aliyuncs.com/$image_namespace/$image_reponame:$image_tag').trim()
        BRANCH =  sh(returnStdout: true,script: 'echo $branch').trim()
    }
    options {
        // Keep a maximum of 10 builds
        buildDiscarder(logRotator(numToKeepStr: '10'))
    }

    parameters {
        string(name: 'image_region', defaultValue: 'cn-shanghai')
        string(name: 'image_namespace', defaultValue: 'yizhan')
        string(name: 'image_reponame', defaultValue: 'spring-cloud-a')
        string(name: 'image_tag', defaultValue: 'gray')
        string(name: 'branch', defaultValue: 'master')
        string(name: 'number_of_pods', defaultValue: '2')
    }

    stages {

        stage('Code packaging') {
            steps{
                container("maven") {
                    echo "Image building......"
                    sh "cd A && mvn clean package"
                }

            }
        }


        stage('Image building and releasing'){
          steps{
              container("kaniko") {
                  sh "kaniko -f `pwd`/A/Dockerfile -c `pwd`/A --destination=${IMAGE} --skip-tls-verify"
              }
          }
        }



        stage('Canary deployment') {
            steps{
                container('kubectl') {
                    echo "Canary deployment......"
                    sh "cd A && sed -i -E \"s/${env.image_reponame}:.+/${env.image_reponame}:${env.image_tag}/\" A-gray-deployment.yaml"
                    sh "cd A && sed -i -E \"s/replicas:.+/replicas: ${env.number_of_pods}/\" A-gray-deployment.yaml"
                    sh "kubectl apply -f A/A-gray-deployment.yaml -n default"
                }
            }
        }

        stage('Completing canary deployment') {
            input {
                message "Are you sure that you want to enable a full release"
                ok "OK"
                parameters {
                    string(name: 'continue', defaultValue: 'true', description: 'true indicates a full release, and false indicates a rollback')
                }
            }
            steps{
                script {
                    env.continue = sh (script: 'echo ${continue}', returnStdout: true).trim()
                    if (env.continue.equals('true')) {
                        container('kubectl') {
                            echo "Full releasing......"
                            sh "cd A && sed -i -E \"s/${env.image_reponame}:.+/${env.image_reponame}:${env.image_tag}/\" A-deployment.yaml"
                            sh "cd A && sed -i -E \"s/replicas:.+/replicas: ${env.number_of_pods}/\" A-deployment.yaml"
                            sh "kubectl apply -f A/A-deployment.yaml -n default"
                        }
                    } else {
                        echo 'Rolling back'
                    }
                    container('kubectl') {
                        sh "kubectl delete -f A/A-gray-deployment.yaml -n default"
                    }
                }
            }
        }
    }
}

Tahap pipeline:

TahapFungsinyaKontainer
Code packagingMembangun aplikasi dengan Maven (mvn clean package).maven
Image building and releasingMembangun dan mendorong gambar kontainer dengan Kaniko.kaniko
Canary deploymentMemperbarui file YAML penerapan gray dengan tag gambar baru dan menerapkannya.kubectl
Completing canary deploymentMenunggu input manual. Masukkan true untuk promosi atau false untuk rollback.kubectl

Parameter pipeline:

ParameterBawaanDeskripsi
image_regioncn-shanghaiWilayah Container Registry.
image_namespaceyizhanNamespace Container Registry.
image_reponamespring-cloud-aNama repositori gambar.
image_taggrayTag gambar untuk build canary.
branchmasterCabang Git tempat melakukan build.
number_of_pods2Jumlah replika pod.

Jalankan pipeline dan verifikasi

Langkah 1: Bangun pipeline

  1. Di Dasbor Jenkins, klik Build di samping nama pipeline.

  2. Klik Build.

    Catatan

    Build pertama menarik konfigurasi dari repositori Git dan menginisialisasi pipeline. Jika terjadi error, klik Build with Parameters, konfigurasikan parameter, lalu bangun ulang.

  3. Tunggu hingga tahap Code packaging, Image building and releasing, dan Canary deployment selesai. Pipeline akan berhenti di tahap Completing canary deployment, menunggu konfirmasi Anda.

Langkah 2: Verifikasi penerapan canary

  1. Masuk ke Konsol ACK. Navigasi ke kluster Anda dan pilih Workloads > Deployments.

  2. Pastikan deployment spring-cloud-a-gray ada dan menggunakan gambar spring-cloud-a:gray.

  3. Navigasi ke Network > Services, pilih namespace Anda, lalu klik public endpoint layanan zuul-slb.

  4. Uji routing trafik: Trafik normal (tanpa header canary) — diarahkan ke versi dasar: Output yang diharapkan: Trafik canary (dengan tag canary) — diarahkan ke node canary: Output yang diharapkan:

       curl http://<zuul-slb-public-endpoint>/A/a
       A[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%
       curl http://<zuul-slb-public-endpoint>/A/a?name=xiaoming
       Agray[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%
  5. Di Konsol MSE, buka halaman detail aplikasi dan pastikan trafik canary diarahkan ke node canary.

Promosikan ke rilis penuh

Setelah verifikasi berhasil, promosikan canary ke produksi.

  1. Di Dasbor Jenkins, klik nama pipeline.

  2. Klik tahap Completing canary deployment, masukkan true di kotak dialog Are you sure that you want to enable a full release, lalu klik OK.

  3. Di Konsol ACK, verifikasi bahwa:

    • Deployment spring-cloud-a-gray dihapus.

    • Deployment spring-cloud-a kini menggunakan gambar spring-cloud-a:gray.

  4. Di Konsol MSE, pastikan trafik canary tidak lagi muncul.

Rollback

Jika verifikasi gagal, kembalikan ke versi dasar.

  1. Di Dasbor Jenkins, klik nama pipeline.

  2. Klik tahap Completing canary deployment, masukkan false di kotak dialog Are you sure that you want to enable a full release, lalu klik OK.

  3. Di Konsol ACK, verifikasi bahwa:

    • Deployment spring-cloud-a-gray dihapus.

    • Deployment spring-cloud-a tetap menggunakan versi gambar aslinya.

  4. Di Konsol MSE, pastikan trafik canary tidak lagi muncul.