Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:Use traffic labels to implement an end-to-end canary release

Son Güncelleme:Oct 07, 2026

Standart canary sürümleri, tek bir hizmetin farklı sürümlerine trafiği ağırlık oranlarına göre yönlendirir. Bu yaklaşım izole hizmetler için işe yarasa da istek bir çağrı zincirinde birden fazla hizmeti kapsadığında yetersiz kalır. Örneğin, canary trafiği A Hizmeti'ne ulaşır ancak ardından B Hizmeti'nin temel sürümüne rastgele yönlendirilirse test sonuçları güvenilir olmaz.

Uçtan uca canary sürümleri, ağ geçidindeki gelen trafiği etiketleyerek ve bu etiketi tüm çağrı zinciri boyunca yayarak bu sorunu çözer. Her hizmet etiketi okur ve eşleşen sürüme yönlendirir; böylece canary trafiği yalnızca canary sürümlerden akar ve temel trafik temel sürümlerde kalır.

Service Mesh (ASM), bunu iki yetenekle uygular:

  • Trafik etiketleme: İstek üst bilgilerinden etiketleri çıkaran ve bunları trafik akışlarına ekleyen bir TrafficLabel Özel Kaynak Tanımı (CRD)

  • Etiket tabanlı yönlendirme: Trafiği etiket değeriyle eşleşen alt kümelere yönlendiren VirtualService kuralları

Çalışma biçimi

Aşağıdaki diyagram, bu öğreticide kullanılan çağrı zincirini gösterir. A Hizmeti (mocka) gelen trafiği alır ve B Hizmeti'ni (mockb) çağırır:

Application service call chain

Her iki hizmetin de dağıtılmış iki sürümü vardır: base ve canary. Trafik etiketleri olmadan istekler, round-robin yük dengeleme ile sürümler arasında dağıtılır.

Trafik etiketlerini yapılandırdıktan sonra sistem:

  1. Ağ geçidindeki gelen isteklerden my-asm-prefer-tag üst bilgisini okuyarak trafiği version-base veya version-canary olarak sınıflandırır.

  2. İsteği A Hizmeti'nin eşleşen sürümüne yönlendirir.

  3. B Hizmeti'ne etiketi my-trace-id üst bilgisi aracılığıyla yayarak B Hizmeti'nin de eşleşen sürüme yönlendirmesini sağlar.

Not

Uygulamalarınızın HTTP üst bilgisini hizmet çağrıları arasında yayması gerekir. Bu öğreticideki örnek hizmetler bu mantığı zaten içerir. Kendi uygulamalarınız için trafik etiketlemede kullanılan üst bilgiye yönelik üst bilgi yayılımını uygulayın. Referans uygulama için örnek kodda src/mock-abc/go/main.go dosyasına bakın.

Ön koşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

Örnek yapılandırma dosyaları

Bu öğreticide kullanılan örnek yapılandırma dosyalarını indirin. Arşiv aşağıdaki dosyaları içerir:

Dosya Amaç
application-base.yaml A Hizmeti'nin (mocka) ve B Hizmeti'nin (mockb) temel sürümlerini dağıtır
application-canary.yaml Her iki hizmetin canary sürümlerini dağıtır
routing.yaml İlk yönlendirme için Gateway, DestinationRules ve VirtualServices öğelerini tanımlar
trafficlabel.yaml Trafik etiketleme için TrafficLabel CRD'lerini yapılandırır
vs-tf-mockb.yaml B Hizmeti'ne etiket tabanlı yönlendirmeyi uygular
vs-tf-mocka.yaml Ağ geçidinde A Hizmeti'ne etiket tabanlı yönlendirmeyi uygular
vs-tf-mocka-90-10.yaml A Hizmeti'ne ağırlık tabanlı dağıtım (%90 temel, %10 etiket tabanlı) ekler

application-base.yaml -- Temel sürüm dağıtımları

apiVersion: v1
kind: Service
metadata:
  name: mocka
  labels:
    app: mocka
    service: mocka
spec:
  ports:
  - port: 8000
    name: http
  selector:
    app: mocka
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mocka-base
  labels:
    app: mocka
    version: base
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mocka
      version: base
  template:
    metadata:
      labels:
        app: mocka
        version: base
    spec:
      containers:
      - name: default
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
        imagePullPolicy: Always
        env:
        - name: version
          value: base
        - name: app
          value: mocka
        - name: upstream_url
          value: "http://mockb:8000/"
        ports:
        - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: mockb
  labels:
    app: mockb
    service: mockb
spec:
  ports:
  - port: 8000
    name: http
  selector:
    app: mockb
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mockb-base
  labels:
    app: mockb
    version: base
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mockb
      version: base
  template:
    metadata:
      labels:
        app: mockb
        version: base
    spec:
      containers:
      - name: default
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
        imagePullPolicy: Always
        env:
        - name: version
          value: base
        - name: app
          value: mockb
        ports:
        - containerPort: 8000

application-canary.yaml -- Canary sürüm dağıtımları

apiVersion: v1
kind: Service
metadata:
  name: mocka
  labels:
    app: mocka
    service: mocka
spec:
  ports:
  - port: 8000
    name: http
  selector:
    app: mocka
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mocka-canary
  labels:
    app: mocka
    version: canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mocka
      version: canary
  template:
    metadata:
      labels:
        app: mocka
        version: canary
    spec:
      containers:
      - name: default
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
        imagePullPolicy: Always
        env:
        - name: version
          value: canary
        - name: app
          value: mocka
        - name: upstream_url
          value: "http://mockb:8000/"
        ports:
        - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: mockb
  labels:
    app: mockb
    service: mockb
spec:
  ports:
  - port: 8000
    name: http
  selector:
    app: mockb
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mockb-canary
  labels:
    app: mockb
    version: canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mockb
      version: canary
  template:
    metadata:
      labels:
        app: mockb
        version: canary
    spec:
      containers:
      - name: default
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
        imagePullPolicy: Always
        env:
        - name: version
          value: canary
        - name: app
          value: mockb
        ports:
        - containerPort: 8000

Adım 1: Örnek hizmetleri dağıtma

  1. Hedef ad alanı için otomatik sidecar proxy enjeksiyonunu etkinleştirin (bu örnekte default). Bkz. Otomatik sidecar proxy enjeksiyonunu etkinleştirme.

  2. kubectl ile Container Service for Kubernetes (ACK) kümesine bağlanın ve örnek hizmetleri dağıtın:

    kubectl apply -n default -f application-base.yaml
    kubectl apply -n default -f application-canary.yaml

Adım 2: İlk yönlendirme kurallarını ayarlama

Trafik etiketleri olmadan temel yönlendirmeyi oluşturmak için Gateway, DestinationRules ve VirtualServices öğelerini ayarlayın.

  1. Aşağıdaki içeriğe sahip routing.yaml adlı bir dosya oluşturun:

    routing.yaml içeriği

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: simple-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - "*"
          port:
            name: http
            number: 80
            protocol: HTTP
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mocka
    spec:
      host: mocka
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
      subsets:
        - labels:
            version: base
          name: version-base
        - labels:
            version: canary
          name: version-canary
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mockb
    spec:
      host: mockb
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
      subsets:
        - labels:
            version: base
          name: version-base
        - labels:
            version: canary
          name: version-canary
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-gateway-mocka
    spec:
      gateways:
      - simple-gateway
      hosts:
        - "*"
      http:
      - route:
          - destination:
              host: mocka
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mockb
    spec:
      hosts:
        - mockb
      http:
        - route:
            - destination:
                host: mockb

    Bu yapılandırma:

    • 80 numaralı bağlantı noktasındaki tüm HTTP trafiğini kabul eden bir Gateway (simple-gateway) oluşturur

    • version-base ve version-canary alt kümeleriyle her iki hizmet için DestinationRules tanımlar

    • Etiket tabanlı mantık olmadan trafiği yönlendiren VirtualServices oluşturur

  2. kubectl ile ASM örneğine bağlanın ve yönlendirme kurallarını uygulayın:

    kubectl apply -n default -f routing.yaml
  3. Her iki hizmet sürümünün de erişilebilir olduğunu doğrulayın.

    1. ASM konsolu üzerinden giriş ağ geçidinin genel IP adresini alın. Bkz. ASM giriş ağ geçidinin IP adresini alma.

    2. Ağ geçidi IP'sini bir ortam değişkeni olarak ayarlayın. <gateway-ip> yerine gerçek IP adresini girin:

      export ASM_GATEWAY_IP=<gateway-ip>
    3. Test istekleri gönderin:

      for i in {1..200};  do curl   -H'my-asm-prefer-tag: version-base'  -H'my-trace-id: x000'$i  http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Beklenen çıktı -- trafik her iki hizmetin tüm sürümleri arasında rastgele dağıtılır:

    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54)
    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54)

    Bu noktada my-asm-prefer-tag üst bilgisinin yönlendirme üzerinde hiçbir etkisi yoktur. İstekler, üst bilgi değerinden bağımsız olarak round-robin yük dengelemeyi izler.

Adım 3: Trafik etiketlerini yapılandırma

İstek üst bilgilerinden yönlendirme etiketlerini çıkarmak için TrafficLabel kaynakları oluşturun. ASM, trafiğin version-base mu yoksa version-canary mı olduğunu belirlemek için bu etiketleri kullanır. Trafik etiketleme hakkında arka plan bilgisi için bkz. Trafiği etiketleme.

  1. Aşağıdaki içeriğe sahip trafficlabel.yaml adlı bir dosya oluşturun:

    trafficlabel.yaml içeriği

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: trafficlabel-ns
      namespace: default
    spec:
      rules:
      - labels:
        - name: asm-labels-sample
          valueFrom:
          - $getExternalInboundRequestHeader(my-asm-prefer-tag, my-trace-id)
    ---
    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: ingressgateway
      namespace: istio-system
    spec:
      rules:
      - labels:
        - name: asm-labels-sample
          valueFrom:
          - $getInboundRequestHeader(my-asm-prefer-tag)
      workloadSelector:
        labels:
          istio: ingressgateway

    Bu yapılandırma iki TrafficLabel kaynağı tanımlar:

    Kaynak Kapsam Davranış
    trafficlabel-ns default ad alanındaki tüm hizmetler (mocka, mockb) Sürüm etiketini my-asm-prefer-tag üst bilgisinden çıkarmak için $getExternalInboundRequestHeader kullanır. İkinci parametre olan my-trace-id, uygulamanın hizmetler arasında yayması gereken izleme üst bilgisini belirtir.
    ingressgateway Yalnızca giriş ağ geçidi (istio-system ad alanı) Gelen istemci isteğinin my-asm-prefer-tag üst bilgisinden sürüm etiketini okur.
    Not

    Bu örnekte my-asm-prefer-tag ve my-trace-id üst bilgi adları kullanılmıştır. Bunları uygulamanıza uygun üst bilgileriyle değiştirin.

  2. kubectl ile ASM örneğine bağlanın ve trafik etiketlerini uygulayın:

    kubectl apply -f trafficlabel.yaml

Adım 4: Etiket tabanlı yönlendirmeyi uygulama ve doğrulama

Bu adım, uçtan uca canary sürümünü üç aşamada kademeli olarak doğrular:

  1. Tek atlamalı yönlendirme -- B Hizmeti'ne etiket tabanlı yönlendirmeyi uygulayın ve trafik etiketinin istekleri doğru şekilde eşleşen sürüme yönlendirdiğini onaylayın

  2. Tam zincir yönlendirme -- Canary trafiğinin uçtan uca tüm hizmetlerin canary sürümlerinden akması için A Hizmeti'ne ağ geçidi düzeyinde etiket tabanlı yönlendirmeyi uygulayın

  3. Ağırlıklı yönlendirme -- Canary yayılma yüzdesini kontrol etmek için ağırlık tabanlı dağıtımı etiket tabanlı yönlendirmeyle birleştirin

B Hizmeti için etiket tabanlı yönlendirmeyi doğrulama

Önce B Hizmeti'ne etiket tabanlı yönlendirmeyi uygulayın. Bu, A Hizmeti'nden gelen trafik etiketinin istekleri B Hizmeti'nin eşleşen sürümüne doğru şekilde yönlendirdiğini doğrular.

Service provider side canary release verification

  1. Aşağıdaki içeriğe sahip vs-tf-mockb.yaml adlı bir dosya oluşturun:

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mockb
    spec:
      hosts:
        - mockb
      http:
        - route:
            - destination:
                host: mockb
                subset: $asm-labels-sample

    $asm-labels-sample alt kümesi, trafik etiketi değerine dinamik olarak çözülür; ya version-base ya da version-canary.

  2. Yönlendirme kuralını uygulayın:

    kubectl apply -n default -f vs-tf-mockb.yaml
  3. Canary trafiği gönderin ve B Hizmeti'nin bunu canary sürümünde aldığını doğrulayın:

    for i in {1..200}; do curl -H'my-asm-prefer-tag: version-canary' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Beklenen çıktı -- A Hizmeti hâlâ rastgele trafik alırken B Hizmeti tutarlı bir şekilde canary sürümüne yönlendirir:

    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54)
  4. Temel trafik gönderin ve B Hizmeti'nin bunu temel sürümde aldığını doğrulayın:

    for i in {1..200}; do curl -H'my-asm-prefer-tag: version-base' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Beklenen çıktı -- B Hizmeti tutarlı bir şekilde temel sürüme yönlendirir:

    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)

B Hizmeti yönlendirmesi artık beklendiği gibi çalışıyor. Henüz ağ geçidine etiket tabanlı bir yönlendirme kuralı uygulanmadığı için A Hizmeti trafiği rastgele almaya devam ediyor.

Uçtan uca canary yönlendirmeyi doğrulama

Tüm çağrı zincirinin trafik etiketine saygı göstermesi için A Hizmeti'ne ağ geçidi düzeyinde etiket tabanlı yönlendirmeyi uygulayın.

End-to-end canary release verification

  1. Aşağıdaki içeriğe sahip vs-tf-mocka.yaml adlı bir dosya oluşturun:

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-gateway-mocka
    spec:
      gateways:
      - simple-gateway
      hosts:
        - "*"
      http:
      - route:
          - destination:
              host: mocka
              subset: $asm-labels-sample
  2. Yönlendirme kuralını giriş ağ geçidine uygulayın:

    kubectl apply -n default -f vs-tf-mocka.yaml
  3. Canary trafiği gönderin ve her iki hizmetin de canary sürümlerine yönlendirme yaptığını doğrulayın:

    for i in {1..200}; do curl -H'my-asm-prefer-tag: version-canary' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Beklenen çıktı -- tüm trafik uçtan uca canary sürümlerden akar:

    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
  4. Temel trafik gönderin ve her iki hizmetin de temel sürümlere yönlendirme yaptığını doğrulayın:

    for i in {1..200}; do curl -H'my-asm-prefer-tag: version-base' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Beklenen çıktı -- tüm trafik uçtan uca temel sürümlerden akar:

    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)

Uçtan uca canary yönlendirme artık etkin. Canary trafiği tutarlı bir şekilde tüm hizmetlerin canary sürümlerine ulaşırken temel trafik temel sürümlerde kalır.

Etiketlerle ağırlıklı trafik dağıtımını doğrulama

Üretim ortamında genellikle trafiğin küçük bir yüzdesini canary sürümüne yönlendirerek başlarsınız. Yayılma sürecini kontrol etmek için ağırlık tabanlı dağıtımı etiket tabanlı yönlendirmeyle birleştirin.

Weight-based and label-based routing verification

  1. Aşağıdaki içeriğe sahip vs-tf-mocka-90-10.yaml adlı bir dosya oluşturun:

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-gateway-mocka
    spec:
      gateways:
      - simple-gateway
      hosts:
        - "*"
      http:
      - route:
          - destination:
              host: mocka
              subset: version-base
            weight: 90
          - destination:
              host: mocka
              subset: $asm-labels-sample
            weight: 10

    Bu yapılandırma, trafiğin %90'ını A Hizmeti'nin temel sürümüne gönderir. Kalan %10'luk kısım trafik etiketine göre yönlendirilir; my-asm-prefer-tag üst bilgisi version-canary olarak ayarlanmışsa bu %10'luk kısım canary sürümüne gider.

  2. Ağırlıklı yönlendirme kuralını uygulayın:

    kubectl apply -n default -f vs-tf-mocka-90-10.yaml
  3. Canary trafiği gönderin ve dağıtımı kontrol edin:

    for i in {1..200}; do curl -H'my-asm-prefer-tag: version-canary' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Beklenen çıktı -- isteklerin yaklaşık %90'ı A Hizmeti'nin temel sürümüne ulaşırken %10'u canary sürümüne ulaşır. Etiket çağrı zinciri boyunca yayıldığı için B Hizmeti tutarlı bir şekilde canary sürümüne yönlendirir:

    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    ...
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)

    10 istekten yaklaşık 9'u mocka(version: base) sürümüne ulaşırken yaklaşık 1'i mocka(version: canary) sürümüne ulaşır. Her iki durumda da mockb canary sürümüne yönlendirir.

  4. Temel trafik gönderin ve tüm isteklerin temel sürümlere ulaştığını doğrulayın:

    for i in {1..200}; do curl -H'my-asm-prefer-tag: version-base' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Beklenen çıktı -- trafiğin %90'ı doğrudan temel sürüme gider. Kalan %10'luk kısım da etiket version-base olarak çözümlendiği için temel sürüme yönlendirilir:

    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)

    my-asm-prefer-tag değeri version-base olarak ayarlandığında %90 sabit ağırlıkla temel sürüme gider ve kalan %10 da etiketle temel sürüme çözülür. Sonuç olarak trafik %100 temel sürüme yönelir.

Sonraki adımlar