Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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.
Installez l'extension
aks-preview
à l'aide de la commandeaz extension add
.az extension add --name aks-preview
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 gateway
et 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.mode
REGISTRY_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
- Créez un
ServiceEntry
pouredition.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
- Créez les
Gateway
,VirtualService
etDestinationRule
pour acheminer le trafic HTTP de l'applicationcurl
versedition.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’étiquetteistio
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
- 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
.
- 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
- Créez un protocole HTTPS
ServiceEntry
pouredition.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
- Créez les
Gateway
,VirtualService
etDestinationRule
pour acheminer le trafic HTTP de l'applicationcurl
versedition.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’étiquetteistio
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
- Essayez d’envoyer une requête HTTPS à partir de
curl
versedition.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
.
- 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
- Créez un
ServiceEntry
pouredition.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
- Créez le
Gateway
,VirtualService
, etDestinationRule
pour router le trafic HTTP de l'applicationcurl
versedition.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’étiquetteistio
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
- 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
.
- 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
- Déployer des entrées externes ou internes pour le module complémentaire de maillage de services Istio
- Configurer la passerelle de sortie Horizontal Pod Autoscaler (HPA)
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
Azure Kubernetes Service