今日覚えて帰ること
gVisor
- 低レベルのコンテナランタイム
- runCの脆弱性を解消するために作られた
Sandbox gVisor
Install and configure gVisor
You should install gVisor on the node
node01
and make containerd use it.There is install script
/root/gvisor-install.sh
which should setup everything, execute it on nodenode01
.
node01にgVisorをインストールせよ、と言っています。
gVisorのことを知らないのでまず調査します。
gVisorとは、コンテナ型仮想化で使われる技術の1つで、OCI Runtime Specificationに基づいて作られたKubernetesやDockerの低レベルなランタイムです。
gVisorとは | OSSのデージーネット
runCと同じレベルのコンテナランタイムということですね。
gVisorはrunCが持つ脆弱性を解消するために開発されたランタイムとのこと。
runCはすべてのコンテナが1つのカーネルを共有して動作している点で脆弱だと言われており、gVisorはコンテナの動作に必要なシステムコールの多くを直接ホストカーネルに渡さず、ユーザ空間の中で処理します。
ゲストカーネルってのができるみたいです。
gVisorはrunscとも呼ばれています。
gVisorの中の一部がrunscというツール?になっているっぽい。ちょっと曖昧です。
それではインストールしていきましょう。
インストール用のスクリプトがcontrolplaneに存在するので、node01にコピーしてからインストールします。
controlplane $ ll
total 80
drwx------ 12 root root 4096 Sep 11 23:34 ./
drwxr-xr-x 20 root root 4096 Sep 11 23:34 ../
...
lrwxrwxrwx 1 root root 1 Sep 9 12:33 filesystem -> //
-rwxr-xr-x 1 root root 1977 Sep 11 23:34 gvisor-install.sh*
drwx------ 3 root root 4096 Sep 9 12:38 snap/
controlplane $ scp gvisor-install.sh node01:/root/gvisor-install.sh
gvisor-install.sh
node01にログインしてインストールします。
controlplane $ ssh node01
Last login: Sun Nov 13 17:27:09 2022 from 10.48.0.33
node01 $ ll
total 40
drwx------ 4 root root 4096 Sep 11 23:35 ./
drwxr-xr-x 19 root root 4096 Sep 9 12:33 ../
-rw------- 1 root root 20 Nov 13 2022 .bash_history
...
-rwxr-xr-x 1 root root 1977 Sep 11 23:35 gvisor-install.sh*
drwx------ 3 root root 4096 Sep 9 12:52 snap/
node01 $ bash gvisor-install.sh
Hit:2 http://ppa.launchpad.net/rmescandon/yq/ubuntu focal InRelease
Get:3 http://security.ubuntu.com/ubuntu focal-security InRelease [128 kB]
Hit:1 https://prod-cdn.packages.k8s.io/repositories/isv:/kubernetes:/core:/stable:/v1.28/deb InRelease
Hit:4 http://archive.ubuntu.com/ubuntu focal InRelease
...
FINISHED --2024-09-11 23:36:36--
Total wall clock time: 9.4s
Downloaded: 4 files, 51M in 6.8s (7.59 MB/s)
runsc: OK
containerd-shim-runsc-v1: OK
node01 $
これでOKです。
Create RuntimeClass and Pod to use gVisor
Now that gVisor should be configured, create a new RuntimeClass for it.
Then create a new Pod named
sec
using imagenginx:1.21.5-alpine
.Verify your setup by running
dmesg
in the Pod.
gVisorを使用するためにRuntimeClassリソースを作成し、gVisorを用いてpodを作成せよ、と言っています。
RuntimeClassについてはこちらに詳述されています。
RuntimeClassリソースを作成し、podのマニフェストファイルのspec.runtimeClassNameにてRuntimeClassリソースの名称を指定することでコンテナランタイムを指定してpodを作成することが可能になります。
RuntimeClassを作成するときにhandlerというフィールドに値を設定しますが、こちらは使用しているCRIによって規定されています。
gVisorの場合はrunscです。
それではRuntimeClassリソース を作成していきます。
前の手順の続きだとNode01にいるので、そのまま作成しないように注意する必要があります。
node01 $ logout
Connection to node01 closed.
controlplane $ vi runtime.yaml
controlplane $ cat runtime.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: gvisor
handler: runsc
controlplane $ k apply -f runtime.yaml
runtimeclass.node.k8s.io/gvisor created
controlplane $
podを作成します。
k run ではRuntimeClassNameを指定できない(はず)なので魔フェストファイルを作成してapplyします。
controlplane $ vi pod.yaml
controlplane $ cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: sec
spec:
runtimeClassName: gvisor
containers:
- image: nginx:1.21.5-alpine
name: sec
controlplane $ k apply -f pod.yaml
pod/sec created
controlplane $
podに入ってdmesgコマンドを叩きます
controlplane $ k exec sec -- dmesg | grep -i gvisor
[ 0.000000] Starting gVisor...
gVisorが起動していることを確認できました。