Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ö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:
İki mevcut AKS kümesi, doğu-batı ağ geçitleri arasında ağ erişilebilirliğine sahip. Bunu Azure sanal ağ (VNet) eşlemesi, sanal ağdan sanal ağa VPN bağlantısı veya desteklenen başka bir bağlantı modeli kullanarak gerçekleştirebilirsiniz.
- Her iki küme de Azure Kubernetes Uygulama Ağınıza üye olarak katılmalıdır.
Istio CLI, istioctl, yüklendi. Doğru istioctl sürümünü seçmek için Uygulama Ağınız için desteklenen Istio sürümüne bakın. Aşağıdaki komutu kullanarak istioctl yükleyebilirsiniz:
curl -sL https://istio.io/downloadIstioctl | sh - export PATH=$HOME/.istioctl/bin:$PATHMakale boyunca kullanmak üzere aşağıdaki ortam değişkenlerini ayarlayın:
export AKS_RG=<resource-group-name> export CLUSTER_NAME_1=<cluster-1-name> export CLUSTER_NAME_2=<cluster-2-name>kubectl'yi şu komutu kullanarak AKS kümelerinize bağlanacak şekilde
az aks get-credentialsyapılandırın:az aks get-credentials --resource-group $AKS_RG --name $CLUSTER_NAME_1 --overwrite-existing az aks get-credentials --resource-group $AKS_RG --name $CLUSTER_NAME_2 --overwrite-existing
Istio ve ztunnel yüklemesini denetleyin
komutunu kullanarak
kubectl get crdsIstio 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:11Zkomutunu kullanarak
applink-systemIstio CNI ve ztunnel DaemonSet'inkubectl get daemonsetad 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ı
READYolarak 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.
-
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
productpageAşağıdakikubectl applykomutları 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=productpagereviews-v1Aşağıdakikubectl applykomutları 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=v1detailsAşağıdakikubectl applykomutları 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=detailsAşağıdaki
kubectl applykomutu 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.yamlreviews-v2vereviews-v3hizmetlerini aşağıdakikubectl applykomutları 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)'ratingsAşağıdakikubectl applykomutları 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
Aşağıdaki
kubectl applykomutu 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.yamlAşağıdaki
kubectl get gatewaykomutu kullanarak ağ geçidinin programlandığından emin olun:kubectl --context $CLUSTER_NAME_1 --namespace default get gatewayYaklaşık bir dakika sonra, altında
PROGRAMMEDyerineTruegö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
defaultad alanınıistio.io/dataplane-mode=ambientile 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
Aşağıdaki
waypointkomutları 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ı vedefaultad 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"Her iki kümede
waypointde aşağıdakikubectl get gateway waypointkomutu kullanarak ağ geçitlerinin programlandığından emin olun:kubectl --context $CLUSTER_NAME_1 get gateway waypoint kubectl --context $CLUSTER_NAME_2 get gateway waypointYaklaşık bir dakika sonra, her iki kümede de,
PROGRAMMEDolarak gösterilenTrueşeklinde aşağıdakine benzer bir çıktı görmeniz gerekir.NAME CLASS ADDRESS PROGRAMMED AGE waypoint istio-waypoint 10.1.78.229 True 28sreviews-v1AKS kümesi 1'deki hizmeti vereviews-v2ilereviews-v3AKS kümesi 2'deki hizmetleriistio.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"İki kümede de
istio.io/global="true"ile etiketleyerekwaypointhizmetlerini 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"komutunu kullanarak
istioctl zc serviceher iki kümedeki ztunnel yapılandırmalarından genel hizmetleri doğrulayın. Her iki kümeninreviewsvewaypointhizmetlerini, kendi VIP'leri ile birlikteSERVICE VIPsü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
reviewshem dewaypointhizmetlerinin 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
Aşağıdaki
productpagekomutu kullanarak hizmete yalnızca giriş ağ geçidinden gelen trafiğe izin vermek içinkubectl applybir 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 EOFAş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: 19productpageAş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
Aşağıdaki
productpagekomutu kullanarak curl hizmet hesabındankubectl applyhizmete 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"] EOFL4 yetkilendirme politikasını, aşağıdaki
kubectl applykomutunu kullanarak izin verilen bir ilke olarakwaypointhizmet 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 EOFAşağıdaki
kubectl execkomutunu kullanarakproductpagehizmetine 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 deniedAşağıdaki
kubectl execkomutunu 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 deniedAşağıdaki
kubectl execkomutunu kullanarak curl hizmet hesabındanproductpagehizmetine 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
productpagegösterir:<title>Simple Bookstore App</title>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
productpagehala 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
komutunu kullanarak
kubectl create namespacegiriş ağ geçidi için yeni bir ad alanı oluşturun.kubectl --context $CLUSTER_NAME_1 create namespace applink-ingressKubernetes Gateway API'sini kullanarak bir giriş ağ geçidi oluşturun ve aşağıdaki
kubectl applykomutu 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 EOFAşağıdaki
kubectl get gatewaykomutu kullanarak ağ geçidinin programlandığından emin olun:kubectl --context $CLUSTER_NAME_1 -n applink-ingress get gatewayYaklaşık bir dakika sonra, altında
PROGRAMMEDyerineTruegörünen, aşağıdaki gibi bir çıktı görmelisiniz:NAME CLASS ADDRESS PROGRAMMED AGE applink-ingressgateway istio 20.99.227.197 True 30sAKS 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_URLAKS kümesi OIDC sağlayıcısı tarafından verilen JWT belirteçlerini doğrulamak ve orijinal belirteci
reviewshizmetine iletmek için bir RequestAuthentication politikası uygulayın. JWT belirtecindekisubtalebine göre trafiğireviewshizmetine yönlendirmek amacıyla, aşağıdakikubectl applykomutunu 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 EOFYeni 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
Aşağıdaki
kubectl execkomutu 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 intactAşağıdaki
kubectl execkomutu 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 JSONGeçerli JWT belirtecine sahip isteklerin ağ geçidi tarafından izin verilerek aşağıdaki
reviewskomutu kullanılarakkubectl exechizmetine 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"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
reviewshizmetin iyi durumda olduğunu gösterir:{"status": "Reviews is healthy"}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 belirtecindekisubhak talebi, VirtualService rota eşleştirme koşulunda belirtilen değerle eşleştiğinden, isteğe izin verilmeli vereviewshizmetine 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
reviewshizmetine 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-localhizmet yalnızcareviews-v1podları seçer vereviews-remotehizmet kasıtlı olarak yerel pod seçmez. -
AKS kümesi 2: Hizmet
reviews-localkasıtlı olarak yerel pod seçmez vereviews-remotehizmeti hemreviews-v2hem dereviews-v3podlarını seçer.
Bu bölümde, aks kümesi 1 perspektifinden yerel ve uzak terimleri tanımlanmıştır.
AKS kümesi 1'de
reviews-localvereviews-remotehizmetlerini uygun seçicilerle ayarlamak içinkubectl applykomutunu 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 EOFkomutunu kullanarak
reviews-localvereviews-remotehizmetlerini uygun seçicilerle ayarlamakkubectl applyiç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 EOFAşağıdaki
reviewskomutu kullanarak hizmetin20/80trafiğinikubectl applyyerel 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 EOFAş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: closeyalnı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 nedenlecluster-2'a gönderilen istekler tek bir işlemde,reviews-v2veyareviews-v3sabitlenmiş olarak kalabilir.cluster-2'in yerinecluster-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
Aşağıdaki
kubectl applykomutunu kullanarak, AKS kümesi 1'dekiproductpagevedetailshizmetleri 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 EOFAKS kümesi 2'deki
ratingshizmeti için bir sanal hizmet ayarlamak üzere aşağıdakikubectl applykomutunu 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** AKS kümesi 2'yi, yalnızca aşağıdaki
kubectl applykomutu kullanarakreviews-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 EOFAKS kümesi 1 için sanal hizmeti, aşağıdaki
kubectl applykomutunu kullanarak kullanıcıjason'ün isteklerinireviews-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
Aşağıdaki
jasonkomutu kullanarak AKS kümesi 2'deki hizmete kullanıcıratingskubectl applyiç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 EOFBu gecikmenin etkisini görmek için bir tarayıcı açın ve adresine
http://$BOOK_INFO_GTW_IP/productpagegidin. Başlangıçta, tüm trafikreviews-v1adresine gittiği için "Kitap İncelemeleri" bölümünün altında herhangi bir derecelendirme yıldızı görmemeniz gerekir.Kullanıcı adı
jasonve istediğiniz parolayı kullanarak oturum açın.
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.
Kullanıcıda
jasonoturum 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-v2derecelendirmeleri getirirken,ratings-v1'den gelen gecikmeyi aşan 10 saniyelik bir zaman aşımına sahiptir, bu nedenle derecelendirmelerin yüklenmesini bekleyebilir. -
productpage-v1iki yeniden deneme ile üç saniyelik zaman aşımına sahiptir ve bu da altı saniyelik zaman aşımına eşittir. -
reviews-v2hâlâ derecelendirmelerden yanıt beklerken,productpage-v1zaman 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.
AKS kümesi 2'de
reviews-remotegüncellemesi yaparak yalnızca aşağıdakikubectl applykomutunu kullanarakreviews-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 EOFGü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-v3onları getiremeyince iki buçuk saniye sonra vazgeçiyor.
Şimdi "Derecelendirmeler" bölümünü geri getirelim. Aşağıdaki
ratings-v1komutu kullanarak gecikmekubectl applysü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 EOFDerecelendirme 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.
HTTP kesmeyi enjekte et
AKS kümesi 2'de aşağıdaki
reviews-remotekomutunu kullanarakreviews-v2yeniden seçilmesini sağlayınkubectl 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 EOFAşağıdaki
reviews-remotekomutu kullanarak AKS kümesi 1'den gelen tüm isteklerinkubectl 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 EOFAKS kümesi 2'deki
ratingshizmetine, kullanıcıjasoniçin aşağıdakikubectl applykomutunu 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 EOFOturum açıp açmamanıza bakılmaksızın, tüm hizmet istekleri
ratings503 döndüreceğinden derecelendirme yıldızları görüntülenemez:
İlgili içerik
Azure Kubernetes Uygulama Ağı hakkında daha fazla bilgi edinmek için aşağıdaki makalelere bakın: