Tanzu Kubernetes GridでgVisorを使えるように設定するメモ。
gVisorを使うには,
Worker Nodeに https://gvisor.dev/docs/user_guide/install のドキュメントの通り、
- runsc
- containerd-shim-runsc-v1
をインストールし、
https://gvisor.dev/docs/user_guide/containerd/quick_start/ のドキュメントの通り、/etc/containerd/config.tomlを設定する必要があります。
また、RuntimeClassの定義も必要です。
これらをTanzu Kubernetes Cluster作成時に自動で行うために ytt のOverlayを作成します。
$HOME/.tanzu/tkg/providers/infrastructure-vsphere/ytt/vsphere-overlay.yaml に次の設定を記述または追記します。
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"})
---
spec:
template:
spec:
preKubeadmCommands:
#@overlay/append
- curl -s https://storage.googleapis.com/gvisor/releases/release/latest/x86_64/runsc > runsc
#@overlay/append
- curl -s https://storage.googleapis.com/gvisor/releases/release/latest/x86_64/containerd-shim-runsc-v1 > containerd-shim-runsc-v1
#@overlay/append
- chmod a+rx runsc containerd-shim-runsc-v1
#@overlay/append
- mv runsc containerd-shim-runsc-v1 /usr/local/bin
#@overlay/append
- echo " [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]" >> /etc/containerd/config.toml
#@overlay/append
- echo " runtime_type = \"io.containerd.runc.v2\"" >> /etc/containerd/config.toml
#@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
- systemctl restart containerd
---
apiVersion: addons.cluster.x-k8s.io/v1alpha3
kind: ClusterResourceSet
metadata:
name: #@ "{}-gvisor-runtimeclass".format(data.values.CLUSTER_NAME)
labels:
cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME
spec:
strategy: "ApplyOnce"
clusterSelector:
matchLabels:
tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME
resources:
- name: #@ "{}-gvisor-runtimeclass".format(data.values.CLUSTER_NAME)
kind: Secret
---
apiVersion: v1
kind: Secret
metadata:
name: #@ "{}-gvisor-runtimeclass".format(data.values.CLUSTER_NAME)
type: addons.cluster.x-k8s.io/resource-set
stringData:
value: |
apiVersion: node.k8s.io/v1beta1
kind: RuntimeClass
metadata:
name: gvisor
handler: runsc
この設定を加えてtanzu cluster createを実行し、クラスタを作成します。
RuntimeClassが設定されていることを確認します。
$ kubectl get runtimeclass
NAME HANDLER AGE
gvisor runsc 14m
gVisorを有効にしたPodを作成します。
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: nginx-gvisor
spec:
runtimeClassName: gvisor
containers:
- name: nginx
image: nginx
EOF
PodがRunningになったら、コンテナ上でdmsgコマンドを実行します。
$ kubectl exec nginx-gvisor -- dmesg
[ 0.000000] Starting gVisor...
[ 0.238948] Reading process obituaries...
[ 0.406397] Creating bureaucratic processes...
[ 0.826157] Letting the watchdogs out...
[ 1.272694] Forking spaghetti code...
[ 1.424042] Adversarially training Redcode AI...
[ 1.775609] Accelerating teletypewriter to 9600 baud...
[ 2.098330] Consulting tar man page...
[ 2.456185] Synthesizing system calls...
[ 2.493476] Feeding the init monster...
[ 2.516233] Conjuring /dev/null black hole...
[ 2.545793] Ready!
gVisorが起動していることがわかります。
同様にコンテナ上でunameコマンドを実行します。
$ kubectl exec nginx-gvisor -- uname -a
Linux nginx-gvisor 4.4.0 #1 SMP Sun Jan 10 15:06:54 PST 2016 x86_64 GNU/Linux
ゲストカーネルのバージョンが4.4.0であることがわかります。
次のコマンド実行結果の通り、ホストカーネルのバージョン(4.19.189-5.ph3)と異なることがわかります。
$ kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
rapsberry-control-plane-p6dr2 Ready control-plane,master 10m v1.20.5+vmware.2 192.168.11.40 192.168.11.40 VMware Photon OS/Linux 4.19.189-5.ph3 containerd://1.4.4
rapsberry-md-0-7968b77845-mt2rz Ready <none> 8m15s v1.20.5+vmware.2 192.168.11.48 192.168.11.48 VMware Photon OS/Linux 4.19.189-5.ph3 containerd://1.4.4
$ kubectl -n tkg-system exec kapp-controller-7776659df6-msz8v -- uname -a
Linux rapsberry-control-plane-p6dr2 4.19.189-5.ph3 #1-photon SMP Thu May 13 16:00:29 UTC 2021 x86_64