Tanzu Kubernetes Grid(TKGm) v1.3.0 でgVisor を利用する

自分備忘録用メモ。TKGm v1.3.0 でgVisor を利用するための設定。


前提条件

  • TKGm v1.3.0 がデプロイ済
  • TKGm on vSphere 環境


Overlay ファイルの作成

tanzu CLI をインストールし、Management Cluster 操作用端末の.tanzu/tkg/providers/infrastructure-vsphere/ytt 下に以下のファイルを作成します。

$ cat containerd-and-gvisor.yaml
#@ load("@ytt:overlay", "overlay")

#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"})
---
spec:
  kubeadmConfigSpec:
    preKubeadmCommands:
    #@overlay/append
    - echo '  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]' >> /etc/containerd/config.toml
    #@overlay/append
    - echo '    endpoint = ["https://registry-1.docker.io"]' >> /etc/containerd/config.toml
    #@overlay/append
    - systemctl restart containerd

#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"})
---
spec:
  template:
    spec:
      preKubeadmCommands:
      #@overlay/append
      - curl -fsSL https://gvisor.dev/archive.key | sudo apt-key add -
      #@overlay/append
      - sudo add-apt-repository "deb [arch=amd64,arm64] https://storage.googleapis.com/gvisor/releases release main"
      #@overlay/append
      - sudo apt-get update && sudo apt-get install -y runsc
      #@overlay/append
      - echo '  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]' >> /etc/containerd/config.toml
      #@overlay/append
      - echo '    runtime_type = "io.containerd.runsc.v1"' >> /etc/containerd/config.toml
      #@overlay/append
      - echo '  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc.options]' >> /etc/containerd/config.toml
      #@overlay/append
      - echo '    TypeUrl = "io.containerd.runsc.v1.options"' >> /etc/containerd/config.toml
      #@overlay/append
      - echo '    ConfigPath = "/etc/containerd/runsc.toml"' >> /etc/containerd/config.toml
      #@overlay/append
      - systemctl restart containerd


これでTKGm のWorkload Cluster のWorker ノードに対して、gVisor のインストールと設定が出来ます。上のOverlay はこちらを参考にして記述しています。


Workload Cluster の作成

以下のコマンドでWorkload Cluster: gibson を作成します。
tanzu cluster create gibson --tkr v1.20.4---vmware.1-tkg.1 --file ~/.tanzu/tkg/clusterconfigs/cluster-gibson-config.yaml -v 6

暫くするとKubernetes クラスタが起動してきます。
$ k get nodes -owide
NAME                           STATUS   ROLES                  AGE   VERSION            INTERNAL-IP     EXTERNAL-IP     OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
gibson-control-plane-p8lxj     Ready    control-plane,master   18m   v1.20.4+vmware.1   xxx.xxx.xx.xx    xxx.xxx.xx.xx    Ubuntu 20.04.2 LTS   5.4.0-66-generic   containerd://1.4.3
gibson-md-0-7fd85cc74c-l55zd   Ready    <none>                 17m   v1.20.4+vmware.1   xxx.xxx.xx.xx   xxx.xxx.xx.xx   Ubuntu 20.04.2 LTS   5.4.0-66-generic   containerd://1.4.3

Worker ノードにアクセスし、Overlay に記述した内容が反映されているか確認します。
ssh -i tkgm-lab capv@xxx.xxx.xx.xx
root@gibson-md-0-7fd85cc74c-l55zd:~# runsc --version
runsc version release-20210419.0
spec: 1.0.2
root@gibson-md-0-7fd85cc74c-l55zd:~# cat /etc/containerd/config.toml
## template: jinja

# Use config version 2 to enable new configuration fields.
  1 apiVersion: node.k8s.io/v1
# Config file is parsed as version 1 by default.
version = 2

[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    sandbox_image = "projects.registry.vmware.com/tkg/pause:3.2"


  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]
    runtime_type = "io.containerd.runsc.v1"
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc.options]
    TypeUrl = "io.containerd.runsc.v1.options"
    ConfigPath = "/etc/containerd/runsc.toml"

大丈夫そうですね。

Runtime Class の作成

こちらのドキュメントを参考にRuntime Class を利用するためのマニフェストファイルを作成し、デプロイします。
$ cat runtimeclass-gvisor.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: gvisor
handler: runsc
k apply -f runtimeclass-gvisor.yaml
$ k get runtimeclasses.node.k8s.io
NAME     HANDLER   AGE
gvisor   runsc     6s

Runtime Class を利用したPod の作成

以下のマニフェストファイルを利用し、Pod をデプロイし、ちゃんと指定したRuntime Class が利用出来ているか確認します。
k run gvisor-pod --image=nginx -oyaml --dry-run=client > gvisor-pod.yaml
vim gvisor-pod.yaml
$ cat gvisor-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: gvisor-pod
  name: gvisor-pod
spec:
  runtimeClassName: gvisor # add
  containers:
  - image: nginx
    name: gvisor-pod
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
k apply -f gvisor-pod.yaml

Pod にアクセスして確認してみます。
$ k exec gvisor-pod -- uname -a
Linux gvisor-pod 4.4.0 #1 SMP Sun Jan 10 15:06:54 PST 2016 x86_64 GNU/Linux
$ k exec gvisor-pod -- dmesg
[    0.000000] Starting gVisor...
[    0.174324] Creating bureaucratic processes...
[    0.362738] Preparing for the zombie uprising...
[    0.704420] Recruiting cron-ies...
[    0.984414] Constructing home...
[    1.451485] Moving files to filing cabinet...
[    1.486690] Reading process obituaries...
[    1.671563] Creating cloned children...
[    2.046006] Adversarially training Redcode AI...
[    2.379471] Digging up root...
[    2.451734] Granting licence to kill(2)...
[    2.801847] Ready!

大丈夫そうですね。
一方、Runtime Class を指定しないで作成したPod に関しては以下の様な出力になります。
k run test-native --image=nginx --restart=Never
k exec -it test-native -- /bin/sh
$ uname	-a
Linux test-native 5.4.0-66-generic #74-Ubuntu SMP Wed Jan 27 22:54:38 UTC 2021 x86_64 GNU/Linux
$ dmesg
[    0.000000] Linux version 5.4.0-66-generic (buildd@lgw01-amd64-039) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #74-Ubuntu SMP Wed Jan 27 22:54:38 UTC 2021 (Ubuntu 5.4.0-66.74-generic 5.4.86)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-66-generic root=UUID=a13dacfb-8bb2-47b8-92fa-ce76e3f4da5c ro quiet
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Hygon HygonGenuine
[    0.000000]   Centaur CentaurHauls
[    0.000000]   zhaoxin   Shanghai
...(SNIP)...

このブログの人気の投稿