Pregunta 10 | Sandbox de Runtime de Contenedor gVisor
Usar contexto: kubectl config use-context workload-prod
El equipo purple quiere ejecutar algunas de sus cargas de trabajo de manera más segura. El nodo trabajador cluster1-node2 ya tiene el motor de contenedor containerd instalado y está configurado para soportar el runtime runsc/gvisor.
Crea una RuntimeClass llamada gvisor con el handler runsc.
Crea un Pod que use la RuntimeClass. El Pod debe estar en el Namespace team-purple, llamarse gvisor-test y usar la imagen nginx:1.19.2. Asegúrate de que el Pod se ejecute en cluster1-node2.
Escribe la salida dmesg del Pod iniciado exitosamente en /opt/course/10/gvisor-test-dmesg.
Respuesta:
Verificamos los nodos y podemos ver que todos están usando containerd:
➜ k get node -o wide
NAME STATUS ROLES ... CONTAINER-RUNTIME
cluster1-controlplane1 Ready control-plane ... containerd://1.5.2
cluster1-node1 Ready <none> ... containerd://1.5.2
cluster1-node2 Ready <none> ... containerd://1.5.2
Pero solo uno tiene containerd configurado para trabajar con el runtime runsc/gvisor que es cluster1-node2.
(Opcionalmente) hacemos ssh al nodo trabajador y verificamos si containerd+runsc está configurado:
➜ ssh cluster1-node2
➜ root@cluster1-node2:~# runsc --version
runsc version release-20201130.0
spec: 1.0.1-dev
➜ root@cluster1-node2:~# cat /etc/containerd/config.toml | grep runsc
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]
runtime_type = "io.containerd.runsc.v1"
Ahora es mejor ir a la documentación de k8s para RuntimeClasses https://kubernetes.io/docs/concepts/containers/runtime-class, tomar un ejemplo y crear el de gvisor:
vim 10_rtc.yaml
# 10_rtc.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: gvisor
handler: runsc
k -f 10_rtc.yaml create
# Y el Pod requerido:
k -n team-purple run gvisor-test --image=nginx:1.19.2 --dry-run=client -o yaml > 10_pod.yaml
vim 10_pod.yaml
# 10_pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: gvisor-test
name: gvisor-test
namespace: team-purple
spec:
nodeName: cluster1-node2 # agregar
runtimeClassName: gvisor # agregar
containers:
- image: nginx:1.19.2
name: gvisor-test
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
k -f 10_pod.yaml create
Después de crear el pod debemos verificar si está ejecutándose y si usa el sandbox gvisor:
➜ k -n team-purple get pod gvisor-test
NAME READY STATUS RESTARTS AGE
gvisor-test 1/1 Running 0 30s
➜ k -n team-purple exec gvisor-test -- dmesg
[ 0.000000] Starting gVisor...
[ 0.417740] Checking naughty and nice process list...
[ 0.623721] Waiting for children...
[ 0.902192] Gathering forks...
[ 1.258087] Committing treasure map to memory...
[ 1.653149] Generating random numbers by fair dice roll...
[ 1.918386] Creating cloned children...
[ 2.137450] Digging up root...
[ 2.369841] Forking spaghetti code...
[ 2.840216] Rewriting operating system in Javascript...
[ 2.956226] Creating bureaucratic processes...
[ 3.329981] Ready!
Se ve bien. Y como se requiere finalmente escribimos la salida dmesg en el archivo:
k -n team-purple exec gvisor-test > /opt/course/10/gvisor-test-dmesg -- dmesg