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.
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:
Masuk ke Konsol ASM.
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi di sebelah kiri, pilih .
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.
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: {}
---
Jalankan perintah berikut untuk menerapkan aplikasi bookinfo:
kubectl apply -f bookinfo.yaml
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}"
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"
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.