Lingkungan

  • Sistem Operasi: Ubuntu 20.04 LTS Cloud Image
  • Kubernetes: 1.22.1
  • Containerd: 1.6.6

Panduan

  1. Pasang repository gVisor
curl -fsSL https://gvisor.dev/archive.key | gpg --dearmor -o /usr/share/keyrings/gvisor-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/gvisor-archive-keyring.gpg] https://storage.googleapis.com/gvisor/releases release main" | tee /etc/apt/sources.list.d/gvisor.list > /dev/null
  1. Install runsc (gVisor)
apt update -y
apt install -y runsc
  1. Definisikan runsc pada konfigurasi containerd
vim /etc/containerd/config.toml

Tambahkan baris berikut pada bagian [plugins]

---konten dari file dipotong---
[plugins]

---konten dari file dipotong---
# Tambahkan baris berikut
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]
    runtime_type = "io.containerd.runsc.v1"
# Akhir dari baris yang perlu ditambahkan

[proxy_plugins]
---konten dari file dipotong---
  1. Restart containerd
systemctl restart containerd
  1. Tambahkan objek runtimeclass pada Kubernetes
cat<<EOF > gvisor-runtime.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: gvisor
handler: runsc
EOF

kubectl apply -f gvisor-runtime.yaml
  1. Membuat pod dengan runtime gVisor
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: nginx-gvisor
spec:
  runtimeClassName: gvisor
  containers:
  - name: nginx
    image: nginx
EOF

Periksa Kernel

  • host
uname -a
Linux aa-kubernetes-master01 5.4.0-120-generic #136-Ubuntu SMP Fri Jun 10 13:40:48 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
  • runc - containerd
kubectl exec -it web -- uname -a
Linux web 5.4.0-120-generic #136-Ubuntu SMP Fri Jun 10 13:40:48 UTC 2022 x86_64 GNU/Linux
  • runsc - gVisor
kubectl exec -it nginx-gvisor -- uname -a
Linux nginx-gvisor 4.4.0 #1 SMP Sun Jan 10 15:06:54 PST 2016 x86_64 GNU/Linux

Terlihat containerd menggunakan kernel yang sama dengan host sedangkan gVisor menggunakan kernel berbeda, ini dikarenakan gVisor melakukan isolasi sehingga kernel yang digunakan oleh container bersifat independen dengan maksud untuk meningkatkan keamanan terhadap eksploitasi Kernel Host atau serangan seperti container escape.

Sumber Gambar: https://gvisor.dev/docs/Layers.png

Referensi