文章

k8s - k8s使用gvisor

k8s - k8s使用gvisor

k8s使用gvisor

https://github.com/google/gvisor https://gvisor.dev/

跟着官方文档走一圈。

背景

由于在云主机中创建的实例是一个KVM,然后没有默认开启/dev/kvm 这个设备,使用时想要在k8s中实现多租户的安全。

一种是在pod上层增加KVM,一种在pod上层虚拟化一个内核出来,虽然不是100%安全,但是至少不需要让容器直接使用宿主的内核。

在kvm的Firecracker方式(MicoVM)在个别云端不支持的情况下(ai/kvm-),

我们选择了另一个道路:gvisor。

安装gvisor

未安装

1
2
3
4
5
6
7
8
grep runsc /etc/containerd/config.toml

# 或者宿主机查看容器的某一个进程(未被隔离)
root@raha-0002:/data# pgrep -a openclaw
2094621 openclaw
2094645 openclaw-gateway


进行安装

前提,我们已经使用containerd作为容器运行时,然后组建了k8s集群。

如果 runsc未安装【集群统一安装】

1
2
3
4
5
6
7
8
9
# 所有节点
curl -fsSL https://gvisor.dev/archive.key | sudo gpg --dearmor -o /usr/share/keyrings/gvisor-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/gvisor-archive-keyring.gpg] https://storage.googleapis.com/gvisor/releases release main" | sudo tee /etc/apt/sources.list.d/gvisor.list

# 安装
sudo apt-get update && sudo apt-get install -y runsc

# 验证
runsc --version

告诉 containerd 如何使用新安装的 runsc 【集群统一修改】

  1. 编辑 containerd 配置文件 通常位于 /etc/containerd/config.toml。如果文件不存在,可以先运行 sudo containerd config default | sudo tee /etc/containerd/config.toml 生成一个。
1
2
3
4
5
6
7
8
9
10
11
12
13
# ... 其他现有配置 ...

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
  # 默认的 runc 运行时配置 (确保已存在)
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
    runtime_type = "io.containerd.runc.v2"
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
      SystemdCgroup = true

  # 新增的 gVisor (runsc) 运行时配置
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]
    runtime_type = "io.containerd.runsc.v1"
1
systemctl restart containerd

使用

重点:RuntimeClass 、 name

在 Kubernetes 中创建 RuntimeClass

1
2
3
4
5
6
7
#gvisor-runtimeclass.yaml

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: gvisor
handler: runsc

告诉 Kubernetes:“当你看到这个标签时,请使用 runsc 来启动容器”。

1
kubectl apply -f gvisor-runtimeclass.yaml

pod使用 上述创建的kind

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Pod
metadata:
  name: nginx-gvisor
spec:
  runtimeClassName: gvisor  # 关键:指定使用 gvisor 运行时
  containers:
  - name: nginx
    image: nginx
本文由作者按照 CC BY 4.0 进行授权