全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Aktifkan Plugin CNI untuk Meningkatkan Keamanan

更新时间:Jun 28, 2025

Service Mesh (ASM) memungkinkan Anda menggunakan plugin Container Network Interface (CNI) untuk menghapus aturan iptables dari pod. Plugin CNI tidak memerlukan izin akses kontrol berbasis peran Kubernetes (RBAC) yang ditingkatkan, sehingga mengurangi persyaratan izin pengguna dan meningkatkan keamanan ASM. Topik ini menjelaskan cara mengaktifkan plugin CNI.

Prasyarat

Informasi Latar Belakang

Untuk mengaktifkan instance ASM agar bekerja sesuai harapan, Anda harus menyuntikkan proxy Envoy ke setiap pod dari instance ASM. Kemudian, gunakan aturan iptables untuk mengelola lalu lintas setiap pod sehingga proxy Envoy yang disuntikkan dapat mengarahkan lalu lintas ke aplikasi yang ditentukan. Aturan iptables setiap pod termasuk dalam namespace jaringan pod tersebut. Oleh karena itu, perubahan pada aturan iptables sebuah pod tidak memengaruhi pod lainnya di node yang sama.

Secara default, container istio-init disuntikkan ke pod yang diterapkan di instance ASM. Selain itu, aturan iptables dikonfigurasikan sebelum container lain di pod dimulai. Ini memerlukan izin yang cukup untuk menerapkan container, termasuk kemampuan NET_ADMIN dan untuk mengonfigurasi ulang jaringan.

ASM memungkinkan Anda menggunakan plugin CNI untuk menghapus aturan iptables dari pod. Plugin CNI tidak memerlukan izin RBAC Kubernetes yang ditingkatkan. Anda dapat menggunakan plugin CNI untuk mengonfigurasi pengalihan lalu lintas pod dalam fase penyiapan jaringan siklus hidup pod. Dalam hal ini, pod tidak lagi memerlukan container istio-init yang memerlukan kemampuan NET_ADMIN. Setelah plugin CNI diaktifkan, konfigurasinya ditambahkan ke plugin CNI yang ada dari container sehingga plugin CNI dapat dipanggil saat container dimulai.

Plugin CNI mengidentifikasi pod yang memerlukan pengalihan lalu lintas dengan memeriksa apakah pod memenuhi semua kondisi berikut:

  • Namespace pod tidak terdapat dalam nilai parameter excludeNamespaces.

  • Pod berisi container bernama istio-proxy.

  • Pod berisi beberapa container.

  • Pod tidak memiliki anotasi yang key-nya adalah sidecar.istio.io/inject.

  • Pod memiliki anotasi sidecar.istio.io/inject yang nilainya bukan false.

Aktifkan Plugin CNI

Anda dapat mengaktifkan plugin CNI untuk instance ASM di Konsol ASM. Lakukan langkah-langkah berikut:

  1. Masuk ke Konsol ASM.

  2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi di sebelah kiri, pilih Data Plane Component Management > ASM CNI Plug-in.

  3. Di halaman ASM CNI Plug-in, aktifkan Enable Grid CNI Plugin, pilih namespace yang ingin Anda kecualikan, dan klik Update Settings.

    Pod di namespace yang dikecualikan menggunakan container istio-init daripada plugin CNI untuk konfigurasi jaringan. Saat nilai di kolom Status yang sesuai dengan instance ASM berubah dari Updating menjadi Running, plugin CNI diaktifkan.

Verifikasi Aturan Iptables

Dalam contoh ini, aplikasi bookinfo diterapkan di kluster untuk memeriksa apakah aturan iptables berlaku.

  1. Buat file bookinfo.yaml dengan konten berikut:

    Tampilkan file bookinfo.yaml

    ##################################################################################################
    # Layanan Details
    ##################################################################################################
    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
    ---
    ##################################################################################################
    # Layanan Ratings
    ##################################################################################################
    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
    ---
    ##################################################################################################
    # Layanan Reviews
    ##################################################################################################
    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: {}
    ---
    ##################################################################################################
    # Layanan Productpage
    ##################################################################################################
    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. Jalankan perintah berikut untuk menerapkan aplikasi bookinfo:

    kubectl apply -f bookinfo.yaml
  3. Jalankan perintah berikut untuk mendapatkan ID container dan nama node tempat pod layanan Productpage berjalan:

    ns=default
    podname=kubectl get pod |grep productpage
    # Jalankan perintah berikut jika runtime container adalah Docker:
    container_id=$(kubectl get pod -n ${ns} ${podname} -o jsonpath="{.status.containerStatuses[?(@.name=='istio-proxy')].containerID}" | sed -n 's/docker:\/\/\(.*\)/\1/p')
    # Jalankan perintah berikut jika runtime container adalah Containerd:
    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
    
    # Dapatkan nama node.
    kubectl get pod ${podname} -o jsonpath="{.spec.nodeName}"
  4. Masuk ke node tempat pod layanan Productpage berjalan. Sebagai contoh, Anda dapat menjalankan perintah SSH. Setelah masuk, jalankan perintah berikut untuk mendapatkan proses yang sesuai dengan ID container:

    # Jalankan perintah berikut jika runtime container adalah Docker:
    docker inspect --format '{{ .State.Pid }}' $container_id
    # Jalankan perintah berikut jika runtime container adalah Containerd:
    crictl inspect $container_id|jq ".info.pid"
  5. Jalankan perintah berikut untuk masuk ke namespace jaringan container Productpage dan dapatkan konfigurasi saat ini:

    nsenter -t $ -n iptables -L -t nat -n -v --line-numbers -x

    Tampilkan keluaran yang diharapkan

    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

    Keluaran di atas menunjukkan bahwa aturan iptables ada, seperti ISTIO_INBOUND, ISTIO_REDIRECT, ISTIO_IN_REDIRECT, dan ISTIO_OUTPUT. Ini menunjukkan bahwa aturan iptables berlaku.