kubestronautへの道 ~CKS編 その22 killer coda「Sandbox gVisor」~

tech article

今日覚えて帰ること

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 node node01 .

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 image nginx: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です。

ランタイムクラス(Runtime Class)
FEATURE STATE: Kubernetes v1.20 このページではRuntimeClassリソースと、runtimeセクションのメカニズムについて説明します。 RuntimeClassはコンテナランタイムの設定を選択するための機能です。そのコンテナランタイム設定はPodのコンテナを稼働させるために使われます...

それでは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が起動していることを確認できました。

タイトルとURLをコピーしました