Service Mesh (ASM) Trafik Yönetim Merkezi, ağ topolojisini optimize ederken, uygulama sunucularını yatay ölçeklendirirken veya hizmet trafiğini ayarlarken TCP uygulama trafiğinin sorunsuz geçişini sağlar. Bu sayede iş sürekliliği ve yüksek kullanılabilirlik korunur. Bu konuda, bir TCP hizmetinin iki sürümü arasında kademeli trafik kaydırma işlemi Istio TCP-Traffic-Shifting görevi kullanılarak açıklanmaktadır.
Ön koşullar
Cloud hizmetleri ve kaynakları
-
Aşağıdaki Alibaba Cloud hizmetleri etkinleştirilmiştir:
Bir ACK kümesi oluşturulmuştur. Talimatlar için bkz. ACK yönetilen kümesi oluşturma ve ACK özel kümesi oluşturma (Kullanımdan Kaldırıldı).
ACK kümesi bir ASM örneğine eklenmiştir. Talimatlar için bkz. ASM örneği oluşturma ve ASM örneğine küme ekleme.
Yerel istemci araçları
kubectl istemcisi yüklenmiş ve Kubernetes kümesine bağlanmıştır. Talimatlar için bkz. kubeconfig dosyasını alma ve kubectl ile kümeye bağlanma.
Doğrulama işlemini yapacağınız bilgisayarda
telnetistemcisi ve Docker kullanıma hazırdır. 4. Adımdatelnetkullanaraktcp-echohizmetine bir TCP bağlantısı açılır; 5. Adımda isedocker runkomutuyla test istekleri gönderilir.
1. Adım: Örnek uygulamayı dağıtın
Örnek uygulama tcp-echo iki sürümde çalışır: v1 her yanıtın başına one ifadesini ekler, v2 ise her yanıtın başına two ifadesini ekler. Bu ön ek, isteği hangi sürümün karşıladığını gösterir; böylece konunun ilerleyen bölümlerinde trafik dağılımını gözlemleyebilirsiniz.
-
tcp-echouygulamasının iki sürümünü dağıtın.ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters öğesini tıklayın.
Clusters sayfasında kümenizin adını tıklayın. Sol gezinme bölmesinde seçeneğini tıklayın.
Deployments sayfasında sayfanın üst kısmından hedef Namespace değerini seçin ve ardından sağ üst köşedeki Create Resources in YAML düğmesini tıklayın.
-
Sample Template değerini Custom olarak ayarlayın, aşağıdaki YAML içeriğini Template metin kutusuna yapıştırın ve Create düğmesini tıklayın.
Yeni oluşturulan
tcp-echouygulamasının iki sürümü de Deployments sayfasında görüntülenir.
-
tcp-echouygulamasını dışarıya açmak için bir Hizmet oluşturun.ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters öğesini tıklayın.
Clusters sayfasında kümenizin adını tıklayın. Sol gezinme bölmesinde seçeneğini tıklayın.
Services sayfasında sayfanın üst kısmından hedef Namespace değerini seçin ve ardından sağ üst köşedeki Create düğmesini tıklayın.
-
Create Service iletişim kutusunda aşağıdaki tabloda açıklanan parametreleri yapılandırın ve OK düğmesini tıklayın.
Parametre
Açıklama
Service
tcp-echo girin.
Service Type
Hizmet için erişim yöntemini seçin. Desteklenen türler ClusterIP, NodePort ve LoadBalancer'dır.
NotHeadless Service yalnızca Service Type değeri Cluster IP olarak ayarlandığında yapılandırılabilir. Kubernetes uygulamasına bağlanmak yerine diğer hizmet keşif sistemleriyle arayüz oluşturmak için Headless Service kullanın.
Backend
Name değerini app, Value değerini ise tcp-echo olarak ayarlayın.
NotHizmet, ilişkili Dağıtım'ın seçici olarak
appetiketini kullanır; bu da Kubernetes Hizmeti'nin trafiği hangi Dağıtım'a yönlendireceğini belirler.tcp-echo-v1vetcp-echo-v2Dağıtımları aynıapp:tcp-echoetiketini paylaştığından Hizmet trafiği her iki Dağıtım'a da yönlendirebilir.External Traffic Policy
Local ve Cluster seçenekleri desteklenir.
NotExternal Traffic Policy yalnızca Hizmet türü Node Port veya Server Load Balancer olduğunda ayarlanabilir.
Port Mapping
Bu konuda Name değerini tcp, Service Port ve Container Port değerlerini 9000, Protocol değerini ise TCP olarak ayarlayın.
Annotations
Yük dengeleme parametrelerini yapılandırmak için Hizmete bir
annotationekleyin. Örneğin,service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20ifadesi Hizmetin en yüksek bant genişliğini 20 Mbit/s olarak ayarlar ve böylece Hizmet trafiği kontrol edilir. Parametreler hakkında daha fazla bilgi için bkz. Ek açıklamalar kullanarak Classic Load Balancer (CLB) örneğini yapılandırma.Label
Hizmeti tanımlamak için bir etiket ekleyin.
Hizmeti oluşturduktan sonra yeni tcp-echo Hizmeti Services sayfasında görünür.
2. Adım: Yönlendirme kurallarını yapılandırın
Service Mesh içinde bir Istio Gateway, VirtualService ve DestinationRule yapılandırarak tüm trafiği tcp-echo hizmetinin v1 sürümüne yönlendirin. Gateway 31400 numaralı bağlantı noktasını dinler; bu nedenle dış trafik ancak 3. Adımda giriş ağ geçidi hizmetine 31400 numaralı bağlantı noktasını ekledikten sonra bu kurallara ulaşır.
ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde seçeneğini seçin.
Mesh Management sayfasında yapılandırmak istediğiniz ASM örneğini bulun. ASM örneğinin adını tıklayın veya Actions sütunundaki Manage düğmesini tıklayın.
-
Gateway oluşturun.
ASM örneğinin ayrıntılar sayfasında sol gezinme bölmesinden seçeneğini seçin. Görüntülenen sayfada Create from YAML düğmesini tıklayın.
-
Create sayfasında Namespace değerini default olarak ayarlayın, herhangi bir Scenario Template seçin, aşağıdaki YAML içeriğini yapıştırın ve Create düğmesini tıklayın.
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tcp-echo-gateway spec: selector: istio: ingressgateway servers: - port: number: 31400 name: tcp protocol: TCP hosts: - "*"
-
VirtualService oluşturun.
ASM örneğinin ayrıntılar sayfasında sol gezinme bölmesinden seçeneğini seçin. Görüntülenen sayfada Create from YAML düğmesini tıklayın.
-
Create sayfasında Namespace değerini default olarak ayarlayın, herhangi bir Scenario Template seçin, aşağıdaki YAML içeriğini yapıştırın ve Create düğmesini tıklayın.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tcp-echo spec: hosts: - "*" gateways: - tcp-echo-gateway tcp: - match: - port: 31400 route: - destination: host: tcp-echo port: number: 9000 subset: v1
-
DestinationRule oluşturun.
ASM örneğinin ayrıntılar sayfasında sol gezinme bölmesinden seçeneğini seçin. Görüntülenen sayfada Create from YAML düğmesini tıklayın.
-
Create sayfasında Namespace değerini default olarak ayarlayın, herhangi bir Scenario Template seçin, aşağıdaki YAML içeriğini yapıştırın ve Create düğmesini tıklayın.
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: tcp-echo-destination spec: host: tcp-echo subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2
3. Adım: Giriş ağ geçidi dağıtın
Her Kubernetes Hizmeti için ayrı bir CLB örneği ayırın. Birden fazla Kubernetes Hizmeti aynı CLB örneğini paylaşırsa aşağıdaki riskler ve sınırlamalar geçerli olur:
Mevcut bir CLB örneğinin kullanılması, mevcut dinleyicilerin üzerine zorla yazılmasına neden olur; bu durum uygulamanıza erişilememesine yol açabilir.
Kubernetes'in bir Hizmet aracılığıyla oluşturduğu CLB örneğini yeniden kullanamazsınız. Yalnızca konsolda manuel olarak veya OpenAPI işlemi çağrılarak oluşturulan CLB örnekleri yeniden kullanılabilir.
Aynı CLB örneğini paylaşan birden fazla Hizmet aynı ön uç dinleyici bağlantı noktasını kullanamaz. Aksi takdirde bağlantı noktası çakışması oluşur.
CLB örneğini yeniden kullanırken Kubernetes, dinleyici adını ve sanal sunucu grubu adını benzersiz tanımlayıcılar olarak kullanır. Bu adları değiştirmeyin.
CLB örneğini kümeler arasında yeniden kullanamazsınız.
ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde seçeneğini seçin.
Mesh Management sayfasında ASM örneğinin adını tıklayın. Sol gezinme bölmesinde seçeneğini seçin.
-
Ingress Gateway sayfasında Create düğmesini tıklayın, yapılandırmayı tamamlayın ve ardından Create düğmesini tıklayın.
Aşağıdaki tabloda bazı yapılandırma öğeleri açıklanmaktadır. Daha fazla bilgi için bkz. Giriş ağ geçidi oluşturma.
Parametre
Açıklama
Cluster
Giriş ağ geçidini dağıtmak istediğiniz kümeyi seçin.
CLB instance type
Bu konuda Access over the Internet seçeneğini belirleyin.
Select CLB Instance
Aşağıdaki seçeneklerden birini seçin. Use Existing CLB Instance: Mevcut CLB örnekleri listesinden bir örnek seçin. Create CLB Instance: Create SLB Instance düğmesini tıklayın ve açılan listeden gerekli CLB teknik özelliklerini seçin.
Port MappingAdd Port düğmesini tıklayın, Name değerini tcp, Service Port değerini ise 31400 olarak ayarlayın.
4. Adım: Dağıtımı doğrulayın
tcp-echo hizmetine yönelik trafiğin beklendiği gibi yönlendirildiğini onaylamak için kubectl kullanın.
-
Hizmetin adresini ve bağlantı noktasını almak için aşağıdaki komutları çalıştırın:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}') -
tcp-echohizmetine bir bağlantı isteği göndermek içintelnetkomutunu çalıştırın.telnet $INGRESS_HOST $INGRESS_PORTTrying xxx.xxx.xxx.xxx... Connected to xxx.xxx.xxx.xxx. Escape character is '^]' -
Herhangi bir dize girin ve Enter tuşuna basın.
Dönen dizenin başında
oneifadesi yer alır; bu durumtcp-echohizmetinin dağıtıldığını ve tüm trafiğintcp-echo-v1sürümüne yönlendirildiğini gösterir.
5. Adım: Trafiği ağırlığa göre v2'ye yönlendirin
Bu adımda trafiğin %20'si tcp-echo-v2 sürümüne, kalan %80'i ise tcp-echo-v1 sürümüne yönlendirilir.
10 istekten oluşan küçük bir örneklemde sonuçlar her zaman 10 istekten 2'sinin tcp-echo-v2 sürümüne yönlendirildiğini göstermeyebilir. Ancak daha uzun bir süre boyunca genel oran %20'ye yaklaşır.
-
ASM örneğinin VirtualService yapılandırmasını değiştirin.
ASM örneğinin ayrıntılar sayfasında sol gezinme bölmesinden seçeneğini seçin.
VirtualService sayfasında
tcp-echohizmetini bulun ve Actions sütunundaki YAML öğesini tıklayın.-
Edit sayfasındaki metin kutusuna aşağıdaki YAML içeriğini girin ve OK düğmesini tıklayın.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tcp-echo spec: hosts: - "*" gateways: - tcp-echo-gateway tcp: - match: - port: 31400 route: - destination: host: tcp-echo port: number: 9000 subset: v1 weight: 80 - destination: host: tcp-echo port: number: 9000 subset: v2 weight: 20
-
tcp-echohizmetine 10 istek göndermek için aşağıdaki komutu çalıştırın:for i in {1..10}; do \ docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \ doneone Mon Nov 12 23:38:45 UTC 2018 two Mon Nov 12 23:38:47 UTC 2018 one Mon Nov 12 23:38:50 UTC 2018 one Mon Nov 12 23:38:52 UTC 2018 one Mon Nov 12 23:38:55 UTC 2018 two Mon Nov 12 23:38:57 UTC 2018 one Mon Nov 12 23:39:00 UTC 2018 one Mon Nov 12 23:39:02 UTC 2018 one Mon Nov 12 23:39:05 UTC 2018 one Mon Nov 12 23:39:07 UTC 2018Çıktı, trafiğin %20'sinin
tcp-echo-v2sürümüne yönlendirildiğini gösterir.