Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Enable the CNI plug-in to improve security

Dernière mise à jour :Aug 11, 2026

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.

Architecture diagram showing how the CNI plug-in configures traffic redirection at the node level

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 :

Activer le plug-in CNI

  1. Connectez-vous à la console ASM.

  2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez Data Plane Component Management > ASM CNI Plug-in.

  3. 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-init pour la configuration réseau au lieu du plug-in CNI.

  4. 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.

  1. Créez un fichier nommé bookinfo.yaml avec le contenu suivant :

    bookinfo.yaml

    ##################################################################################################
    # Details service
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: details
      labels:
        app: details
        service: details
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: details
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-details
      labels:
        account: details
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: details-v1
      labels:
        app: details
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: details
          version: v1
      template:
        metadata:
          labels:
            app: details
            version: v1
        spec:
          serviceAccountName: bookinfo-details
          containers:
          - name: details
            image: docker.io/istio/examples-bookinfo-details-v1:1.16.2
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            securityContext:
              runAsUser: 1000
    ---
    ##################################################################################################
    # Ratings service
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: ratings
      labels:
        app: ratings
        service: ratings
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: ratings
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-ratings
      labels:
        account: ratings
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ratings-v1
      labels:
        app: ratings
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ratings
          version: v1
      template:
        metadata:
          labels:
            app: ratings
            version: v1
        spec:
          serviceAccountName: bookinfo-ratings
          containers:
          - name: ratings
            image: docker.io/istio/examples-bookinfo-ratings-v1:1.16.2
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            securityContext:
              runAsUser: 1000
    ---
    ##################################################################################################
    # Reviews service
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews
      labels:
        app: reviews
        service: reviews
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-reviews
      labels:
        account: reviews
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v1
      labels:
        app: reviews
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v1
      template:
        metadata:
          labels:
            app: reviews
            version: v1
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v1:1.16.2
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v2
      labels:
        app: reviews
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v2
      template:
        metadata:
          labels:
            app: reviews
            version: v2
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v2:1.16.2
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v3
      labels:
        app: reviews
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v3
      template:
        metadata:
          labels:
            app: reviews
            version: v3
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v3:1.16.2
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    ##################################################################################################
    # Productpage services
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: productpage
      labels:
        app: productpage
        service: productpage
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: productpage
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-productpage
      labels:
        account: productpage
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: productpage-v1
      labels:
        app: productpage
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: productpage
          version: v1
      template:
        metadata:
          labels:
            app: productpage
            version: v1
        spec:
          serviceAccountName: bookinfo-productpage
          containers:
          - name: productpage
            image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            securityContext:
              runAsUser: 1000
          volumes:
          - name: tmp
            emptyDir: {}
    ---
  2. Déployez l'application Bookinfo :

    kubectl apply -f bookinfo.yaml
  3. 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}"
  4. 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"
  5. 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 -x

    Remplacez <pid> par le PID obtenu à l'étape précédente.

    Sortie attendue

    Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
    num      pkts      bytes target     prot opt in     out     source               destination
    1       34938  2096280 ISTIO_INBOUND  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
    
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num      pkts      bytes target     prot opt in     out     source               destination
    
    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
    num      pkts      bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    num      pkts      bytes target     prot opt in     out     source               destination
    1          17     1020 ISTIO_OUTPUT  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
    
    Chain ISTIO_INBOUND (1 references)
    num      pkts      bytes target     prot opt in     out     source               destination
    1           0        0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:15008
    2           0        0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    3           0        0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:15020
    4       34938  2096280 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:15021
    5           0        0 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:15090
    6           0        0 ISTIO_IN_REDIRECT  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
    
    Chain ISTIO_REDIRECT (1 references)
    num      pkts      bytes target     prot opt in     out     source               destination
    1           0        0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 15001
    
    Chain ISTIO_IN_REDIRECT (3 references)
    num      pkts      bytes target     prot opt in     out     source               destination
    1           1       60 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 15006
    
    Chain ISTIO_OUTPUT (1 references)
    num      pkts      bytes target     prot opt in     out     source               destination
    1           2      120 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:15020
    2           0        0 RETURN     all  --  *      lo      127.0.X.X            0.0.0.0/0
    3           1       60 ISTIO_IN_REDIRECT  all  --  *      lo      0.0.0.0/0           !127.0.X.X            owner UID match 1337
    4           0        0 RETURN     all  --  *      lo      0.0.0.0/0            0.0.0.0/0            ! owner UID match 1337
    5          14      840 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            owner UID match 1337
    6           0        0 ISTIO_IN_REDIRECT  all  --  *      lo      0.0.0.0/0           !127.0.X.X            owner GID match 1337
    7           0        0 RETURN     all  --  *      lo      0.0.0.0/0            0.0.0.0/0            ! owner GID match 1337
    8           0        0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            owner GID match 1337
    9           0        0 RETURN     all  --  *      *       0.0.0.0/0            127.0.X.X
    10          0        0 RETURN     all  --  *      *       0.0.0.0/0            192.168.0.1
    11          0        0 ISTIO_REDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

    La sortie contient des chaînes spécifiques à Istio (ISTIO_INBOUND, ISTIO_REDIRECT, ISTIO_IN_REDIRECT et ISTIO_OUTPUT), ce qui confirme que le plug-in CNI a configuré correctement les règles iptables.

Étapes suivantes