Révisions du plan de contrôle Anthos Service Mesh

Cette page décrit le fonctionnement des révisions du plan de contrôle et leur utilisation pour les mises à niveau et les rollbacks sécurisés du maillage de services. Jusqu'à la version 1.6.8, le processus d'installation par défaut d'Anthos Service Mesh n'utilisait pas de révisions de plan de contrôle. L'introduction des révisions peut nécessiter des efforts et des modifications de vos procédures d'installation, mais nous vous recommandons vivement de les utiliser, car elles offrent des avantages considérables.

Principes de base du maillage de services

L'installation d'Anthos Service Mesh comprend deux parties principales : tout d'abord, vous utilisez l'outil de ligne de commande istioctl ou le script install_asm pour installer un plan de contrôle intégré au cluster ou configurer le plan de contrôle géré par Google. Le plan de contrôle consiste en un ensemble de services système chargés de gérer la configuration du réseau maillé. Ensuite, vous déployez un proxy side-car spécial dans votre environnement afin d'intercepter les communications réseau vers et depuis chaque charge de travail. Les proxys communiquent avec le plan de contrôle pour obtenir leur configuration, ce qui vous permet de diriger et de contrôler le trafic (trafic du plan de données) autour de votre réseau maillé sans modifier vos charges de travail.

Pour déployer les proxys, vous devez utiliser un processus appelé injection side-car automatique (injection automatique) pour exécuter un proxy en tant que conteneur side-car supplémentaire dans chacun de vos pods de charge de travail. Vous n'avez pas besoin de modifier les fichiers manifestes Kubernetes que vous utilisez pour déployer vos charges de travail, mais vous devez ajouter un libellé à vos espaces de noms et redémarrer les pods.

Avant la mise à niveau vers Anthos Service Mesh 1.6, vous avez installé une nouvelle version du plan de contrôle qui a immédiatement remplacé l'ancienne. Cette procédure, appelée mise à niveau sur place, est risquée, car le rollback peut être difficile en cas d'échec. Pour réinjecter les proxys et faire en sorte qu'ils communiquent avec la nouvelle version du plan de contrôle, vous devez redémarrer toutes les charges de travail dans tous vos espaces de noms. Selon le nombre de charges de travail et d'espaces de noms dans votre maillage, l'ensemble du processus de mise à niveau peut prendre une heure ou plus. Les mises à niveau sur place peuvent entraîner des temps d'arrêt et doivent être planifiées dans des intervalles de maintenance.

Utiliser les révisions pour mettre à jour votre maillage en toute sécurité

La possibilité de contrôler le trafic est l'un des principaux avantages de l'utilisation d'un maillage de services. Par exemple, vous pouvez transférer progressivement le trafic vers une nouvelle version d'une application lorsque vous la déployez pour la première fois en production. Si vous rencontrez des problèmes lors de la mise à niveau, vous pouvez revenir au trafic vers la version d'origine, ce qui offre un moyen simple et à faible risque d'effectuer un rollback. Cette procédure est appelée version Canary et réduit considérablement le risque associé aux nouveaux déploiements.

De même, vous pouvez minimiser le risque associé à la mise à niveau du maillage de services proprement dit. Anthos Service Mesh 1.6 et versions ultérieures sont compatibles avec les mises à niveau Canary à l'aide de révisions du plan de contrôle. Avec une mise à niveau Canary, vous installez un nouveau plan de contrôle et une nouvelle configuration distincts, en parallèle du plan de contrôle existant. Le programme d'installation attribue une chaîne appelée "révision" pour identifier le nouveau plan de contrôle. Dans un premier temps, les proxys sidecar continuent de recevoir la configuration de la version précédente du plan de contrôle. Pour associer progressivement les charges de travail au nouveau plan de contrôle, attribuez à leurs espaces de noms un libellé associé à la nouvelle révision du plan de contrôle. Une fois que vous avez ajouté à l'espace de noms un libellé associé à la nouvelle révision, vous devez redémarrer les pods de charge de travail pour que les nouveaux sidecars soient injectés, ce qui permet aux pods de recevoir leur configuration à partir du nouveau plan de contrôle. En cas de problème, vous pouvez facilement effectuer un rollback en associant les charges de travail au plan de contrôle d'origine.

Comment fonctionne l'injection automatique ?

L'injection automatique utilise une fonctionnalité Kubernetes appelée contrôle d'admission. Un webhook à mutation est enregistré pour surveiller les pods nouvellement créés. Le webhook est configuré avec un sélecteur d'espaces de noms de sorte qu'il ne corresponde qu'aux pods en cours de déploiement dans les espaces de noms portant un libellé particulier. Lorsqu'un pod correspond, le webhook consulte un service d'injection fourni par le plan de contrôle pour obtenir une nouvelle configuration mutée pour le pod, qui contient les conteneurs et les volumes nécessaires à l'exécution du side-car.

Injecteur side-car

  1. La configuration du webhook est créée lors de l'installation. Le webhook est enregistré auprès du serveur d'API Kubernetes.
  2. Le serveur d'API Kubernetes recherche les déploiements de pods dans les espaces de noms qui correspondent au webhook namespaceSelector.
  3. Un espace de noms est étiqueté de manière à être mis en correspondance par namespaceSelector.
  4. Les pods déployés sur l'espace de noms déclenchent le webhook.
  5. Le service inject fourni par le plan de contrôle modifie les spécifications du pod pour injecter le side-car.

Qu'est-ce qu'une révision ?

Le libellé utilisé pour l'injection automatique est semblable à n'importe quel autre libellé Kubernetes défini par l'utilisateur. Un libellé est essentiellement une paire clé-valeur pouvant être utilisée pour illustrer le concept d'ajout de tags. Les libellés sont couramment utilisés pour l'ajout de tags et pour les révisions. Cela inclut par exemple les tags Git, les tags Docker et les révisions Knative.

Jusqu'à Anthos Service Mesh version 1.6.8, la procédure d'installation par défaut comportait une convention faisant appel au libellé istio-injection=enabled pour configurer le sélecteur d'espaces de noms dans le webhook.

Le processus d'installation actuel d'Anthos Service Mesh vous permet d'ajouter un tag au plan de contrôle installé avec une chaîne de révision. Le programme d'installation attribue un libellé de révision à chaque objet du plan de contrôle. La clé dans la paire clé/valeur est istio.io/rev, mais la valeur du libellé de révision diffère pour le plan de contrôle géré par Google et les plans de contrôle au sein du 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, par exemple, istiod-asm-1106-2.istio-system.

  • 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

Pour activer l'injection automatique, vous ajoutez à vos espaces de noms un libellé de révision correspondant au libellé de révision sur le plan de contrôle. Par exemple, un plan de contrôle avec la révision istio.io/rev=asm-1106-2 sélectionne les pods des espaces de noms portant le libellé istio.io/rev=asm-1106-2 et injecte les side-cars.

Processus de mise à niveau Canary

Les libellés de révision permettent d'effectuer des mises à niveau Canary et de faciliter les rollbacks du plan de contrôle au sein du cluster. Le contrôle géré par Google utilise un processus semblable, mais votre cluster est automatiquement mis à niveau vers la dernière version au sein de ce canal.

Mise à niveau Canary

Les étapes suivantes décrivent le déroulement du processus :

  1. Commencez avec une installation Anthos Service Mesh ou une installation Istio Open Source existante. Peu importe si les espaces de noms utilisent un libellé de révision ou le libellé istio-injection=enabled.
  2. Utilisez une chaîne de révision lorsque vous installez la nouvelle version du plan de contrôle. En raison de la chaîne de révision, le nouveau plan de contrôle est installé avec la version existante. La nouvelle installation inclut une nouvelle configuration de webhook avec un namespaceSelector configuré pour surveiller les espaces de noms avec ce libellé de révision spécifique.
  3. Vous migrez les proxys side-car vers le nouveau plan de contrôle en supprimant l'ancien libellé de l'espace de noms, en ajoutant le nouveau libellé de révision, puis en redémarrant les pods. Si vous utilisez des révisions avec Anthos Service Mesh, vous devez cesser d'utiliser le libellé istio-injection=enabled. Un plan de contrôle avec une révision ne sélectionne pas les pods des espaces de noms portant le libellé istio-injection, même s'il existe un libellé de révision. Le webhook du nouveau plan de contrôle injecte les side-cars dans les pods.
  4. Testez soigneusement les charges de travail associées au plan de contrôle mis à niveau, puis continuez à déployer la mise à niveau ou effectuez un rollback vers le plan de contrôle d'origine.

Une fois les pods associés au nouveau plan de contrôle, le plan de contrôle et le webhook existants sont toujours installés. L'ancien webhook n'a aucun effet sur les pods des espaces de noms qui ont été migrés vers le nouveau plan de contrôle. Vous pouvez restaurer les pods d'un espace de noms dans le plan de contrôle d'origine en supprimant le nouveau libellé de révision, en ajoutant le libellé d'origine et en redémarrant les pods. Lorsque vous êtes sûr que la mise à niveau est terminée, vous pouvez supprimer l'ancien plan de contrôle.

Pour connaître les étapes détaillées de la mise à niveau à l'aide de révisions, consultez les guides de mise à niveau.

Gros plan sur une configuration de webhook à mutation

La meilleure façon de comprendre le webhook à mutation pour l'injection automatique de side-car est d'inspecter la configuration vous-même. Exécutez la commande suivante :

kubectl -n istio-system get mutatingwebhookconfiguration -l app=sidecar-injector -o yaml

Une configuration distincte doit s'afficher pour chaque plan de contrôle que vous avez installé. Un sélecteur d'espace de noms pour un plan de contrôle basé sur les révisions ressemble à ceci :

 namespaceSelector:
    matchExpressions:
    - key: istio-injection
      operator: DoesNotExist
    - key: istio.io/rev
      operator: In
      values:
      - asm-173-6

Le sélecteur peut varier en fonction de la version d'Anthos Service Mesh ou d'Istio que vous exécutez. Ce sélecteur fait correspondre les espaces de noms à un libellé de révision spécifique, à condition qu'ils ne possèdent pas également de libellé istio-injection.

Lorsqu'un pod est déployé dans un espace de noms correspondant au sélecteur, sa spécification de pod est envoyée au service d'injecteur pour la mutation. Le service d'injecteur à appeler est spécifié comme suit :

     service:
        name: istiod-asm-173-6
        namespace: istio-system
        path: /inject
        port: 443

Le service est exposé par le plan de contrôle sur le port 443 au chemin d'URL inject.

La section rules indique que le webhook doit s'appliquer à la création de pod :

   rules:
    - apiGroups:
      - ""
      apiVersions:
      - v1
      operations:
      - CREATE
      resources:
      - pods
      scope: '*'

Résumé

Même si passer à l'utilisation de libellés de révision sur vos espaces de noms pour permettre l'injection automatique vous demande un certain temps d'adaptation, les avantages en termes de mises à niveau Canary sécurisées qu'offrent les libellés de révision en valent largement la peine.

Étapes suivantes