Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:ASM ile TCP trafiğini geçirin

Son Güncelleme:Oct 12, 2026

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ı

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 telnet istemcisi ve Docker kullanıma hazırdır. 4. Adımda telnet kullanarak tcp-echo hizmetine bir TCP bağlantısı açılır; 5. Adımda ise docker run komutuyla 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.

  1. tcp-echo uygulamasının iki sürümünü dağıtın.

    1. ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters öğesini tıklayın.

    2. Clusters sayfasında kümenizin adını tıklayın. Sol gezinme bölmesinde Workloads > Deployments seçeneğini tıklayın.

    3. 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.

    4. 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.

      YAML dosyasını göster

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo-v1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v1
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v1
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.1
              imagePullPolicy: IfNotPresent
              args: [ "9000", "one" ]
              ports:
              - containerPort: 9000
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo-v2
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v2
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v2
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.1
              imagePullPolicy: IfNotPresent
              args: [ "9000", "two" ]
              ports:
              - containerPort: 9000

      Yeni oluşturulan tcp-echo uygulamasının iki sürümü de Deployments sayfasında görüntülenir.

  2. tcp-echo uygulamasını dışarıya açmak için bir Hizmet oluşturun.

    1. ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters öğesini tıklayın.

    2. Clusters sayfasında kümenizin adını tıklayın. Sol gezinme bölmesinde Network > Services seçeneğini tıklayın.

    3. 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.

    4. 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.

      Not

      Headless 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.

      Not

      Hizmet, ilişkili Dağıtım'ın seçici olarak app etiketini kullanır; bu da Kubernetes Hizmeti'nin trafiği hangi Dağıtım'a yönlendireceğini belirler. tcp-echo-v1 ve tcp-echo-v2 Dağıtımları aynı app:tcp-echo etiketini paylaştığından Hizmet trafiği her iki Dağıtım'a da yönlendirebilir.

      External Traffic Policy

      Local ve Cluster seçenekleri desteklenir.

      Not

      External 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 annotation ekleyin. Örneğin, service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20 ifadesi 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.

  1. ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneğini seçin.

  2. 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.

  3. Gateway oluşturun.

    1. ASM örneğinin ayrıntılar sayfasında sol gezinme bölmesinden ASM Gateways > Gateway seçeneğini seçin. Görüntülenen sayfada Create from YAML düğmesini tıklayın.

    2. 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:
          - "*"
  4. VirtualService oluşturun.

    1. ASM örneğinin ayrıntılar sayfasında sol gezinme bölmesinden Traffic Management Center > VirtualService seçeneğini seçin. Görüntülenen sayfada Create from YAML düğmesini tıklayın.

    2. 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
  5. DestinationRule oluşturun.

    1. ASM örneğinin ayrıntılar sayfasında sol gezinme bölmesinden Traffic Management Center > DestinationRule seçeneğini seçin. Görüntülenen sayfada Create from YAML düğmesini tıklayın.

    2. 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

Önemli

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.

  1. ASM konsolu üzerinde oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneğini seçin.

  2. Mesh Management sayfasında ASM örneğinin adını tıklayın. Sol gezinme bölmesinde ASM Gateways > Ingress Gateway seçeneğini seçin.

  3. 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 Mapping

    Add 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.

  1. 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}')
  2. tcp-echo hizmetine bir bağlantı isteği göndermek için telnet komutunu çalıştırın.

    telnet $INGRESS_HOST $INGRESS_PORT
    Trying xxx.xxx.xxx.xxx...
    Connected to xxx.xxx.xxx.xxx.
    Escape character is '^]'
  3. Herhangi bir dize girin ve Enter tuşuna basın.

    Dönen dizenin başında one ifadesi yer alır; bu durum tcp-echo hizmetinin dağıtıldığını ve tüm trafiğin tcp-echo-v1 sü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.

Not

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.

  1. ASM örneğinin VirtualService yapılandırmasını değiştirin.

    1. ASM örneğinin ayrıntılar sayfasında sol gezinme bölmesinden Traffic Management Center > VirtualService seçeneğini seçin.

    2. VirtualService sayfasında tcp-echo hizmetini bulun ve Actions sütunundaki YAML öğesini tıklayın.

    3. 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
  2. tcp-echo hizmetine 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"; \
    done
    one 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-v2 sürümüne yönlendirildiğini gösterir.