Docker已经官宣企业用户,商业用户需要付费订阅。Kubernetes 1.21开始,缺省容器引擎采用Containerd,K3s也一样, 默认 containerd,它是一个行业标准的容器运行时。 从 Kubernetes 1.24 开始,Kubelet 不再包含 dockershim,但允许 kubelet 与 dockerd 通信。 K3s 1.24 及更高版引入 cri-dockerd,允许你无缝升级旧的 K3s 版本,同时继续使用 Docker 容器运行时。所以k3s支持Docker和Containerd容器引擎,也支持NVIDIA 容器。
-
Docker容器引擎
-
1、Docker容器引擎
1)在 K3s 节点上安装 Docker。
- 你可以使用 Rancher 的一个 Docker 安装脚本来安装 Docker:
curl https://releases.rancher.com/install-docker/20.10.sh | sh
-
使用
--docker
选项安装 K3s:curl -sfL https://get.k3s.io | sh -s - --docker
- 确认集群可用:
$ sudo k3s kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-6d59f47c7-lncxn 1/1 Running 0 51s
kube-system metrics-server-7566d596c8-9tnck 1/1 Running 0 51s
kube-system helm-install-traefik-mbkn9 0/1 Completed 1 51s
kube-system coredns-8655855d6-rtbnb 1/1 Running 0 51s
kube-system svclb-traefik-jbmvl 2/2 Running 0 43s
kube-system traefik-758cd5fc85-2wz97 1/1 Running 0 43s
- 确认 Docker 容器正在运行:
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e4d34729602 897ce3c5fc8f "entry" About a minute ago Up About a minute k8s_lb-port-443_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
bffdc9d7a65f rancher/klipper-lb "entry" About a minute ago Up About a minute k8s_lb-port-80_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
436b85c5e38d rancher/library-traefik "/traefik --configfi…" About a minute ago Up About a minute k8s_traefik_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0
de8fded06188 rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
7c6a30aeeb2f rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0
ae6c58cab4a7 9d12f9848b99 "local-path-provisio…" About a minute ago Up About a minute k8s_local-path-provisioner_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0
be1450e1a11e 9dd718864ce6 "/metrics-server" About a minute ago Up About a minute k8s_metrics-server_metrics-server-7566d596c8-9tnck_kube-system_031e74b5-e9ef-47ef-a88d-fbf3f726cbc6_0
4454d14e4d3f c4d3d16fe508 "/coredns -conf /etc…" About a minute ago Up About a minute k8s_coredns_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0
c3675b87f96c rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0
4b1fddbe6ca6 rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0
64d3517d4a95 rancher/pause:3.1 "/pause"
-
使用 etcdctl
etcdctl 提供了一个与 etcd 服务器交互的 CLI。K3s 附带 etcdctl。
如果你想使用 etcdctl 与 K3s 的嵌入式 etcd 进行交互,请参阅官方文档安装 etcdctl。
ETCD_VERSION="v3.5.5"
ETCD_URL="https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz"
curl -sL ${ETCD_URL} | sudo tar -zxv --strip-components=1 -C /usr/local/bin
然后,你可以将 etcdctl 配置为使用 K3s 管理的证书和密钥来进行身份验证,从而使用 etcdctl:
sudo etcdctl version \
--cacert=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt \
--cert=/var/lib/rancher/k3s/server/tls/etcd/client.crt \
--key=/var/lib/rancher/k3s/server/tls/etcd/client.key
2、Containerd容器引擎
K3s 会在 /var/lib/rancher/k3s/agent/etc/containerd/config.toml
中为 containerd 生成 config.toml。
如果要对这个文件进行高级定制,你可以在同一目录中创建另一个名为 config.toml.tmpl
的文件,此文件将会代替默认设置。
config.toml.tmpl
是一个 Go 模板文件,并且 config.Node
结构会被传递给模板。有关如何使用该结构自定义配置文件的 Linux 和 Windows 示例,请参阅此文件夹。 config.Node golang 结构定义在这里。
3、NVIDIA 容器
如果 容器方式使用GPU,AI等业务场景,需要采用NVIDIA 容器,它启动时会检测Cuda driver和Tensor Driver加载,K3s 将自动检测并配置。
1)按照以下说明在节点上安装 nvidia-container 包仓库: NVIDIA Container Toolkit repository | libnvidia-container
2)安装 nvidia 容器运行时包。例如: apt install -y nvidia-container-runtime cuda-drivers-fabricmanager-515 nvidia-headless-515-server
3)安装 K3s,如果已经安装则重启它: curl -ksL get.k3s.io | sh -
4) 确认 K3s 已经找到 nvidia 容器运行时: grep nvidia /var/lib/rancher/k3s/agent/etc/containerd/config.toml
这将根据找到的运行时可执行文件自动将 nvidia
和/或 nvidia-experimental
运行时添加到 containerd 配置中。 你仍然必须向集群添加 RuntimeClass 定义,并通过在 Pod 规范中设置 runtimeClassName: nvidia
来部署显式请求运行时的 Pod:
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: nvidia
handler: nvidia
---
apiVersion: v1
kind: Pod
metadata:
name: nbody-gpu-benchmark
namespace: default
spec:
restartPolicy: OnFailure
runtimeClassName: nvidia
containers:
- name: cuda-container
image: nvcr.io/nvidia/k8s/cuda-sample:nbody
args: ["nbody", "-gpu", "-benchmark"]
resources:
limits:
nvidia.com/gpu: 1
env:
- name: NVIDIA_VISIBLE_DEVICES
value: all
- name: NVIDIA_DRIVER_CAPABILITIES
value: all
请注意,NVIDIA Container Runtime 也经常与 NVIDIA Device Plugin 和 GPU Feature Discovery 一起使用,它们必须单独安装,而且需要修改以确保 Pod 规范能包括 runtimeClassName: nvidia
,如前所述。