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:

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:
Ağ geçidindeki gelen isteklerden
my-asm-prefer-tagüst bilgisini okuyarak trafiğiversion-baseveyaversion-canaryolarak sınıflandırır.İsteği A Hizmeti'nin eşleşen sürümüne yönlendirir.
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.
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:
Enterprise Edition veya Ultimate Edition sürümünde, 1.17.2.22 veya üzeri bir ASM örneği. Bkz. ASM örneği oluşturma veya ASM örneğini güncelleme
ASM örneğine eklenmiş bir küme. Bkz. ASM örneğine küme ekleme
Bir giriş ağ geçidi. Bkz. Giriş ağ geçidi oluşturma
Ö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 |
Adım 1: Örnek hizmetleri dağıtma
Hedef ad alanı için otomatik sidecar proxy enjeksiyonunu etkinleştirin (bu örnekte
default). Bkz. Otomatik sidecar proxy enjeksiyonunu etkinleştirme.-
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.
-
Aşağıdaki içeriğe sahip routing.yaml adlı bir dosya oluşturun:
Bu yapılandırma:
80 numaralı bağlantı noktasındaki tüm HTTP trafiğini kabul eden bir Gateway (
simple-gateway) oluştururversion-baseveversion-canaryalt kümeleriyle her iki hizmet için DestinationRules tanımlarEtiket tabanlı mantık olmadan trafiği yönlendiren VirtualServices oluşturur
-
kubectl ile ASM örneğine bağlanın ve yönlendirme kurallarını uygulayın:
kubectl apply -n default -f routing.yaml -
Her iki hizmet sürümünün de erişilebilir olduğunu doğrulayın.
ASM konsolu üzerinden giriş ağ geçidinin genel IP adresini alın. Bkz. ASM giriş ağ geçidinin IP adresini alma.
-
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> -
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.
-
Aşağıdaki içeriğe sahip trafficlabel.yaml adlı bir dosya oluşturun:
Bu yapılandırma iki TrafficLabel kaynağı tanımlar:
Kaynak Kapsam Davranış trafficlabel-nsdefaultad alanındaki tüm hizmetler (mocka,mockb)Sürüm etiketini my-asm-prefer-tagüst bilgisinden çıkarmak için$getExternalInboundRequestHeaderkullanır. İkinci parametre olanmy-trace-id, uygulamanın hizmetler arasında yayması gereken izleme üst bilgisini belirtir.ingressgatewayYalnızca giriş ağ geçidi ( istio-systemad alanı)Gelen istemci isteğinin my-asm-prefer-tagüst bilgisinden sürüm etiketini okur.NotBu örnekte
my-asm-prefer-tagvemy-trace-idüst bilgi adları kullanılmıştır. Bunları uygulamanıza uygun üst bilgileriyle değiştirin. -
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:
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
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
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.

-
Aşağıdaki içeriğe sahip
vs-tf-mockb.yamladlı 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-samplealt kümesi, trafik etiketi değerine dinamik olarak çözülür; yaversion-baseya daversion-canary. -
Yönlendirme kuralını uygulayın:
kubectl apply -n default -f vs-tf-mockb.yaml -
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) -
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.

-
Aşağıdaki içeriğe sahip
vs-tf-mocka.yamladlı 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 -
Yönlendirme kuralını giriş ağ geçidine uygulayın:
kubectl apply -n default -f vs-tf-mocka.yaml -
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) -
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.

-
Aşağıdaki içeriğe sahip
vs-tf-mocka-90-10.yamladlı 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: 10Bu 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 bilgisiversion-canaryolarak ayarlanmışsa bu %10'luk kısım canary sürümüne gider. -
Ağırlıklı yönlendirme kuralını uygulayın:
kubectl apply -n default -f vs-tf-mocka-90-10.yaml -
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'imocka(version: canary)sürümüne ulaşır. Her iki durumda damockbcanary sürümüne yönlendirir. -
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-baseolarak çö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-tagdeğeriversion-baseolarak 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
Yeni sürüme olan güveniniz arttıkça canary ağırlığını kademeli olarak artırın.
Trafik etiketleme yapılandırması hakkında daha fazla ayrıntı için bkz. Trafiği etiketleme.
Yalnızca ağırlık tabanlı yönlendirme içeren tek hizmetli canary sürümleri için bkz. Mavi-yeşil dağıtım modunda ve kademeli yayılma modunda uygulama dağıtma.