Partager via


Déployer des passerelles de sortie pour le module complémentaire Istio Service Mesh pour Azure Kubernetes Service (préversion)

Cet article explique comment déployer des passerelles de sortie pour le module complémentaire Istio Service Mesh pour le cluster AKS (Azure Kubernetes Service).

Aperçu

La passerelle de sortie Istio peut servir de point centralisé pour surveiller et restreindre le trafic sortant à partir d’applications dans le maillage. Avec le module complémentaire Istio, vous pouvez déployer plusieurs passerelles de sortie sur différents espaces de noms, ce qui vous permet de configurer une topologie de passerelle de sortie de votre choix : passerelles de sortie par cluster, par espace de noms, par charge de travail, etc. Bien qu’AKS gère l’approvisionnement et le cycle de vie des passerelles de sortie d’extension Istio, vous devez créer des ressources personnalisées Istio pour acheminer le trafic à partir d’applications dans le maillage via la passerelle de sortie et appliquer des stratégies et des collectes de données de télémétrie.

La passerelle de sortie du module complémentaire Istio s’appuie également sur la fonctionnalité de passerelle de sortie statique , qui affecte un préfixe d’adresse IP source fixe aux pods de sortie Istio. Vous pouvez utiliser cette plage d’adresses IP de sortie prédicable pour les règles de pare-feu et d’autres mécanismes de filtrage du trafic sortant. En utilisant la passerelle de sortie Istio au-dessus de la passerelle de sortie statique, vous pouvez appliquer des stratégies Istio L7, des stratégies basées sur des identités et des restrictions basées sur ip pour le contrôle de trafic de sortie en profondeur de défense. En outre, diriger le trafic sortant par la passerelle de sortie Istio permet à plusieurs charges de travail de faire transiter le trafic via les pools de nœuds de la passerelle de sortie statique, sans avoir à modifier directement les pods et déploiements d'application concernés.

Limitations et exigences

  • Vous pouvez activer un maximum de passerelles de 500 sortie de module complémentaire Istio par cluster.
  • Les noms de passerelle de sortie du module complémentaire Istio doivent être uniques selon l’espace de noms.
  • Les noms de passerelle de sortie du module complémentaire Istio doivent avoir entre 1-53 caractères, ne doivent se composer que de caractères alphanumériques minuscules, « - » et « . », et doivent commencer et se terminer par des caractères alphanumériques. Les noms doivent également être un nom DNS (Domain Name System) valide. L’expression régulière utilisée pour la validation des noms est ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$.
  • L’API de passerelle n’est actuellement pas prise en charge pour la passerelle de sortie du module complémentaire Istio.
  • Étant donné que la passerelle de sortie statique n’est actuellement pas prise en charge sur les clusters du sous-réseau de Pods Azure CNI, la passerelle de sortie du module complémentaire Istio n’est pas non plus prise en charge sur les clusters du sous-réseau de Pods.

Conditions préalables

Activer le module complémentaire Istio

Ce guide suppose que vous avez suivi la documentation pour activer le module complémentaire Istio sur un cluster AKS.

Installer l’extension Azure CLI aks-preview

Installez l’extension aks-preview si vous utilisez Azure CLI. Vous devez utiliser la version aks-preview de 14.0.0b2 ou une version ultérieure.

  1. Installez l'extension aks-preview à l'aide de la commande az extension add.

    az extension add --name aks-preview
    
  2. Mettez à jour vers la dernière version de l’extension à l’aide de la commande az extension update.

    az extension update --name aks-preview
    

Activer et configurer la passerelle de sortie statique

Suivez les instructions de la documentation de la passerelle de sortie statique pour activer la passerelle de sortie statique sur votre cluster, créer un pool de nœuds de mode gatewayet créer une StaticGatewayConfiguration ressource.

Activer une passerelle de sortie Istio

Remarque

Les pods de la passerelle de sortie du module complémentaire Istio ne sont pas planifiés sur le pool de nœuds gateway. Le pool de nœuds gateway est utilisé uniquement pour router le trafic de sortie et n’est pas destiné aux charges de travail à usage général. Si vous avez besoin que les pods de passerelle de sortie soient planifiés sur des nœuds particuliers, vous pouvez utiliser des nœuds système AKS ou l’étiquette de nœud azureservicemesh/istio.replica.preferred. Les pods ont des affinités de nœud avec une préférence pondérée pour 100 les nœuds système AKS (étiquetés kubernetes.azure.com/mode: system) et une préférence pondérée pour 50 les nœuds étiquetés azureservicemesh/istio.replica.preferred: true.

Utilisez az aks mesh enable-egress-gateway pour configurer une passerelle de sortie Istio sur votre cluster AKS. Vous devez spécifier un nom pour la passerelle de sortie Istio et le nom de celui StaticGatewayConfiguration que vous avez créé à l’étape des prérequis . Vous pouvez également spécifier un espace de noms dans lequel déployer la passerelle de sortie Istio, qui doit être le même espace de noms que celui dans lequel il StaticGatewayConfiguration a été créé. Si vous ne spécifiez pas d’espace de noms, la passerelle de sortie est provisionnée dans l’espace aks-istio-egress de noms.

En tant que bonne pratique, vous devriez attendre que le StaticGatewayConfiguration ait reçu un egressIpPrefix avant d'activer la passerelle de sortie Istio en utilisant la configuration de cette passerelle.

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

Vérifiez que le service est créé pour la passerelle de sortie.

kubectl get svc $ISTIO_EGRESS_NAME -n $ISTIO_EGRESS_NAMESPACE

Vous devriez voir un service ClusterIP associé à la passerelle de sortie :

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

Vous pouvez également vérifier qu’un déploiement est créé pour la passerelle de sortie Istio et que les pods de passerelle de sortie ont l’annotation kubernetes.azure.com/static-gateway-configuration définie sur gatewayConfigurationName.

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"}

Vous pouvez réexécuter la az aks mesh enable-egress-gateway commande pour créer une autre passerelle de sortie Istio.

Remarque

Lorsque vous effectuez une mise à niveau mineure de révision du module complémentaire Istio, un autre déploiement pour chaque passerelle de sortie est créé pour la nouvelle révision du plan de contrôle.

Acheminer le trafic via la passerelle de sortie Istio

Définissez outboundTrafficPolicy.mode

Par défaut, Istio outboundTrafficPolicy.mode est défini sur ALLOW_ANY, ce qui signifie qu'Envoy transmet les demandes de services inconnus. En guise de meilleure pratique de sécurité, vous devez définir l’Istio outboundTrafficPolicy.modeREGISTRY_ONLY pour que le proxy Istio bloque les demandes adressées aux services qui n’ont pas été ajoutés au Registre de services d’Istio. Vous pouvez ajouter des hôtes en dehors du cluster au registre de service d’Istio avec un ServiceEntry.

Vous pouvez configurer outboundTrafficPolicy.mode au niveau du maillage global à l’aide du shared MeshConfig du module complémentaire Istio, ou utiliser la ressource personnalisée Sidecar pour cibler des espaces de noms ou des charges de travail spécifiques.

apiVersion: v1
kind: ConfigMap
metadata:
  name: istio-shared-configmap-asm-1-24
  namespace: aks-istio-system
data:
  mesh: |-
    outboundTrafficPolicy:
      mode: REGISTRY_ONLY

Déployer un exemple d’application

Dans cet exemple, nous déployons l’application curl dans le même espace de noms que la passerelle de sortie du module complémentaire Istio. N’oubliez pas de marquerISTIO_EGRESS_NAMESPACE avec l’étiquette istio.io/rev afin que le pod d’application déployé soit injecté avec un sidecar :

kubectl label namespace $ISTIO_EGRESS_NAMESPACE istio.io/rev=$ASM_REVISION

Ensuite, déployez l’exemple d’application :

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/curl/curl.yaml -n $ISTIO_EGRESS_NAMESPACE

Vous devriez voir le pod curl s’exécuter avec un conteneur sidecar injecté :

NAME                                       READY   STATUS    RESTARTS   AGE
curl-5b549b49b8-bcgts                      2/2     Running   0          13s

Essayez d’envoyer curl une demande directement à edition.cnn.com:

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

Si vous définissez outboundTrafficPolicy.mode sur REGISTRY_ONLY, alors la requête curl doit échouer, car vous n’avez pas créé de ServiceEntry pour edition.cnn.com. Si outboundTrafficPolicy.mode est ALLOW_ANY, alors la demande doit réussir.

Pour effectivement router les requêtes vers edition.cnn.com depuis le pod curl vers la passerelle de sortie du module complémentaire Istio, vous devez créer une ServiceEntry et configurer d’autres ressources personnalisées Istio. Suivez les instructions de l’une des sections suivantes pour configurer une passerelle de sortie HTTP, une passerelle de sortie HTTPS ou une passerelle de sortie qui provient d’une connexion TLS (Transport Layer Security).

Avant de démarrer l’un des scénarios suivants, définissez ces variables d’environnement :

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})

Vous pouvez également activer la journalisation de l’accès Envoy via l’API MeshConfig ou Telemetry. Une fois que vous avez activé la journalisation des accès, vous pouvez vérifier que le trafic transite par la passerelle de sortie en inspectant les journaux de istio-proxy conteneur :

kubectl logs -l istio=$EGRESS_GTW_SELECTOR -n $ISTIO_EGRESS_NAMESPACE

Configurer une passerelle de sortie HTTP Istio

  1. Créez un ServiceEntry pour edition.cnn.com:
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. Créez les Gateway, VirtualService et DestinationRule pour acheminer le trafic HTTP de l'application curl vers edition.cnn.com via la passerelle de sortie. Assurez-vous de configurer le sélecteur de passerelle et le nom de domaine complet (FQDN) du service conformément au sélecteur d’étiquette istio dans le déploiement de la passerelle de sortie.
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. Essayez d’envoyer une requête HTTP du curl pod à edition.cnn.com:
kubectl exec -n $ISTIO_EGRESS_NAMESPACE "$SOURCE_POD" -c curl -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics

Vous devriez voir apparaître une réponse HTTP/2 200.

  1. Nettoyer les ressources
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

Configurer une passerelle de sortie HTTPS Istio

  1. Créez un protocole HTTPS ServiceEntry pour edition.cnn.com:
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. Créez les Gateway, VirtualService et DestinationRule pour acheminer le trafic HTTP de l'application curl vers edition.cnn.com via la passerelle de sortie. Assurez-vous de configurer le sélecteur de passerelle et le FQDN du service conformément au sélecteur d’étiquette istio dans le déploiement de la passerelle de sortie.
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. Essayez d’envoyer une requête HTTPS à partir de curl vers edition.cnn.com :
kubectl exec "$SOURCE_POD" -n $ISTIO_EGRESS_NAMESPACE -c curl -- curl -sSL -o /dev/null -D - https://edition.cnn.com/politics

Vous devriez voir apparaître une réponse HTTP/2 200.

  1. Nettoyer les ressources
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

Configurer une passerelle de sortie Istio pour l'initiation TLS

  1. Créez un ServiceEntry pour edition.cnn.com:
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. Créez le Gateway, VirtualService, et DestinationRule pour router le trafic HTTP de l'application curl vers edition.cnn.com par la passerelle de sortie, et effectuer la création de la connexion TLS à la passerelle de sortie. Assurez-vous de configurer le sélecteur de passerelle et le FQDN du service conformément au sélecteur d’étiquette istio dans le déploiement de la passerelle de sortie.
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. Essayez d’envoyer un formulaire curl de demande à edition.cnn.com à l’aide de la passerelle de sortie effectuant une origination TLS ;
kubectl exec "${SOURCE_POD}" -n $ISTIO_EGRESS_NAMESPACE -c curl -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics

Vous devriez voir une réponse d’état 200.

  1. Nettoyer les ressources
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

Désactiver la passerelle de sortie Istio

Exécutez la az aks mesh disable-egress-gateway commande pour désactiver la passerelle de sortie du module complémentaire Istio que vous avez créée :

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

Une fois que vous avez désactivé la passerelle de sortie Istio, vous devriez être en mesure de supprimer le StaticGatewayConfiguration, l'espace de noms, et le gateway pool de nœuds que la passerelle de sortie Istio utilisait, si aucune autre passerelle de sortie Istio ne les utilise.

Étapes suivantes

Remarque

S’il existe des problèmes rencontrés lors du déploiement de la passerelle de sortie Istio ou de la configuration du routage du trafic de sortie, reportez-vous à l’article sur la résolution des problèmes liés aux passerelles de sortie d’extension Istio