Partager via


Entrées externes ou internes Azure Kubernetes Service (AKS) pour le déploiement du module complémentaire de maillage de services Istio

Cet article vous montre comment déployer des entrées externes ou internes pour le module complémentaire de maillage de services Istio pour un cluster Azure Kubernetes Service (AKS).

Remarque

Lors de l’exécution d’une mise à niveau de révision mineure du module complémentaire Istio, un autre déploiement pour les passerelles externes/internes est créé pour la nouvelle révision du plan de contrôle.

Prérequis

Ce guide suppose que vous avez suivi la documentation pour activer le module complémentaire Istio sur un cluster AKS, déployer un exemple d’application et définir les variables d’environnement.

Activer la passerelle d’entrée externe

Utilisez az aks mesh enable-ingress-gateway pour activer une entrée Istio accessible en externe sur votre cluster AKS :

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external

Utilisez kubectl get svc pour vérifier le service mappé à la passerelle d’entrée :

kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress

Observez dans la sortie si l’adresse IP externe du service est accessible publiquement :

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-external   LoadBalancer   10.0.10.249   <EXTERNAL_IP>   15021:30705/TCP,80:32444/TCP,443:31728/TCP   4m21s

Remarque

Les personnalisations de l’adresse IP sur les passerelles internes et externes ne sont pas encore prises en charge. Les personnalisations d’adresses IP sur les spécifications d’entrée sont rétablies par le module complémentaire Istio. Il est prévu d’autoriser ces personnalisations dans l’implémentation de l’API de passerelle pour le module complémentaire Istio.

Par défaut, les applications ne sont pas accessibles depuis l’extérieur du cluster après l’activation de la passerelle d’entrée. Pour rendre une application accessible, mappez l’entrée de l’exemple de déploiement à la passerelle d’entrée Istio en utilisant le manifeste suivant :

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway-external
spec:
  selector:
    istio: aks-istio-ingressgateway-external
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-external
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway-external
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

Notes

Le sélecteur utilisé dans l’objet Passerelle pointe vers istio: aks-istio-ingressgateway-external, qui se trouve en tant qu’étiquette sur le service mappé à l’entrée externe activée précédemment.

Définissez des variables d’environnement pour l’hôte et les ports d’entrée externes :

export INGRESS_HOST_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_EXTERNAL=$INGRESS_HOST_EXTERNAL:$INGRESS_PORT_EXTERNAL

Récupérez l’adresse externe de l’exemple d’application :

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

Accédez à l’URL de la sortie de la commande précédente et vérifiez que la page des produits de l’exemple d’application est affichée. Vous pouvez aussi utiliser curl pour vérifier que l’exemple d’application est accessible. Par exemple :

curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"

Vérifiez que la page des produits de l’exemple d’application est accessible. La sortie attendue est :

<title>Simple Bookstore App</title>

Activer la passerelle d’entrée interne

Utilisez az aks mesh enable-ingress-gateway pour activer une entrée Istio interne sur votre cluster AKS :

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal

Utilisez kubectl get svc pour vérifier le service mappé à la passerelle d’entrée :

kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress

Observez dans la sortie si l’adresse IP externe du service n’est pas une adresse accessible publiquement et qu’elle est accessible seulement localement :

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-internal   LoadBalancer   10.0.182.240  <IP>      15021:30764/TCP,80:32186/TCP,443:31713/TCP   87s

Après avoir activé la passerelle d’entrée, les applications doivent être exposées via la passerelle et les règles de routage doivent être configurées en conséquence. Utilisez le manifeste suivant pour mapper l’entrée de l’exemple de déploiement à la passerelle d’entrée Istio :

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-internal-gateway
spec:
  selector:
    istio: aks-istio-ingressgateway-internal
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-internal
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-internal-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

Notes

Le sélecteur utilisé dans l’objet Passerelle pointe vers istio: aks-istio-ingressgateway-internal, qui se trouve en tant qu’étiquette sur le service mappé à l’entrée interne activée précédemment.

Définissez des variables d’environnement pour l’hôte et les ports d’entrée internes :

export INGRESS_HOST_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_INTERNAL=$INGRESS_HOST_INTERNAL:$INGRESS_PORT_INTERNAL

Récupérez l’adresse de l’exemple d’application :

echo "http://$GATEWAY_URL_INTERNAL/productpage"

Accédez à l’URL de la sortie de la commande précédente et vérifiez que la page des produits de l’exemple d’application n’est PAS affichée. Vous pouvez aussi utiliser curl pour vérifier que l’exemple d’application n’est PAS accessible. Par exemple :

curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"

Utilisez kubectl exec pour vérifier que l’application est accessible à partir du réseau virtuel du cluster :

kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS  "http://$GATEWAY_URL_INTERNAL/productpage"  | grep -o "<title>.*</title>"

Vérifiez que la page des produits de l’exemple d’application est accessible. La sortie attendue est :

<title>Simple Bookstore App</title>

Personnalisation des annotations du service de passerelle d’entrée

Les annotations suivantes peuvent être ajoutées au service Kubernetes pour les passerelles d’entrée externes et internes :

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet : pour lier une passerelle d’entrée interne à un sous-réseau spécifique.
  • service.beta.kubernetes.io/azure-shared-securityrule : pour exposer la passerelle d’entrée via une règle de sécurité augmentée.
  • service.beta.kubernetes.io/azure-allowed-service-tags : pour spécifier quelles étiquettes de service la passerelle d’entrée peuvent recevoir des demandes.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4 : pour configurer une adresse IPv4 statique.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group : pour spécifier le groupe de ressources d’une IP publique dans un groupe de ressources différent du cluster.
  • service.beta.kubernetes.io/azure-pip-name : pour spécifier le nom d’une adresse IP publique.

Supprimer des ressources

Si vous souhaitez nettoyer les passerelles d’entrée externes ou internes Istio, mais laissez le maillage activé sur le cluster, exécutez la commande suivante :

az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP}

Si vous voulez nettoyer le maillage de services Istio et les entrées (en conservant le cluster), exécutez la commande suivante :

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Si vous voulez nettoyer toutes les ressources créées à partir des documents sur les procédures Istio, exécutez la commande suivante :

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

Étapes suivantes

Remarque

En cas de problèmes rencontrés lors du déploiement de la passerelle d’entrée Istio ou de la configuration du routage du trafic d’entrée, reportez-vous à l’article sur la résolution des problèmes liés aux passerelles d’entrée du module complémentaire Istio