Azure Kubernetes Uygulama Ağı için trafik yönetimi kullanım örnekleri (önizleme)

Önemli

AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "mevcut olduğu şekilde" sağlanmakta olup, hizmet seviyesi anlaşmalarına ve sınırlı garantilere dahil edilmemektedir. AKS önizlemeleri, müşteri desteği ekibi tarafından maksimum çaba gösterilerek kısmen ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:

Azure Kubernetes Uygulama Ağı trafik yönetimi, kümeler içinde ve kümeler arasında hizmet-hizmet etkileşimleri üzerinde hassas denetim sağlamak için Istio ortam modunu ve Kubernetes Ağ Geçidi API'sini kullanır. Bu çözüm, aşağıdakiler dahil olmak üzere kapsamlı bir trafik yönetimi özellikleri kümesi sunar:

  • L4/L7 yetkilendirme ilkeleri
  • JWT talep tabanlı yönlendirme
  • Trafik kaydırma
  • Hata enjeksiyonu

Bu makalede, birden çok Azure Kubernetes Service (AKS) kümesinde Azure Kubernetes Application Network kullanarak bu trafik yönetimi kullanım örneklerinin nasıl uygulandığı hakkında adım adım yönergeler sağlanmaktadır.

Önkoşullar

Başlamadan önce aşağıdaki önkoşullara sahip olduğunuzdan emin olun:

Istio ve ztunnel yüklemesini denetleyin

  1. komutunu kullanarak kubectl get crds Istio CRD'lerini denetleyin.

    kubectl --context $CLUSTER_NAME_1 get crds | grep istio
    

    Çıkışınızda Istio ortam modu için aşağıdaki 14 CRD gösterilmelidir:

    authorizationpolicies.security.istio.io                            2026-03-12T18:02:11Z
    destinationrules.networking.istio.io                               2026-03-12T18:02:11Z
    envoyfilters.networking.istio.io                                   2026-03-12T18:02:11Z
    gateways.networking.istio.io                                       2026-03-12T18:02:11Z
    peerauthentications.security.istio.io                              2026-03-12T18:02:11Z
    proxyconfigs.networking.istio.io                                   2026-03-12T18:02:11Z
    requestauthentications.security.istio.io                           2026-03-12T18:02:11Z
    serviceentries.networking.istio.io                                 2026-03-12T18:02:11Z
    sidecars.networking.istio.io                                       2026-03-12T18:02:11Z
    telemetries.telemetry.istio.io                                     2026-03-12T18:02:11Z
    virtualservices.networking.istio.io                                2026-03-12T18:02:11Z
    wasmplugins.extensions.istio.io                                    2026-03-12T18:02:11Z
    workloadentries.networking.istio.io                                2026-03-12T18:02:11Z
    workloadgroups.networking.istio.io                                 2026-03-12T18:02:11Z
    
  2. komutunu kullanarak applink-system Istio CNI ve ztunnel DaemonSet'in kubectl get daemonset ad alanında çalışıp çalışmadığını denetleyin.

    kubectl --context $CLUSTER_NAME_1 --namespace applink-system get daemonset
    

    Çıkışınız, aşağıdaki DaemonSet'leri ve durumundaki tüm podları READY olarak göstermelidir:

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
    istio-cni-node   3         3         3       3            3           kubernetes.io/os=linux   108m
    ztunnel          3         3         3       3            3           kubernetes.io/os=linux   107m
    

Örnek uygulama oluşturma

Uygulama mimarisi

Bu mimari , Bookinfo örnek uygulamasını birden çok AKS kümesinde çalışacak şekilde genişletir.

İki AKS kümesinde çalışan Bookinfo örnek uygulama mimarisini gösteren mimari diyagramının ekran görüntüsü.

  • Küme 1 sunucuları:
    • productpage-v1 (Python)
    • reviews-v1 (Java)
    • details-v1 (Ruby)
  • Küme 2 sunucular:
    • reviews-v2 (Java)
    • reviews-v3 (Java)
    • ratings-v1 (Node.js)

Hizmet productpage istekleri adresine reviews.default.svc.cluster.localgönderir. reviews Hizmet, genel hizmet kapsamına sahip her iki AKS kümesinde de kullanılabildiğinden, istekler kümeler arasında kullanılabilir arka uçlara (reviews-v1, reviews-v2veya reviews-v3) yönlendirilebilir. reviews-v2 ve reviews-v3 hizmetleri, yanıtı productpage'ye döndürmeden önce derecelendirme verilerini almak için ratings hizmetini de çağırırlar.

Bu mimari, dağıtılmış bir uygulamanın birden çok kümeye nasıl yayılıp tutarlı bir hizmet adı ve iletişim deseni kullanmaya devam ederek küme sınırları arasında sorunsuz hizmet etkileşimi sağlayabileceğinizi gösterir.

Uygulama hizmetlerini dağıtma

  1. productpage Aşağıdaki kubectl apply komutları kullanarak hizmetleri AKS kümesi 1'e dağıtın:

    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l app=productpage
    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l account=productpage
    
  2. reviews-v1 Aşağıdaki kubectl apply komutları kullanarak hizmetleri AKS kümesi 1'e dağıtın:

    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l app=reviews,service=reviews
    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l account=reviews
    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l app=reviews,version=v1
    
  3. details Aşağıdaki kubectl apply komutları kullanarak hizmetleri AKS kümesi 1'e dağıtın:

    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l app=details
    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l account=details
    
  4. Aşağıdaki kubectl apply komutu kullanarak curl hizmetini AKS kümesi 1'e dağıtın:

    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/curl/curl.yaml
    
  5. reviews-v2 ve reviews-v3 hizmetlerini aşağıdaki kubectl apply komutları kullanarak AKS kümesi 2'ye dağıtın.

    kubectl --context $CLUSTER_NAME_2 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l app=reviews,service=reviews
    kubectl --context $CLUSTER_NAME_2 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l account=reviews
    kubectl --context $CLUSTER_NAME_2 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l 'app=reviews,version in (v2,v3)'
    
  6. ratings Aşağıdaki kubectl apply komutları kullanarak hizmetleri AKS kümesi 2'ye dağıtın:

    kubectl --context $CLUSTER_NAME_2 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l app=ratings
    kubectl --context $CLUSTER_NAME_2 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/platform/kube/bookinfo.yaml -l account=ratings
    

İngress ağ geçidini dağıtın

  1. Aşağıdaki kubectl apply komutu kullanarak giriş ağ geçidini AKS kümesi 1'e dağıtın:

    kubectl --context $CLUSTER_NAME_1 apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/bookinfo/gateway-api/bookinfo-gateway.yaml
    
  2. Aşağıdaki kubectl get gateway komutu kullanarak ağ geçidinin programlandığından emin olun:

    kubectl --context $CLUSTER_NAME_1 --namespace default get gateway
    

    Yaklaşık bir dakika sonra, altında PROGRAMMED yerine True görünen, aşağıdaki gibi bir çıktı görmelisiniz:

    NAME               CLASS   ADDRESS        PROGRAMMED   AGE
    bookinfo-gateway   istio   20.112.40.27   True         21s
    

Mesh'e uygulama ekleme

  • her iki AKS kümesindeki default ad alanını istio.io/dataplane-mode=ambient ile etiketleyerek uygulamayı mesh’e ekleyin:

    kubectl --context $CLUSTER_NAME_1 label namespace default istio.io/dataplane-mode=ambient
    kubectl --context $CLUSTER_NAME_2 label namespace default istio.io/dataplane-mode=ambient
    

Waypoint'i yükleyin ve hizmetleri küresel olarak işaretleyin

  1. Aşağıdaki waypoint komutları kullanarak her iki kümeye de ağ geçitleri yükleyinistioctl waypoint apply:

    istioctl --context $CLUSTER_NAME_1 waypoint apply --enroll-namespace --wait
    istioctl --context $CLUSTER_NAME_2 waypoint apply --enroll-namespace --wait
    

    Çıkışınız aşağıdakine benzer görünmelidir; bu, waypoint’nin uygulandığını ve default ad alanının her iki kümede de doğru şekilde etiketlendiğini gösterir.

    ✅ waypoint default/waypoint applied
    ✅ namespace default labeled with "istio.io/use-waypoint: waypoint"
    ✅ waypoint default/waypoint applied
    ✅ namespace default labeled with "istio.io/use-waypoint: waypoint"
    
  2. Her iki kümede waypoint de aşağıdaki kubectl get gateway waypoint komutu kullanarak ağ geçitlerinin programlandığından emin olun:

    kubectl --context $CLUSTER_NAME_1 get gateway waypoint
    kubectl --context $CLUSTER_NAME_2 get gateway waypoint
    

    Yaklaşık bir dakika sonra, her iki kümede de, PROGRAMMED olarak gösterilen True şeklinde aşağıdakine benzer bir çıktı görmeniz gerekir.

    NAME       CLASS            ADDRESS       PROGRAMMED   AGE
    waypoint   istio-waypoint   10.1.78.229   True         28s
    
  3. reviews-v1 AKS kümesi 1'deki hizmeti ve reviews-v2 ile reviews-v3 AKS kümesi 2'deki hizmetleri istio.io/global="true" etiketleyerek genel hizmet olarak işaretleyin.

    kubectl --context $CLUSTER_NAME_1 label service reviews istio.io/global="true"
    kubectl --context $CLUSTER_NAME_2 label service reviews istio.io/global="true"
    
  4. İki kümede de istio.io/global="true" ile etiketleyerek waypoint hizmetlerini genel hizmetler olarak işaretleyin.

    kubectl --context $CLUSTER_NAME_1 label service waypoint istio.io/global="true"
    kubectl --context $CLUSTER_NAME_2 label service waypoint istio.io/global="true"
    
  5. komutunu kullanarak istioctl zc service her iki kümedeki ztunnel yapılandırmalarından genel hizmetleri doğrulayın. Her iki kümenin reviews ve waypoint hizmetlerini, kendi VIP'leri ile birlikte SERVICE VIP sütunu altında görmeniz gerekir.

    istioctl --context "$CLUSTER_NAME_1" zc service -n applink-system | awk 'NR==1 || $2=="reviews" || $2=="waypoint"'
    istioctl --context "$CLUSTER_NAME_2" zc service -n applink-system | awk 'NR==1 || $2=="reviews" || $2=="waypoint"'
    

    tr-TR: Çıkışınız her iki kümede de aşağıdakine benzer görünmelidir; bu, hem reviews hem de waypoint hizmetlerinin VIP'leri ile birlikte global hizmetler olarak tanındığını gösterir.

    # Output from cluster 1
    NAMESPACE         SERVICE NAME                 SERVICE VIP              WAYPOINT ENDPOINTS
    default           reviews                      10.1.36.199,10.1.164.195 waypoint 2/2
    default           waypoint                     10.1.78.229,10.1.135.117 None     2/2
    
    # Output from cluster 2
    NAMESPACE         SERVICE NAME                 SERVICE VIP              WAYPOINT ENDPOINTS
    default           reviews                      10.1.36.199,10.1.164.195 waypoint 3/3
    default           waypoint                     10.1.78.229,10.1.135.117 None     2/2
    

Uygulama erişimini doğrulama

Uyarı

Uygulamaya İnternet'ten erişemiyorsanız, kümenizle ilişkili ağ güvenlik grubunun (NSG) giriş ağ geçidine TCP bağlantı noktasında 80 gelen İnternet trafiğine izin verdiğinden emin olun.

  • Aşağıdaki komutları kullanarak giriş ağ geçidi üzerinden uygulamaya erişin:

    export BOOK_INFO_GTW_IP=$(kubectl --context $CLUSTER_NAME_1 -n default get gateway bookinfo-gateway -o jsonpath="{.status.addresses[0].value}")
    echo $BOOK_INFO_GTW_IP
    curl -I http://$BOOK_INFO_GTW_IP/productpage
    

    Çıkışınız aşağıdakine benzer görünmelidir ve uygulamanın ağ geçidi üzerinden erişilebilir olduğunu gösterir:

    20.112.40.27
    HTTP/1.1 200 OK
    server: istio-envoy
    date: Fri, 13 Mar 2026 17:52:13 GMT
    content-type: text/html; charset=utf-8
    content-length: 15070
    vary: Cookie
    x-envoy-upstream-service-time: 571
    

L4/L7 yetkilendirme ilkelerini dağıtma

L4 yetkilendirme ilkesini zorunlu kılma

  1. Aşağıdaki productpage komutu kullanarak hizmete yalnızca giriş ağ geçidinden gelen trafiğe izin vermek için kubectl apply bir L4 yetkilendirme ilkesi uygulayın:

    kubectl --context $CLUSTER_NAME_1 apply -f - <<EOF
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-ztunnel
      namespace: default
    spec:
      selector:
        matchLabels:
          app: productpage
      action: ALLOW
      rules:
      - from:
        - source:
            principals:
            - cluster.local/ns/default/sa/bookinfo-gateway-istio
    EOF
    
  2. Aşağıdaki komutu kullanarak giriş ağ geçidi üzerinden uygulamaya hala erişebildiğinizden emin olun:

    curl -I http://$BOOK_INFO_GTW_IP/productpage
    

    Çıkışınız aşağıdakine benzer görünmelidir ve uygulamanın ağ geçidi üzerinden hala erişilebilir olduğunu gösterir:

    HTTP/1.1 200 OK
    server: istio-envoy
    date: Fri, 13 Mar 2026 18:00:51 GMT
    content-type: text/html; charset=utf-8
    content-length: 15068
    vary: Cookie
    x-envoy-upstream-service-time: 19
    
  3. productpage Aşağıdaki komutu kullanarak curl podundan erişmeye çalışarak hizmete erişimin diğer kaynaklardan engellendiğini doğrulayın:

    kubectl --context $CLUSTER_NAME_1 exec deploy/curl -- curl -s "http://productpage:9080/productpage"
    

    Çıkışınız aşağıdakine benzer görünmelidir ve L4 yetkilendirme ilkesi nedeniyle erişimin reddedildiğini gösterir:

    upstream connect error or disconnect/reset before headers. reset reason: connection termination
    

L7 yetkilendirme ilkesini zorunlu kılma

  1. Aşağıdaki productpage komutu kullanarak curl hizmet hesabından kubectl apply hizmete yalnızca GET isteklerine izin vermek için bir L7 yetkilendirme ilkesi uygulayın:

    kubectl --context $CLUSTER_NAME_1 apply -f - <<EOF
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-waypoint
      namespace: default
    spec:
      targetRefs:
      - kind: Service
        group: ""
        name: productpage
      action: ALLOW
      rules:
      - from:
        - source:
            principals:
            - cluster.local/ns/default/sa/curl
        to:
        - operation:
            methods: ["GET"]
    EOF
    
  2. L4 yetkilendirme politikasını, aşağıdaki kubectl apply komutunu kullanarak izin verilen bir ilke olarak waypoint hizmet hesabını ekleyerek ara noktadan ztunnel'e giden trafiğe izin verecek şekilde güncelleyin.

    kubectl --context $CLUSTER_NAME_1 apply -f - <<EOF
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-ztunnel
      namespace: default
    spec:
      selector:
        matchLabels:
          app: productpage
      action: ALLOW
      rules:
      - from:
        - source:
            principals:
            - cluster.local/ns/default/sa/bookinfo-gateway-istio
            - cluster.local/ns/default/sa/waypoint
    EOF
    
  3. Aşağıdaki kubectl exec komutunu kullanarak productpage hizmetine yönelik işlemlerin curl hizmet hesabı üzerinden engellendiğini doğrulayın:

    kubectl --context $CLUSTER_NAME_1 exec deploy/curl -- curl -s "http://productpage:9080/productpage" -X DELETE
    

    Çıkışınız aşağıdakine benzer görünmelidir ve L7 yetkilendirme ilkesi nedeniyle erişimin reddedildiğini gösterir:

    RBAC: access denied
    
  4. Aşağıdaki kubectl exec komutunu kullanarak, curl dışında kalan hizmet hesaplarının belirtilen hizmete erişiminin engellenmiş olduğunu doğrulayın:

    kubectl --context $CLUSTER_NAME_1 exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage
    

    Çıkışınız aşağıdakine benzer görünmelidir ve L7 yetkilendirme ilkesi nedeniyle erişimin reddedildiğini gösterir:

    RBAC: access denied
    
  5. Aşağıdaki kubectl exec komutunu kullanarak curl hizmet hesabından productpage hizmetine yönelik isteklerin izinli olduğunu doğrulayıp kontrol edin.

    kubectl --context $CLUSTER_NAME_1 exec deploy/curl -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"
    

    Çıktınız aşağıdakine benzer görünmelidir ve GET isteklerine izin verilip erişilebildiğini productpage gösterir:

    <title>Simple Bookstore App</title>
    
  6. productpage'nin hala giriş ağ geçidi aracılığıyla erişilebilir olduğunu doğrulamak için aşağıdaki komutu kullanın:

    curl -I http://$BOOK_INFO_GTW_IP/productpage
    

    Çıkışınız aşağıdakine benzer görünmeli ve productpage hala ağ geçidi üzerinden erişilebilir olmalıdır.

    HTTP/1.1 200 OK
    server: istio-envoy
    date: Fri, 13 Mar 2026 18:07:02 GMT
    content-type: text/html; charset=utf-8
    content-length: 15070
    vary: Cookie
    x-envoy-upstream-service-time: 45
    

JWT onay tabanlı yönlendirmeyi yapın

Giriş ağ geçidi oluşturma ve JWT kimlik doğrulaması ile güvenliğini sağlama

  1. komutunu kullanarak kubectl create namespace giriş ağ geçidi için yeni bir ad alanı oluşturun.

    kubectl --context $CLUSTER_NAME_1 create namespace applink-ingress
    
  2. Kubernetes Gateway API'sini kullanarak bir giriş ağ geçidi oluşturun ve aşağıdaki kubectl apply komutu kullanarak yalnızca aynı ad alanından yollara izin verin:

    kubectl --context $CLUSTER_NAME_1 apply -f - <<EOF
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: applink-ingressgateway
      namespace: applink-ingress
      labels:
        app: applink-ingressgateway
        istio: applink-ingressgateway
    spec:
      gatewayClassName: istio
      listeners:
      - name: http
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: Same
    EOF
    
  3. Aşağıdaki kubectl get gateway komutu kullanarak ağ geçidinin programlandığından emin olun:

    kubectl --context $CLUSTER_NAME_1 -n applink-ingress get gateway
    

    Yaklaşık bir dakika sonra, altında PROGRAMMED yerine True görünen, aşağıdaki gibi bir çıktı görmelisiniz:

    NAME                     CLASS   ADDRESS         PROGRAMMED   AGE
    applink-ingressgateway   istio   20.99.227.197   True         30s
    
  4. AKS kümesinden OIDC veren URL'sini alın ve ortam değişkeni olarak ayarlayın.

    export OIDC_ISSUER_URL=$(az aks show --resource-group $AKS_RG --name $CLUSTER_NAME_1 --query "oidcIssuerProfile.issuerUrl" -o tsv)
    echo $OIDC_ISSUER_URL
    
  5. AKS kümesi OIDC sağlayıcısı tarafından verilen JWT belirteçlerini doğrulamak ve orijinal belirteci reviews hizmetine iletmek için bir RequestAuthentication politikası uygulayın. JWT belirtecindeki sub talebine göre trafiği reviews hizmetine yönlendirmek amacıyla, aşağıdaki kubectl apply komutunu kullanarak bir VirtualService oluşturun.

    envsubst <<EOF | kubectl --context $CLUSTER_NAME_1 apply -f -
    apiVersion: security.istio.io/v1
    kind: RequestAuthentication
    metadata:
      name: bookinfo-ingress-jwt-istio
      namespace: applink-ingress
    spec:
      selector:
        matchLabels:
          app: applink-ingressgateway
      jwtRules:
      - issuer: "${OIDC_ISSUER_URL}"
        audiences:
        - "${OIDC_ISSUER_URL}"
        jwksUri: "${OIDC_ISSUER_URL}openid/v1/jwks"
        forwardOriginalToken: true
    ---
    apiVersion: networking.istio.io/v1
    kind: Gateway
    metadata:
      name: bookinfo-gateway-istio
      namespace: applink-ingress
    spec:
      selector:
        app: applink-ingressgateway
      servers:
        - hosts:
          - "*"
          port:
            name: http
            number: 80
            protocol: HTTP
    ---
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: bookinfo-vs-istio
      namespace: applink-ingress
    spec:
        hosts:
        - "*"
        gateways:
        - bookinfo-gateway-istio
        http:
        - name: reviews
          match:
          - uri:
              prefix: /
            headers:
              "@request.auth.claims.sub":
                exact: "system:serviceaccount:default:curl"
          route:
          - destination:
              host: reviews.default.svc.cluster.local
              port:
                number: 9080
    EOF
    
  6. Yeni giriş ağ geçidinin IP adresini alın ve bir ortam değişkeni olarak ayarlayın.

    export NO_REV_GTW_IP=$(kubectl --context $CLUSTER_NAME_1 -n applink-ingress get gateway applink-ingressgateway -o jsonpath="{.status.addresses[0].value}") 
    echo $NO_REV_GTW_IP
    

JWT kimlik doğrulama ve talep tabanlı yönlendirmeyi doğrulama

  1. Aşağıdaki kubectl exec komutu kullanarak JWT belirteci olmayan isteklerin ağ geçidi tarafından reddedildiğini doğrulayın:

    kubectl --context $CLUSTER_NAME_1 exec -it $(kubectl --context $CLUSTER_NAME_1 get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -- curl -v http://$NO_REV_GTW_IP/reviews/1
    

    Çıktınız aşağıdakine benzer görünmelidir ve JWT belirteci eksik olduğundan isteğin 404 Bulunamadı hatasıyla reddedildiğini gösterir:

    *   Trying 20.99.227.197:80...
    * Established connection to 20.99.227.197 (20.99.227.197 port 80) from 10.244.2.0 port 36736 
    * using HTTP/1.x
    > GET /reviews/1 HTTP/1.1
    > Host: 20.99.227.197
    > User-Agent: curl/8.16.0
    > Accept: */*
    > 
    * Request completely sent off
    < HTTP/1.1 404 Not Found
    < date: Fri, 13 Mar 2026 18:30:34 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 20.99.227.197:80 left intact
    
  2. Aşağıdaki kubectl exec komutu kullanarak geçersiz JWT belirteci olan isteklerin ağ geçidi tarafından reddedildiğini doğrulayın:

    kubectl --context $CLUSTER_NAME_1 exec -it $(kubectl --context $CLUSTER_NAME_1 get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -- curl -v -H "Authorization: Bearer 123.456.789" http://$NO_REV_GTW_IP/reviews/1
    

    Çıktınız aşağıdakine benzer görünmelidir ve JWT belirteci geçersiz olduğundan isteğin 401 Yetkisiz hatasıyla reddedildiğini gösterir:

    *   Trying 20.99.227.197:80...
    * Established connection to 20.99.227.197 (20.99.227.197 port 80) from 10.244.2.0 port 33240 
    * using HTTP/1.x
    > GET /reviews/1 HTTP/1.1
    > Host: 20.99.227.197
    > User-Agent: curl/8.16.0
    > Accept: */*
    > Authorization: Bearer 123.456.789
    > 
    * Request completely sent off
    < HTTP/1.1 401 Unauthorized
    < www-authenticate: Bearer realm="http://20.99.227.197/reviews/1", error="invalid_token"
    < content-length: 29
    < content-type: text/plain
    < date: Fri, 13 Mar 2026 18:31:40 GMT
    < server: istio-envoy
    < 
    * Connection #0 to host 20.99.227.197:80 left intact
    Jwt header is an invalid JSON
    
  3. Geçerli JWT belirtecine sahip isteklerin ağ geçidi tarafından izin verilerek aşağıdaki reviews komutu kullanılarak kubectl exec hizmetine yönlendirildiğini doğrulayın. JWT belirteci, AKS kümesi OIDC vereni tarafından verilen ve curl pod'da monte edilen hizmet hesabı belirtecinden alınır.

    kubectl --context $CLUSTER_NAME_1 exec -it $(kubectl --context $CLUSTER_NAME1 get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -- sh -c "export NO_REV_GTW_IP=$NO_REV_GTW_IP; exec sh"
    
  4. Ağ geçidine geçerli JWT belirtecine sahip bir istek göndermek için etkileşimli kabukta aşağıdaki komutu çalıştırın:

    curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" http://$NO_REV_GTW_IP/health; echo
    

    Çıkışınız aşağıdakine benzer görünmelidir ve isteğe izin verildiğini ve reviews hizmetin iyi durumda olduğunu gösterir:

    {"status": "Reviews is healthy"}
    
  5. Hizmete erişmek reviews üzere ağ geçidine geçerli JWT belirtecine sahip bir istek göndermek için etkileşimli kabukta aşağıdaki komutu çalıştırın. JWT belirtecindeki sub hak talebi, VirtualService rota eşleştirme koşulunda belirtilen değerle eşleştiğinden, isteğe izin verilmeli ve reviews hizmetine yönlendirilmelidir.

    curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" http://$NO_REV_GTW_IP/reviews/1; echo
    

    Çıkışınız, isteğe izin verildiğini ve reviews hizmetine yönlendirildiğini gösteren, ürün 1 için incelemeyi döndüren aşağıdakine benzer görünmelidir:

    {"id": "1","podname": "reviews-v1-12ab34c5de-fg6hi","clustername": "null","reviews": [{  "reviewer": "Reviewer1",  "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!"},{  "reviewer": "Reviewer2",  "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."}]}
    

Kümeler arası trafik yönlendirmesi uygulama

İki AKS kümesinde aşağıdaki kurulumu kullanarak kümeler arası trafik kaydırma uygularız:

  • AKS kümesi 1: reviews-local hizmet yalnızca reviews-v1 podları seçer ve reviews-remote hizmet kasıtlı olarak yerel pod seçmez.
  • AKS kümesi 2: Hizmet reviews-local kasıtlı olarak yerel pod seçmez ve reviews-remote hizmeti hem reviews-v2 hem de reviews-v3 podlarını seçer.

Bu bölümde, aks kümesi 1 perspektifinden yerel ve uzak terimleri tanımlanmıştır.

  1. AKS kümesi 1'de reviews-local ve reviews-remote hizmetlerini uygun seçicilerle ayarlamak için kubectl apply komutunu kullanarak aşağıdaki Hizmet kaynaklarını uygulayın.

    kubectl --context $CLUSTER_NAME_1 apply -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-local
      namespace: default
      labels:
        app: reviews
        service: reviews-local
        istio.io/global: "true"
        istio.io/use-waypoint: waypoint
    spec:
      ports:
      - name: http
        port: 9080
        targetPort: 9080
      selector:
        app: reviews
        version: v1
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-remote
      namespace: default
      labels:
        app: reviews
        service: reviews-remote
        istio.io/global: "true"
        istio.io/use-waypoint: waypoint
    spec:
      ports:
      - name: http
        port: 9080
        targetPort: 9080
      selector:
        app: reviews
        version: remote
    EOF
    
  2. komutunu kullanarak reviews-local ve reviews-remote hizmetlerini uygun seçicilerle ayarlamak kubectl apply için AKS kümesi 2'de aşağıdaki Hizmet kaynaklarını uygulayın:

    kubectl --context $CLUSTER_NAME_2 apply -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-local
      namespace: default
      labels:
        app: reviews
        service: reviews-local
        istio.io/global: "true"
        istio.io/use-waypoint: waypoint
    spec:
      ports:
      - name: http
        port: 9080
        targetPort: 9080
      selector:
        app: reviews
        version: local
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-remote
      namespace: default
      labels:
        app: reviews
        service: reviews-remote
        istio.io/global: "true"
        istio.io/use-waypoint: waypoint
    spec:
      ports:
      - name: http
        port: 9080
        targetPort: 9080
      selector:
        app: reviews
    EOF
    
  3. Aşağıdaki reviews komutu kullanarak hizmetin 20/80 trafiğini kubectl apply yerel ve uzak kümeler arasında bölün:

    kubectl --context $CLUSTER_NAME1 apply -f - <<EOF
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: reviews
      namespace: default
    spec:
      hosts:
      - reviews
      http:
      - route:
        - destination:
            host: reviews-local.default.svc.cluster.local
            port:
              number: 9080
          weight: 20
        - destination:
            host: reviews-remote.default.svc.cluster.local
            port:
              number: 9080
          weight: 80
    EOF
    
  4. Aşağıdaki betiği kullanarak ayarları doğrulayın (ağırlıkları değiştirmek ve kendiniz test etmek için çekinmeyin).

    Başlık Connection: close yalnızca istemci tarafı HTTP/1.1 bağlantısını kapatır. Ortam çoklu kümede, doğu-batı ağ geçidi ve yol noktası HBONE bağlantılarını halen yeniden kullanabilir, bu nedenle cluster-2'a gönderilen istekler tek bir işlemde, reviews-v2 veya reviews-v3 sabitlenmiş olarak kalabilir. cluster-2'in yerine cluster-1'i bölme için yetkili doğrulama sinyali olarak kullanın ve yıldız rengini yalnızca açıklayıcı bir ayrıntı olarak değerlendirin.

    results=()
    for i in $(seq 1 20); do
      html=$(curl -sS --http1.1 -H 'Connection: close' http://$BOOK_INFO_GTW_IP/productpage)
      pod=$(printf '%s' "$html" | grep -oE 'reviews-v[0-9]-[a-z0-9-]+' | head -n1)
      if printf '%s' "$pod" | grep -q '^reviews-v1-'; then
        target=cluster-1
      else
        target=cluster-2
      fi
      if printf '%s' "$html" | grep -q 'text-red-500'; then
        star=red
      elif printf '%s' "$html" | grep -q 'text-black-500'; then
        star=black
      else
        star=no-star
      fi
    
      line=$(printf '%02d  %-10s  %-8s  %s' "$i" "$target" "$star" "$pod")
      echo "$line"
      results+=("$target $star")
    done
    
    echo
    echo "Summary:"
    printf '%s\n' "${results[@]}" | sort | uniq -c
    

    Örnek çıkış:

    ...
    
    Summary:
    3 cluster-1 no-star
    17 cluster-2 black
    

Hata enjeksiyonu uygulamak

Sanal hizmetleri ayarlama

Önemli

Bu bölümde, trafik kaydırma bölümünde oluşturulan ve hizmetlerini yeniden kullanacağız.

  1. Aşağıdaki kubectl apply komutunu kullanarak, AKS kümesi 1'deki productpage ve details hizmetleri için sanal hizmetleri ayarlayın.

    kubectl --context $CLUSTER_NAME_1 apply -f - <<EOF
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: productpage
    spec:
      hosts:
      - productpage
      http:
      - route:
        - destination:
            host: productpage
    ---
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: details
    spec:
      hosts:
      - details
      http:
      - route:
        - destination:
            host: details
    EOF
    
  2. AKS kümesi 2'deki ratings hizmeti için bir sanal hizmet ayarlamak üzere aşağıdaki kubectl apply komutunu kullanın:

    kubectl --context $CLUSTER_NAME_2 apply -f - <<EOF
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: ratings
    spec:
      hosts:
      - ratings
      http:
      - route:
        - destination:
            host: ratings
    EOF
    
  3. ** AKS kümesi 2'yi, yalnızca aşağıdaki kubectl apply komutu kullanarak reviews-v2'i seçecek şekilde güncelleştirin:

    kubectl --context $CLUSTER_NAME_2 apply -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-remote
      namespace: default
      labels:
        app: reviews
        service: reviews-remote
        istio.io/global: "true"
        istio.io/use-waypoint: waypoint
    spec:
      ports:
      - name: http
        port: 9080
        targetPort: 9080
      selector:
        app: reviews
        version: v2
    EOF
    
  4. AKS kümesi 1 için sanal hizmeti, aşağıdaki kubectl apply komutunu kullanarak kullanıcı jason'ün isteklerini reviews-remote'e yönlendirecek şekilde değiştirin.

    kubectl --context $CLUSTER_NAME_1 apply -f - <<EOF
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: reviews
      namespace: default
    spec:
      hosts:
      - reviews
      http:
      - match:
        - headers:
            end-user:
              exact: jason
        route:
        - destination:
            host: reviews-remote.default.svc.cluster.local
            port:
              number: 9080
      - route:
        - destination:
            host: reviews-local.default.svc.cluster.local
            port:
              number: 9080
    EOF
    

HTTP gecikmesi ekleme

  1. Aşağıdaki jason komutu kullanarak AKS kümesi 2'deki hizmete kullanıcı ratingskubectl apply için yedi saniyelik bir HTTP gecikmesi ekleyin:

    kubectl --context $CLUSTER_NAME2 apply -f - <<EOF
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: ratings
    spec:
      hosts:
      - ratings
      http:
      - match:
        - headers:
            end-user:
              exact: jason
        fault:
          delay:
            percentage:
              value: 100.0
            fixedDelay: 7s
        route:
        - destination:
            host: ratings
      - route:
        - destination:
            host: ratings
    EOF
    
  2. Bu gecikmenin etkisini görmek için bir tarayıcı açın ve adresine http://$BOOK_INFO_GTW_IP/productpagegidin. Başlangıçta, tüm trafik reviews-v1 adresine gittiği için "Kitap İncelemeleri" bölümünün altında herhangi bir derecelendirme yıldızı görmemeniz gerekir.

  3. Kullanıcı adı jason ve istediğiniz parolayı kullanarak oturum açın.

    Kitap Bilgileri örnek uygulamasının oturum açma sayfasının ekran görüntüsü.

    Web sayfasının çok yavaş olduğunu ve her yenilemenin yaklaşık altı saniye sürdüğüne dikkat etmelisiniz. "Kitap İncelemeleri" bölümünde bir hata gösterilmelidir.

    Kitap incelemelerinin şu anda kullanılamadığını gösteren hata iletisinin ekran görüntüsü.

    Kullanıcıda jason oturum açtıktan sonra trafik düzeni şu şekildedir: [(AKS cluster 1) productpage-v1] --(1)--> [(AKS cluster 2) reviews-v2] --(2)--> [(AKS cluster 2) ratings-v1].

    olarak jasonoturum açtığınızda, bağlantıda yedi saniyelik bir gecikme ekleriz (2):

    • reviews-v2 derecelendirmeleri getirirken, ratings-v1'den gelen gecikmeyi aşan 10 saniyelik bir zaman aşımına sahiptir, bu nedenle derecelendirmelerin yüklenmesini bekleyebilir.
    • productpage-v1 iki yeniden deneme ile üç saniyelik zaman aşımına sahiptir ve bu da altı saniyelik zaman aşımına eşittir.
    • reviews-v2 hâlâ derecelendirmelerden yanıt beklerken, productpage-v1 zaman aşımına uğradı ve web sayfasında bir hata döndürüyor.

HTTP gecikmesi ve zaman aşımını azaltma

Bu bölümde "Kitap İncelemeleri" bölümünü geri getiriyoruz. Web sayfası yükleme süresini azaltmak için, kullanıcının jason trafik düzenini iki buçuk saniyelik zaman aşımına sahip olan adresine yönlendirecek reviews-v3şekilde değiştirebiliriz.

  1. AKS kümesi 2'de reviews-remote güncellemesi yaparak yalnızca aşağıdaki kubectl apply komutunu kullanarak reviews-v3'i seçin.

    kubectl --context $CLUSTER_NAME_2 apply -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-remote
      namespace: default
      labels:
        app: reviews
        service: reviews-remote
        istio.io/global: "true"
        istio.io/use-waypoint: waypoint
    spec:
      ports:
      - name: http
        port: 9080
        targetPort: 9080
      selector:
        app: reviews
        version: v3
    EOF
    

    Güncelleştirilmiş trafik düzeni: [(AKS cluster 1) productpage-v1] --(1)--> [(AKS cluster 2) reviews-v3] --(2)--> [(AKS cluster 2) ratings-v1]

    Şimdi "Kitap İncelemeleri" bölümü gösteriliyor, ancak değerlendirmeler hala eksik çünkü reviews-v3 onları getiremeyince iki buçuk saniye sonra vazgeçiyor.

    Derecelendirmeleri olmayan kitap incelemelerini gösteren ekran görüntüsü.

  2. Şimdi "Derecelendirmeler" bölümünü geri getirelim. Aşağıdaki ratings-v1 komutu kullanarak gecikme kubectl apply süresini bir saniyeye düşürün:

    kubectl --context $CLUSTER_NAME_2 apply -f - <<EOF
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
    name: ratings
    spec:
    hosts:
    - ratings
    http:
    - match:
        - headers:
            end-user:
            exact: jason
        fault:
        delay:
            percentage:
            value: 100.0
            fixedDelay: 1s
        route:
        - destination:
            host: ratings
            subset: v1
    - route:
        - destination:
            host: ratings
            subset: v1
    EOF
    

    Derecelendirme yıldızları artık görünür hale geliyor çünkü derecelendirmelerin yanıt göndermesi bir saniye sürüyor ve bu süre, reviews-v3'nin iki buçuk saniyelik zaman aşımı süresi içinde kalıyor; bu da, ürün sayfasının altı saniyelik zaman aşımı süresi içinde yer alıyor.

    Kitap incelemelerinin ve derecelendirmelerinin yüklendiğini gösteren ekran görüntüsü.

HTTP kesmeyi enjekte et

  1. AKS kümesi 2'de aşağıdaki reviews-remote komutunu kullanarak reviews-v2 yeniden seçilmesini sağlayın kubectl apply:

    kubectl --context $CLUSTER_NAME_2 apply -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews-remote
      namespace: default
      labels:
        app: reviews
        service: reviews-remote
        istio.io/global: "true"
        istio.io/use-waypoint: waypoint
    spec:
      ports:
      - name: http
        port: 9080
        targetPort: 9080
      selector:
        app: reviews
        version: v2
    EOF
    
  2. Aşağıdaki reviews-remote komutu kullanarak AKS kümesi 1'den gelen tüm isteklerin kubectl apply üzerine ulaşmasına izin verin:

    kubectl --context $CLUSTER_NAME_1 apply -f - <<EOF
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
        - reviews
      http:
      - route:
        - destination:
            host: reviews-remote.default.svc.cluster.local
            port:
              number: 9080
    EOF
    
  3. AKS kümesi 2'deki ratings hizmetine, kullanıcı jason için aşağıdaki kubectl apply komutunu kullanarak bir 503 HTTP kesintisi enjekte edin.

    kubectl --context $CLUSTER_NAME_2 apply -f - <<EOF
    apiVersion: networking.istio.io/v1
    kind: VirtualService
    metadata:
      name: ratings
    spec:
      hosts:
      - ratings
      http:
      - fault:
          abort:
            httpStatus: 503
            percentage:
              value: 100
        route:
        - destination:
            host: ratings
    EOF
    

    Oturum açıp açmamanıza bakılmaksızın, tüm hizmet istekleri ratings 503 döndüreceğinden derecelendirme yıldızları görüntülenemez:

    Derecelendirme hizmetine yapılan tüm isteklerin 503 hatasıyla sonuçlanması nedeniyle, kitap derecelendirmeleri görüntülenmiyor ekran görüntüsü.

Azure Kubernetes Uygulama Ağı hakkında daha fazla bilgi edinmek için aşağıdaki makalelere bakın: