Par défaut, Service Mesh (ASM) injecte un conteneur d'initialisation istio-init dans chaque pod afin de configurer les règles iptables pour la redirection du trafic. Ce conteneur nécessite la capacité NET_ADMIN, ce qui implique que tout utilisateur ou compte de service déployant des pods doit disposer d'autorisations RBAC (contrôle d'accès basé sur les rôles) élevées dans Kubernetes. Le plug-in Container Network Interface (CNI) d'ASM réduit cette exigence en déplaçant la configuration iptables vers la chaîne CNI au niveau du nœud. Ainsi, les pods n'ont plus besoin du conteneur istio-init ni de privilèges élevés.
Fonctionnement
Sans le plug-in CNI (configuration par défaut)
ASM injecte un conteneur istio-init dans chaque pod. Ce conteneur d'initialisation configure les règles iptables pour rediriger le trafic via le proxy sidecar Envoy avant le démarrage des autres conteneurs. Étant donné que istio-init modifie l'espace de noms réseau du pod, il requiert la capacité NET_ADMIN. Par conséquent, tout utilisateur ou compte de service déployant des pods doit disposer d'autorisations RBAC élevées.
Avec le plug-in CNI
Le plug-in CNI d'ASM déplace la configuration iptables du conteneur istio-init vers la chaîne CNI au niveau du nœud. Les règles de redirection du trafic sont appliquées lors de la phase de configuration réseau du pod, avant le démarrage de tout conteneur. Les pods n'ont plus besoin du conteneur istio-init ni de la capacité NET_ADMIN.
Les règles iptables de chaque pod appartiennent à son propre espace de noms réseau. Ainsi, les modifications apportées à un pod n'affectent pas les autres pods situés sur le même nœud.
Le plug-in CNI d'ASM ne remplace pas le CNI existant de votre cluster. Il est installé en tant que plug-in en chaîne dont la configuration est ajoutée aux plug-ins CNI existants, afin qu'il puisse être appelé au démarrage des conteneurs.
Identification des pods
Le plug-in CNI applique la redirection du trafic uniquement aux pods qui remplissent toutes les conditions suivantes :
| Condition | Description |
|---|---|
| Namespace non exclu | Le namespace du pod ne figure pas dans la liste excludeNamespaces |
| Sidecar présent | Le pod contient un conteneur nommé istio-proxy |
| Multi-conteneur | Le pod contient plus d'un conteneur |
| Injection non désactivée | Le pod ne possède pas d'annotation sidecar.istio.io/inject ou la valeur de l'annotation n'est pas false |
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance ASM exécutant la version 1.14.3.86 ou ultérieure. Pour plus d'informations, consultez la rubrique Créer une instance ASM
Un client kubectl connecté à l'instance ASM. Pour plus d'informations, consultez la rubrique Utiliser kubectl sur le plan de contrôle pour accéder aux ressources Istio
Activer le plug-in CNI
Connectez-vous à la console ASM.
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez .
-
Sur la page ASM CNI Plug-in, activez l'option Enable Grid CNI Plugin, sélectionnez les namespaces à exclure, puis cliquez sur Update Settings.
Les pods situés dans les namespaces exclus continuent d'utiliser le conteneur
istio-initpour la configuration réseau au lieu du plug-in CNI. Attendez que la colonne Status passe de Updating à Running. Le plug-in CNI est désormais activé.
Vérifier les règles iptables
Déployez l'application exemple Bookinfo pour confirmer que le plug-in CNI configure correctement les règles iptables.
-
Créez un fichier nommé bookinfo.yaml avec le contenu suivant :
-
Déployez l'application Bookinfo :
kubectl apply -f bookinfo.yaml -
Récupérez l'ID du conteneur et le nom du nœud du pod productpage :
ns=default podname=$(kubectl get pod | grep productpage | awk '{print $1}') # For Docker runtime: container_id=$(kubectl get pod -n ${ns} ${podname} -o jsonpath="{.status.containerStatuses[?(@.name=='istio-proxy')].containerID}" | sed -n 's/docker:\/\/\(.*\)/\1/p') # For containerd runtime: container_id=$(kubectl get pod -n ${ns} ${podname} -o jsonpath="{.status.containerStatuses[?(@.name=='istio-proxy')].containerID}" | sed -n 's/containerd:\/\/\(.*\)/\1/p') echo $container_id # Get the node name kubectl get pod ${podname} -o jsonpath="{.spec.nodeName}" -
Connectez-vous au nœud (par exemple, via SSH) et récupérez le PID du conteneur :
# For Docker runtime: docker inspect --format '{{ .State.Pid }}' $container_id # For containerd runtime: crictl inspect $container_id | jq ".info.pid" -
Entrez dans l'espace de noms réseau du conteneur productpage et listez les règles de la table NAT :
nsenter -t <pid> -n iptables -L -t nat -n -v --line-numbers -xRemplacez
<pid>par le PID obtenu à l'étape précédente.