Installer et mettre à niveau des passerelles

Anthos Service Mesh vous permet de déployer et de gérer des passerelles avec votre maillage de services. Une passerelle décrit un équilibreur de charge fonctionnant à la périphérie du réseau maillé recevant des connexions HTTP/TCP entrantes ou sortantes. Les passerelles sont des proxys Envoy qui vous permettent de contrôler avec précision le trafic entrant et sortant du réseau maillé. Les passerelles sont principalement utilisées pour gérer le trafic entrant, mais vous pouvez également les configurer pour gérer d'autres types de trafic. Exemple :

  • Passerelles de sortie : une passerelle de sortie vous permet de configurer un nœud de sortie dédié au trafic quittant le maillage, ce qui vous permet de limiter les services qui peuvent ou doivent accéder aux réseaux externes ou d'activer le contrôle sécurisé du trafic de sortie à ajouter la sécurité de votre réseau maillé, par exemple.

  • Passerelles est-ouest : proxy pour le trafic est-ouest permettant aux charges de travail de service de communiquer au-delà des limites des clusters dans un réseau maillé principal sur différents réseaux. Par défaut, cette passerelle est publique sur Internet.

Cette page décrit les bonnes pratiques pour déployer et mettre à niveau les proxys de passerelle, ainsi que des exemples de configuration de vos propres proxys de passerelle istio-ingressgateway et istio-egressgateway. Il est possible d'appliquer des configurations telles que la répartition du trafic, les redirections et la logique de nouvelle tentative en appliquant une configuration de passerelle aux proxys de passerelle. Ensuite, au lieu d'ajouter le routage du trafic de couche d'application (L7) à la même ressource API, vous associez un service virtuel à la passerelle. Cela vous permet de gérer le trafic de la passerelle comme n'importe quel autre trafic de plan de données dans le maillage de services.

Vous pouvez déployer les passerelles de différentes manières. Vous pouvez également choisir d'utiliser plusieurs topologies au sein du même cluster. Reportez-vous à la page Topologies de déploiement de passerelle dans la documentation d'Istio pour en savoir plus sur ces topologies.

Bonnes pratiques pour le déploiement de passerelles

  1. Déployer et gérer le plan de contrôle et les passerelles séparément.
  2. Pour respecter nos bonnes pratiques de sécurité, nous vous recommandons de déployer les passerelles dans un espace de noms différent du plan de contrôle.
  3. Injectez de la configuration proxy pour les passerelles à l'aide de l'injection side-car automatique (injection automatique) comme vous l'utilisez pour injecter les proxys side-car pour vos services.

Ces bonnes pratiques :

  • Laissez les administrateurs de vos espaces de noms gérer les passerelles sans avoir à élever les privilèges pour l'ensemble du cluster.
  • Laissez vos administrateurs utiliser les mêmes outils ou mécanismes de déploiement que ceux utilisés pour gérer les applications Kubernetes afin de déployer et de gérer des passerelles.
  • Donne aux administrateurs un contrôle total sur le déploiement de passerelle et simplifie également les opérations. Lorsqu'une nouvelle mise à niveau est disponible ou qu'une configuration est modifiée, les administrateurs mettent à jour les pods de passerelle simplement en les redémarrant. Ainsi, l'opération de déploiement de passerelle est semblable à l'utilisation de proxys side-car pour vos services.

Déployer des passerelles

Pour prendre en charge les utilisateurs avec des outils de déploiement existants, Anthos Service Mesh accepte les mêmes méthodes pour déployer une passerelle que Istio : IstioOperator, Helm et Kubernetes YAML. Chaque méthode produit le même résultat. Bien que vous puissiez choisir la méthode que vous connaissez le mieux, nous vous recommandons d'utiliser la méthode YAML de Kubernetes, car elle est plus facile à modifier et vous pouvez stocker des fichiers manifestes hydratés dans un contrôle de source.

  1. Créez un espace de noms pour la passerelle si vous n'en possédez pas déjà un. Remplacez GATEWAY_NAMESPACE par le nom de votre espace de noms.

    kubectl create namespace GATEWAY_NAMESPACE
    
  2. Vous activez l'injection automatique sur la passerelle en appliquant un étiquette de révision sur l'espace de noms de la passerelle. Le libellé de révision est utilisé par le webhook d'injecteur side-car pour associer les proxys injectés à une révision du plan de contrôle particulière. Le libellé de révision que vous utilisez varie selon que vous avez déployé le plan de contrôle géré par Google ou le plan de contrôle au sein du cluster.

    Gérée par Google

    Pour le plan de contrôle géré par Google, le libellé de révision correspond à un canal de publication :

    Libellé de révision Canal
    istio.io/rev=asm-managed Standard
    istio.io/rev=asm-managed-rapid Version précoce
    istio.io/rev=asm-managed-stable Stable

    L'espace de noms de votre passerelle peut se trouver sur le même canal de publication que vos services ou sur un autre canal de publication. Nous vous recommandons d'utiliser le même canal de publication sur un cluster. Pour connaître le canal de publication utilisé par un espace de noms, procédez comme suit :

    kubectl get namespace NAMESPACE -L istio.io/rev
    

    Dans le cluster

    Pour les plans de contrôle au sein du cluster, le service et le déploiement istiod ont un libellé de révision semblable à istio.io/rev=asm-1106-2, où asm-1106-2 identifie la version d'Anthos Service Mesh. La révision fait partie du nom du service istiod, par exemple, istiod-asm-1106-2.istio-system.

    Utilisez la commande suivante pour localiser le libellé de révision sur istiod pour le plan de contrôle du cluster :

    kubectl get deploy -n istio-system -l app=istiod -o jsonpath="{.items[*].metadata.labels.'istio\.io\/rev'}"'{"\n"}'
    
  3. Activez l'espace de noms pour l'injection : Remplacez REVISION par la valeur du libellé de révision.

    kubectl label namespace GATEWAY_NAMESPACE istio-injection- istio.io/rev=REVISION --overwrite
    

    Vous pouvez ignorer le message "istio-injection not found" dans le résultat. Cela signifie que l'espace de noms ne portait pas précédemment le libellé istio-injection, auquel on s'attend dans de nouvelles installations d'Anthos Service Mesh ou de nouveaux déploiements. Étant donné que l'injection automatique échoue si un espace de noms possède à la fois le istio-injection et le libellé de révision, toutes les commandes kubectl label de la documentation Anthos Service Mesh incluent la suppression du libellé istio-injection.

  4. Si vous avez installé Anthos Service Mesh à l'aide de asmcli, accédez au répertoire que vous avez spécifié dans --output_dir, puis à cd dans le répertoire samples.

    Si vous n'avez pas installé l'outil à l'aide de asmcli, copiez les fichiers de configuration des passerelles à partir du dépôt anthos-service-mesh.

  5. Vous pouvez déployer l'exemple de configuration de passerelle situé dans le répertoire samples/gateways/ ou le modifier si nécessaire.

    Entrée

    kubectl apply -n GATEWAY_NAMESPACE -f gateways/istio-ingressgateway
    

    Sortie

    kubectl apply -n GATEWAY_NAMESPACE -f gateways/istio-egressgateway
    
  6. Après avoir créé le déploiement, vérifiez que les nouveaux services fonctionnent correctement :

    kubectl get pod,service -n GATEWAY_NAMESPACE
    

    Le résultat ressemble à ce qui suit :

    NAME                                      READY   STATUS    RESTARTS   AGE
    pod/istio-ingressgateway-856b7c77-bdb77   1/1     Running   0          3s
    
    NAME                           TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
    service/istio-ingressgateway   LoadBalancer   10.24.5.129    34.82.157.6      80:31904/TCP   3s

Sélecteurs de passerelle

Vous appliquez une configuration Gateway aux proxys istio-ingressgateway et istio-egressgateway pour gérer le trafic entrant et sortant de votre maillage, ce qui vous permet de spécifier quel trafic peut entrer ou quitter le réseau maillé. Les libellés des pods d'un déploiement de passerelle sont utilisés par les ressources de configuration de passerelle. Il est donc important que le sélecteur de passerelle corresponde à ces libellés.

Par exemple, dans les déploiements ci-dessus, le libellé istio=ingressgateway est défini sur les pods de la passerelle. Pour appliquer une configuration de passerelle à ces déploiements, vous devez sélectionner le même libellé :

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: gateway
spec:
  selector:
    istio: ingressgateway
...

Pour obtenir un exemple de configuration de passerelle et de service virtuel, consultez le fichier frontend.yaml dans l'exemple d'application Boutique en ligne.

Mettre à niveau les passerelles

Mises à niveau sur place

Dans la plupart des cas d'utilisation, vous devez mettre à niveau vos passerelles en suivant le modèle de mise à niveau sur place. Comme les passerelles utilisent l'injection de pods, les nouveaux pods de passerelle créés sont automatiquement injectés avec la dernière configuration, qui inclut la version.

Si vous souhaitez modifier la révision du plan de contrôle utilisée par la passerelle, vous pouvez définir le libellé istio.io/rev sur le déploiement de la passerelle, ce qui déclenchera également un redémarrage progressif.

Plan de contrôle géré par Google
Étant donné que Google gère les mises à niveau du plan de contrôle pour le plan de contrôle géré par Google, vous pouvez simplement redémarrer le déploiement de la passerelle pour que les nouveaux pods soient automatiquement injectés avec la dernière configuration et la dernière version.

kubectl rollout restart deployment istio-ingressgateway \
  -n GATEWAY_NAMESPACE

Plan de contrôle dans le cluster
Pour appliquer le même schéma à vos passerelles lorsque vous disposez du plan de contrôle dans le cluster, vous devez modifier la révision du plan de contrôle utilisée par la passerelle. Définissez le libellé istio.io/rev sur le déploiement de passerelle afin de déclencher un redémarrage progressif.

  1. Mettez à jour le libellé de révision sur l'espace de noms ou sur le pod de la passerelle.
    • Si vous avez attribué un libellé à l'espace de noms pour l'injection :
    • Définissez le libellé istio.io/rev sur l'espace de noms sur la nouvelle valeur de révision.
kubectl label namespace GATEWAY_NAMESPACE \
  istio-injection- istio.io/rev=REVISION \
  --overwrite

OU

  • Si vous avez activé l'injection uniquement pour le pod de la passerelle :
    • Définissez le libellé istio.io/rev sur le déploiement sur la nouvelle valeur de révision.
      • Kubernetes YAML
cat <<EOF > gateway-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: istio-ingressgateway
  namespace: GATEWAY_NAMESPACE
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  template:
    metadata:
      annotations:
        # This is required to tell Anthos Service Mesh to inject the gateway with the
        # required configuration.
        inject.istio.io/templates: gateway
      labels:
        istio: ingressgateway
        istio.io/rev: REVISION
    spec:
      containers:
      - name: istio-proxy
        image: auto # The image will automatically update each time the pod starts.
EOF

kubectl apply -f gateway-deployment.yaml

Mises à niveau Canary (avancé)

Si vous utilisez le plan de contrôle au sein du cluster et que vous souhaitez contrôler plus lentement le déploiement d'une nouvelle révision de plan de contrôle, vous pouvez suivre le modèle de mise à niveau Canary. Vous pouvez exécuter plusieurs versions d'un déploiement de passerelle et vous assurer que tout fonctionne comme prévu avec un sous-ensemble de votre trafic. Par exemple, si vous souhaitez déployer une nouvelle révision, Canary, créez une copie du déploiement de votre passerelle en définissant le libellé istio.io/rev=REVISION sur la nouvelle révision et un nouveau nom, par exemple istio-ingressgateway-canary :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: istio-ingressgateway-canary
  namespace: GATEWAY_NAMESPACE
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  template:
    metadata:
      annotations:
        inject.istio.io/templates: gateway
      labels:
        istio: ingressgateway
        istio.io/rev: REVISION # Set to the control plane revision you want to deploy
    spec:
      containers:
      - name: istio-proxy
        image: auto

Lorsque ce déploiement est créé, vous disposez de deux versions de la passerelle, toutes deux sélectionnées par le même service :

kubectl get endpoints -o "custom-columns=NAME:.metadata.name,PODS:.subsets[*].addresses[*].targetRef.name"

NAME                   PODS
istio-ingressgateway   istio-ingressgateway-788854c955-8gv96,istio-ingressgateway-canary-b78944cbd-mq2qf

Si vous êtes certain que vos applications fonctionnent comme prévu, exécutez la commande suivante pour passer à la nouvelle version en supprimant le déploiement avec l'ancien ensemble de libellés istio.io/rev :

kubectl delete deploy/istio-ingressgateway -n GATEWAY_NAMESPACE

Si vous avez rencontré un problème lors du test de votre application avec la nouvelle version de la passerelle, exécutez cette commande pour revenir à l'ancienne version en supprimant le déploiement avec le nouvel ensemble de libellés istio.io/rev :

kubectl delete deploy/istio-ingressgateway-canary -n GATEWAY_NAMESPACE