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.
Bu makalede, Azure Kubernetes Service (AKS) kümesi için Istio hizmet ağı eklentisi için çıkış ağ geçitlerinin nasıl dağıtılacağı gösterilmektedir.
Genel Bakış
Istio çıkış ağ geçidi, ağ içindeki uygulamalardan giden trafiği izlemek ve kısıtlamak için merkezi bir nokta görevi görebilir. Istio eklentisiyle, farklı ad alanlarına birden çok çıkış ağ geçidi dağıtarak istediğiniz çıkış ağ geçidi topolojisini ayarlayabilirsiniz: küme başına çıkış ağ geçitleri, ad alanı başına, iş yükü başına vb. AKS, Istio eklenti çıkış ağ geçitlerinin sağlama ve yaşam döngüsünü yönetirken, mesh'teki uygulamalardan gelen trafiği çıkış ağ geçidi üzerinden yönlendirmek ve ilkeler ile telemetri koleksiyonu uygulamak için Istio özel kaynakları oluşturmanız gerekir.
Istio eklenti çıkış ağ geçidi de üzerinde oluşturulur ve Istio çıkış Podlarına sabit bir kaynak IP adresi ön eki atayan Static Egress Gateway özelliğini gerektirir. Güvenlik duvarı kuralları ve diğer giden trafik filtreleme mekanizmaları için bu önceden dizinlenebilir çıkış IP aralığını kullanabilirsiniz. Statik Çıkış Ağ Geçidi'nin üzerinde Istio çıkış ağ geçidini kullanarak, derinlemesine savunma çıkış trafiği denetimi için Istio L7, kimlik tabanlı ilkeler ve IP tabanlı kısıtlamalar uygulayabilirsiniz. Ayrıca, dışa giden trafiği Istio çıkış ağ geçidi üzerinden yönlendirmek, çeşitli iş yüklerinin uygulama podları/dağıtımlarını doğrudan değiştirmeksizin Statik Çıkış Ağ Geçidi düğüm havuzları aracılığıyla trafiği yönlendirmelerine olanak tanır.
Sınırlamalar ve gereksinimler
- Küme başına en fazla
500
Istio eklenti çıkış ağ geçidini etkinleştirebilirsiniz. - Istio eklenti çıkış ağ geçidi adları ad alanı başına benzersiz olmalıdır.
- Istio eklenti çıkış ağ geçidi adları,
1-53
karakter arasında olmalı, yalnızca küçük harfli alfasayısal karakterlerden, '-' ve '.,' oluşmalıdır ve alfasayısal bir karakterle başlayıp bitmelidir. Adlar da geçerli bir Etki Alanı Adı Sistemi (DNS) adı olmalıdır. Ad doğrulaması için kullanılan regex şudur:^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
. - Ağ geçidi API'si şu anda Istio eklenti çıkış ağ geçidi için desteklenmiyor.
- Statik Çıkış Ağ Geçidi şu anda Azure CNI Pod Alt Ağ kümelerinde desteklenmediğinden, Istio eklenti çıkış ağ geçidi Pod Alt Ağ kümelerinde de desteklenmez.
Önkoşullar
Istio eklentisini etkinleştirme
Bu kılavuzda, BIR AKS kümesinde Istio eklentisini etkinleştirmek için belgeleri izlediğiniz varsayılır.
Azure CLI uzantısını aks-preview
yükleme
Azure CLI kullanıyorsanız uzantıyı aks-preview
yükleyin.
aks-preview
sürüm 14.0.0b2
veya üzerini kullanmanız gerekir.
aks-preview
komutunu kullanarakaz extension add
uzantısını yükleyin.az extension add --name aks-preview
komutunu kullanarak uzantının en son sürümüne güncelleştirin
az extension update
.az extension update --name aks-preview
Statik Çıkış Ağ Geçidini etkinleştirme ve yapılandırma
Kümenizde Statik Çıkış Ağ Geçidi'ni etkinleştirmek, bir düğüm modu gateway
havuzu oluşturmak ve bir StaticGatewayConfiguration
kaynak oluşturmak için Statik Çıkış Ağ Geçidi belgelerindeki yönergeleri izleyin.
Istio çıkış ağ geçidini etkinleştirme
Uyarı
Istio eklenti çıkış ağ geçidi podları gateway
düğüm havuzuna zamanlanmaz. Düğüm gateway
havuzu yalnızca çıkış trafiğini yönlendirmek için kullanılır ve genel amaçlı iş yüklerine hizmet vermez. Çıkış ağ geçidi podlarının belirli düğümlere zamanlanması gerekiyorsa AKS sistem düğümlerini veya azureservicemesh/istio.replica.preferred
düğüm etiketini kullanabilirsiniz. Podlar, AKS sistem düğümleri için 100
ağırlıklı tercihe ve etiketli kubernetes.azure.com/mode: system
düğümler için 50
ağırlıklı tercihe sahip nod bağlantılarına sahiptir.
Istio çıkış ağ geçidini AKS kümesi üzerinde etkinleştirmek için az aks mesh enable-egress-gateway
kullanın. Istio çıkış ağ geçidi için bir ad ve StaticGatewayConfiguration
adımında oluşturduğunuz adı belirtmeniz gerekir. Istio çıkış ağ geçidini dağıtmak için bir ad alanı da belirtebilirsiniz. Bu ad alanı, içinde oluşturulduğu ad alanıyla StaticGatewayConfiguration
aynı olmalıdır. Ad alanı belirtmezseniz, çıkış ağ geçidi aks-istio-egress
ad alanında sağlanır.
Alışkanlık olarak, bu ağ geçidi yapılandırmasını kullanarak Istio çıkış ağ geçidini etkinleştirmeden önce, StaticGatewayConfiguration
'ye bir egressIpPrefix
atanmasını beklemelisiniz.
az aks mesh enable-egress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --istio-egressgateway-name $ISTIO_EGRESS_NAME --istio-egressgateway-namespace $ISTIO_EGRESS_NAMESPACE --gateway-configuration-name $ISTIO_SGC_NAME
Hizmetin çıkış ağ geçidi için oluşturulduğunu doğrulayın.
kubectl get svc $ISTIO_EGRESS_NAME -n $ISTIO_EGRESS_NAMESPACE
Çıkış ağ geçidi için bir ClusterIP
servisi görmelisiniz.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
asm-egress-test ClusterIP 10.0.128.17 <none> 15021/TCP,80/TCP,443/TCP 6d4h
Ayrıca, Istio çıkış ağ geçidi için bir dağıtımın oluşturulduğunu ve çıkış ağ geçidi podlarında kubernetes.azure.com/static-gateway-configuration
açıklamasının gatewayConfigurationName
olarak ayarlandığını doğrulayabilirsiniz.
ASM_REVISION=$(az aks show -g $RESOURCE_GROUP -n $CLUSTER_NAME | jq '.serviceMeshProfile.istio.revisions[0]' | sed 's/"//g')
kubectl get deployment $ISTIO_EGRESS_NAME-$ASM_REVISION -n $ISTIO_EGRESS_NAMESPACE -o jsonpath={.spec.template.metadata.annotations."kubernetes\.azure\.com\/static-gateway-configuration"}
Komutunu yeniden çalıştırarak az aks mesh enable-egress-gateway
başka bir Istio çıkış ağ geçidi oluşturabilirsiniz.
Uyarı
Istio eklentisinin küçük bir düzeltme yükseltmesini gerçekleştirdiğinizde, yeni denetim düzlemi düzeltmesi için her çıkış ağ geçidi için başka bir dağıtım oluşturulur.
Istio çıkış ağ geçidi üzerinden trafiği yönlendirme
Ayarla outboundTrafficPolicy.mode
Varsayılan olarak, Istio outboundTrafficPolicy.mode
ALLOW_ANY
olarak ayarlanmıştır, bu da Envoy'un bilinmeyen hizmetlere yönelik istekleri ilettiği anlamına gelir. En iyi güvenlik uygulaması olarak, Istio vekil sunucunun, Istio'yu outboundTrafficPolicy.mode
REGISTRY_ONLY
olarak ayarlayarak Istio Servis Kaydı'na eklenmemiş hizmetlere yönelik istekleri engellemesi gerekir. Küme dışındaki konakları ServiceEntry
ile Istio'nun hizmet kayıt defterine ekleyebilirsiniz.
Istio eklentisini outboundTrafficPolicy.mode
kullanarak ağ genelinde yapılandırabilir veya belirli ad alanlarını veya iş yüklerini hedeflemek için Sepet Özel Kaynağı'nı kullanabilirsiniz.
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-shared-configmap-asm-1-24
namespace: aks-istio-system
data:
mesh: |-
outboundTrafficPolicy:
mode: REGISTRY_ONLY
Örnek uygulamayı dağıtın
Bu örnekte, uygulamayı Istio eklenti çıkış ağ geçidiyle aynı ad alanında dağıtacağız curl
. Dağıtılan uygulama podunun yanına bir sidecar enjekte edilmesi için ISTIO_EGRESS_NAMESPACE
istio.io/rev
etiketiyle etiketlemeyi unutmayın.
kubectl label namespace $ISTIO_EGRESS_NAMESPACE istio.io/rev=$ASM_REVISION
Ardından örnek uygulamayı dağıtın:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/curl/curl.yaml -n $ISTIO_EGRESS_NAMESPACE
Enjekte edilen sidecar konteyner ile curl
çalışan bir pod görmelisiniz.
NAME READY STATUS RESTARTS AGE
curl-5b549b49b8-bcgts 2/2 Running 0 13s
curl
öğesinden doğrudan edition.cnn.com
öğesine bir istek göndermeyi deneyin.
SOURCE_POD=$(kubectl get pod -n $ISTIO_EGRESS_NAMESPACE -l app=curl -o jsonpath={.items..metadata.name})
kubectl exec -n $ISTIO_EGRESS_NAMESPACE "$SOURCE_POD" -c curl -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics
Eğer outboundTrafficPolicy.mode
'i REGISTRY_ONLY
olarak ayarlarsanız, curl
için bir ServiceEntry
oluşturmadığınızdan edition.cnn.com
isteği başarısız olacaktır. Eğer outboundTrafficPolicy.mode
ALLOW_ANY
ise, isteğin başarılı olması gerekir.
İstekleri edition.cnn.com
poddan curl
Istio eklenti çıkış ağ geçidine yönlendirmek için, bir ServiceEntry
oluşturmanız ve diğer Istio özel kaynaklarını yapılandırmanız gerekir. Sonraki bölümlerden birini izleyerek bir HTTP Çıkış Ağ Geçidi, HTTPS Çıkış Ağ Geçidi veya Taşıma Katmanı Güvenliği (TLS) bağlantısı oluşturan bir Çıkış Ağ Geçidi yapılandırın.
Aşağıdaki senaryolardan herhangi birini başlatmadan önce şu ortam değişkenlerini ayarlayın:
ISTIO_EGRESS_DEPLOYMENT=$ISTIO_EGRESS_NAME-$ASM_REVISION
EGRESS_GTW_SELECTOR=$(kubectl get deployment $ISTIO_EGRESS_DEPLOYMENT -n $ISTIO_EGRESS_NAMESPACE -o jsonpath={.metadata.labels.istio})
Envoy erişim günlüğünüMeshConfig veya Telemetri API'si aracılığıyla da etkinleştirebilirsiniz. Erişim günlüğünü etkinleştirdikten sonra istio-proxy
kapsayıcı günlüklerini inceleyerek trafiğin çıkış ağ geçidi üzerinden aktığını doğrulayabilirsiniz.
kubectl logs -l istio=$EGRESS_GTW_SELECTOR -n $ISTIO_EGRESS_NAMESPACE
HTTP Istio çıkış ağ geçidi yapılandırma
-
ServiceEntry
için biredition.cnn.com
oluşturun:
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: cnn
spec:
hosts:
- edition.cnn.com
ports:
- number: 80
name: http-port
protocol: HTTP
- number: 443
name: https
protocol: HTTPS
resolution: DNS
EOF
-
Gateway
,VirtualService
veDestinationRule
oluşturun, böylececurl
uygulamasındanedition.cnn.com
'e egress ağ geçidi üzerinden HTTP trafiği yönlendirilir. Çıkış ağ geçidi dağıtımındaki etiket seçiciye göreistio
ağ geçidi seçicisini ve tam etki alanı adını (FQDN) ayarladığınızdan emin olun.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: $EGRESS_GTW_SELECTOR
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- edition.cnn.com
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: egressgateway-for-cnn
spec:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subsets:
- name: cnn
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: direct-cnn-through-egress-gateway
spec:
hosts:
- edition.cnn.com
gateways:
- istio-egressgateway
- mesh
http:
- match:
- gateways:
- mesh
port: 80
route:
- destination:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subset: cnn
port:
number: 80
weight: 100
- match:
- gateways:
- istio-egressgateway
port: 80
route:
- destination:
host: edition.cnn.com
port:
number: 80
weight: 100
EOF
-
curl
podundanedition.cnn.com
adresine bir HTTP isteği göndermeyi deneyin.
kubectl exec -n $ISTIO_EGRESS_NAMESPACE "$SOURCE_POD" -c curl -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics
HTTP/2 200
yanıtını görmeniz gerekir.
- Kaynakları temizle
kubectl delete serviceentry cnn -n $ISTIO_EGRESS_NAMESPACE
kubectl delete gateway istio-egressgateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete virtualservice direct-cnn-through-egress-gateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete destinationrule egressgateway-for-cnn -n $ISTIO_EGRESS_NAMESPACE
HTTPS Istio çıkış ağ geçidi yapılandırma
-
ServiceEntry
için bir HTTPSedition.cnn.com
oluşturun.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: cnn
spec:
hosts:
- edition.cnn.com
ports:
- number: 443
name: tls
protocol: TLS
resolution: DNS
EOF
-
Gateway
,VirtualService
veDestinationRule
oluşturun, böylececurl
uygulamasındanedition.cnn.com
'e egress ağ geçidi üzerinden HTTP trafiği yönlendirilir. Çıkış ağ geçidi dağıtımındaki etiket seçiciye göre ağ geçidi seçicisiniistio
ve hizmet FQDN'sini uygun şekilde ayarladığınızdan emin olun.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: $EGRESS_GTW_SELECTOR
servers:
- port:
number: 443
name: tls
protocol: TLS
hosts:
- edition.cnn.com
tls:
mode: PASSTHROUGH
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: egressgateway-for-cnn
spec:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subsets:
- name: cnn
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: direct-cnn-through-egress-gateway
spec:
hosts:
- edition.cnn.com
gateways:
- mesh
- istio-egressgateway
tls:
- match:
- gateways:
- mesh
port: 443
sniHosts:
- edition.cnn.com
route:
- destination:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subset: cnn
port:
number: 443
- match:
- gateways:
- istio-egressgateway
port: 443
sniHosts:
- edition.cnn.com
route:
- destination:
host: edition.cnn.com
port:
number: 443
weight: 100
EOF
- HTTPS isteğini
curl
'danedition.cnn.com
'a göndermeyi deneyin.
kubectl exec "$SOURCE_POD" -n $ISTIO_EGRESS_NAMESPACE -c curl -- curl -sSL -o /dev/null -D - https://edition.cnn.com/politics
HTTP/2 200
yanıtını görmeniz gerekir.
- Kaynakları temizle
kubectl delete serviceentry cnn -n $ISTIO_EGRESS_NAMESPACE
kubectl delete gateway istio-egressgateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete virtualservice direct-cnn-through-egress-gateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete destinationrule egressgateway-for-cnn -n $ISTIO_EGRESS_NAMESPACE
TLS başlatılması gerçekleştirmek için Istio çıkış ağ geçidini yapılandırın.
-
ServiceEntry
için biredition.cnn.com
oluşturun:
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: cnn
spec:
hosts:
- edition.cnn.com
ports:
- number: 80
name: http
protocol: HTTP
- number: 443
name: https
protocol: HTTPS
resolution: DNS
EOF
-
Gateway
,VirtualService
veDestinationRule
'yi oluşturun, HTTP trafiğinicurl
uygulamasındanedition.cnn.com
'e çıkış ağ geçidi üzerinden yönlendirin ve çıkış ağ geçidinde TLS başlatmasını gerçekleştirin. Çıkış ağ geçidi dağıtımındaki etiket seçiciye göre ağ geçidi seçicisiniistio
ve hizmet FQDN'sini uygun şekilde ayarladığınızdan emin olun.
kubectl apply -n $ISTIO_EGRESS_NAMESPACE -f - <<EOF
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: $EGRESS_GTW_SELECTOR
servers:
- port:
number: 80
name: https-port-for-tls-origination
protocol: HTTPS
hosts:
- edition.cnn.com
tls:
mode: ISTIO_MUTUAL
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: egressgateway-for-cnn
spec:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subsets:
- name: cnn
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 80
tls:
mode: ISTIO_MUTUAL
sni: edition.cnn.com
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: direct-cnn-through-egress-gateway
spec:
hosts:
- edition.cnn.com
gateways:
- istio-egressgateway
- mesh
http:
- match:
- gateways:
- mesh
port: 80
route:
- destination:
host: $ISTIO_EGRESS_NAME.$ISTIO_EGRESS_NAMESPACE.svc.cluster.local
subset: cnn
port:
number: 80
weight: 100
- match:
- gateways:
- istio-egressgateway
port: 80
route:
- destination:
host: edition.cnn.com
port:
number: 443
weight: 100
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: originate-tls-for-edition-cnn-com
spec:
host: edition.cnn.com
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 443
tls:
mode: SIMPLE # initiates HTTPS for connections to edition.cnn.com
EOF
- Çıkış ağ geçidinin TLS başlatması yaparak bir istek formu
curl
edition.cnn.com
göndermeyi deneyin.
kubectl exec "${SOURCE_POD}" -n $ISTIO_EGRESS_NAMESPACE -c curl -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics
200
durum yanıtı görmelisiniz.
- Kaynakları temizle
kubectl delete serviceentry cnn -n $ISTIO_EGRESS_NAMESPACE
kubectl delete gateway istio-egressgateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete virtualservice direct-cnn-through-egress-gateway -n $ISTIO_EGRESS_NAMESPACE
kubectl delete destinationrule originate-tls-for-edition-cnn-com -n $ISTIO_EGRESS_NAMESPACE
kubectl delete destinationrule egressgateway-for-cnn -n $ISTIO_EGRESS_NAMESPACE
Istio çıkış ağ geçidini devre dışı bırakma
az aks mesh disable-egress-gateway
Oluşturduğunuz Istio eklenti çıkış ağ geçidini devre dışı bırakmak için komutunu çalıştırın:
az aks mesh disable-egress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --istio-egressgateway-name $ISTIO_EGRESS_NAME --istio-egressgateway-namespace $ISTIO_EGRESS_NAMESPACE
Istio çıkış ağ geçidini devre dışı bırakdığınızda, çıkış ağ geçidinin StaticGatewayConfiguration
kullandığı , ad alanını ve gateway
düğüm havuzunu, başka bir Istio çıkış ağ geçidi kullanmıyorsa silebilmeniz gerekir.
Sonraki Adımlar
- İstio hizmet ağı eklentisi için dış veya iç girişler dağıtın
- Çıkış ağ geçidi Yatay Pod Otomatik Ölçeklendiricisi'ni (HPA) yapılandırma
Uyarı
Istio çıkış ağ geçidini dağıtma veya çıkış trafiği yönlendirmeyi yapılandırma ile ilgili sorunlarla karşılaşıldıysa, Istio eklenti çıkış ağ geçitleriyle ilgili sorun giderme makalesine bakın
Azure Kubernetes Service