Aracılığıyla paylaş


Azure Kubernetes Service için Istio hizmet ağı eklentisi için çıkış ağ geçitlerini dağıtma (Önizleme)

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.

  1. aks-preview komutunu kullanarak az extension add uzantısını yükleyin.

    az extension add --name aks-preview
    
  2. 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 gatewayhavuzu 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.modeALLOW_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.modeREGISTRY_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_NAMESPACEistio.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.modeALLOW_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

  1. ServiceEntry için bir edition.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
  1. Gateway, VirtualService ve DestinationRule oluşturun, böylece curl uygulamasından edition.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 istio 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
  1. curl podundan edition.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.

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

  1. ServiceEntry için bir HTTPS edition.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
  1. Gateway, VirtualService ve DestinationRule oluşturun, böylece curl uygulamasından edition.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çicisini istio 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
  1. HTTPS isteğini curl'dan edition.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.

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

  1. ServiceEntry için bir edition.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
  1. Gateway, VirtualService ve DestinationRule'yi oluşturun, HTTP trafiğini curl uygulamasından edition.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çicisini istio 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
  1. Çıkış ağ geçidinin TLS başlatması yaparak bir istek formu curledition.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.

  1. 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 StaticGatewayConfigurationkullandığı , ad alanını ve gateway düğüm havuzunu, başka bir Istio çıkış ağ geçidi kullanmıyorsa silebilmeniz gerekir.

Sonraki Adımlar

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