在虚拟机/服务器安装(K3S)
在服务器或虚拟机上用 K3s 搭建集群,再安装 TensorFusion
TensorFusion 的 GPU 资源池运行在 Kubernetes 上。如果手里只有物理机或虚拟机,按本文先把它们组成一个轻量的 K3s 集群,把 GPU 服务器作为节点加入,之后安装 TensorFusion 的方式和其他 Kubernetes 集群完全一样。
K3s 与这些机器上已有的服务并存,不需要把现有服务容器化,也不需要迁移。
如果已经有 Kubernetes 集群,直接看在 Kubernetes 安装。如果想不经过 Kubernetes,在虚拟机里直接使用宿主机的 GPU,见在宿主机/虚拟机安装。
前置条件
- 一台 Linux 机器,用作 K3s server(控制面)。有没有 GPU 都可以。
- 一台或多台带 NVIDIA GPU 的 Linux 机器。server 所在的机器也可以是其中之一。
- 每台 GPU 机器已安装 NVIDIA 驱动,
nvidia-smi能正常运行。不能运行时先安装驱动。 - 每台机器都有 root 权限。本文所有命令都以 root 身份执行。
- GPU 机器能访问 server 机器的 6443 端口。
- 每台机器能从 Docker Hub 拉取镜像,或者使用下一节的镜像加速配置。
选择下载源
在每台机器上先执行下面其中一组命令,再做后面的步骤。后面的命令会用到 $K3S_INSTALL_URL。
export K3S_INSTALL_URL=https://get.k3s.ioexport K3S_INSTALL_URL=https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
export INSTALL_K3S_MIRROR=cn
# 通过镜像站拉取镜像,并把 tensorfusion/* 镜像改为从国内镜像仓库拉取
mkdir -p /etc/rancher/k3s/
cat > /etc/rancher/k3s/registries.yaml << 'EOF'
mirrors:
docker.io:
endpoint:
- "https://docker.m.daocloud.io"
- "https://docker.1ms.run"
gcr.io:
endpoint:
- "https://gcr.m.daocloud.io"
ghcr.io:
endpoint:
- "https://ghcr.m.daocloud.io"
registry.k8s.io:
endpoint:
- "https://k8s.m.daocloud.io"
nvcr.io:
endpoint:
- "https://nvcr.m.daocloud.io"
quay.io:
endpoint:
- "https://quay.m.daocloud.io"
configs:
"docker.io":
auth: {}
tls: {}
rewrite:
"^docker.io/tensorfusion/(.*)": "registry.cn-hangzhou.aliyuncs.com/tensorfusion/$1"
EOF第 1 步:准备每台 GPU 机器
每台带 GPU 的机器都要做这一步,server 机器如果有 GPU 也一样。必须在这台机器安装 K3s 之前完成。
-
安装 NVIDIA Container Toolkit。其他发行版参考 NVIDIA 安装指南。
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ tee /etc/apt/sources.list.d/nvidia-container-toolkit.list apt-get update apt-get install -y nvidia-container-toolkitcurl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \ tee /etc/yum.repos.d/nvidia-container-toolkit.repo dnf install -y nvidia-container-toolkit # 没有 dnf 时:yum install -y nvidia-container-toolkitcurl -fsSL https://mirrors.ustc.edu.cn/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://mirrors.ustc.edu.cn/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://nvidia.github.io#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://mirrors.ustc.edu.cn#g' | \ tee /etc/apt/sources.list.d/nvidia-container-toolkit.list apt-get update apt-get install -y nvidia-container-toolkitcurl -s -L https://mirrors.ustc.edu.cn/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \ sed 's#nvidia.github.io/libnvidia-container/stable/#mirrors.ustc.edu.cn/libnvidia-container/stable/#g' | \ sed 's#nvidia.github.io/libnvidia-container/experimental/#mirrors.ustc.edu.cn/libnvidia-container/experimental/#g' | \ tee /etc/yum.repos.d/nvidia-container-toolkit.repo dnf install -y nvidia-container-toolkit # 没有 dnf 时:yum install -y nvidia-container-toolkit -
把 NVIDIA runtime 设为 K3s 的默认容器运行时。K3s 启动时会读取这个模板:
mkdir -p /var/lib/rancher/k3s/agent/etc/containerd/ cat > /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl << 'EOF' version = 2 [plugins."io.containerd.internal.v1.opt"] path = "/var/lib/rancher/k3s/agent/containerd" [plugins."io.containerd.grpc.v1.cri"] stream_server_address = "127.0.0.1" stream_server_port = "10010" enable_selinux = false enable_unprivileged_ports = true enable_unprivileged_icmp = true device_ownership_from_security_context = false sandbox_image = "rancher/mirrored-pause:3.6" [plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs" disable_snapshot_annotations = true [plugins."io.containerd.grpc.v1.cri".cni] bin_dir = "/var/lib/rancher/k3s/data/cni" conf_dir = "/var/lib/rancher/k3s/agent/etc/cni/net.d" [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 BinaryName = "/usr/bin/nvidia-container-runtime" [plugins."io.containerd.grpc.v1.cri".registry] config_path = "/var/lib/rancher/k3s/agent/etc/containerd/certs.d" EOF这个模板是 containerd 配置的第 2 版格式。内置 containerd 2.x 的 K3s 版本改为读取
config-v3.toml.tmpl。如果安装后 GPU Pod 里看不到 GPU,请按你的 K3s 版本查阅 K3s 文档中关于 NVIDIA 容器运行时的说明。
第 2 步:安装 K3s server
在 server 机器上,按机器是否有 GPU 选择对应的命令。--tls-san 把机器的公网 IP 加进 API server 证书,这样才能从外部用 kubectl 访问;只在内网访问集群时可以去掉这个参数。
curl -sfL $K3S_INSTALL_URL | sh -s - server --tls-san $(curl -s https://ifconfig.me)# 先在这台机器上完成第 1 步
curl -sfL $K3S_INSTALL_URL | sh -s - server \
--node-label nvidia.com/gpu.present=true \
--tls-san $(curl -s https://ifconfig.me)TensorFusion 靠标签 nvidia.com/gpu.present=true 识别 GPU 节点。
确认 server 节点为 Ready,然后查看加入集群用的 token,下一步要用:
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes
cat /var/lib/rancher/k3s/server/node-token第 3 步:把 GPU 机器加入集群
在其余每台 GPU 机器上,先完成第 1 步,再执行:
export MASTER_IP=<server 机器的内网 IP>
export K3S_TOKEN=<第 2 步得到的 token>
curl -sfL $K3S_INSTALL_URL | K3S_URL=https://$MASTER_IP:6443 K3S_TOKEN=$K3S_TOKEN \
INSTALL_K3S_EXEC="--node-label nvidia.com/gpu.present=true" sh -s -如果安装脚本因为 container-selinux 依赖报错,设置下面的变量后重新执行安装命令:
export INSTALL_K3S_SKIP_SELINUX_RPM=true第 4 步:检查 GPU 节点
在 server 机器上执行:
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes -l nvidia.com/gpu.present=true每台 GPU 机器都应该出现在列表里,状态为 Ready:
NAME STATUS ROLES AGE VERSION
gpu-node-1 Ready <none> 2m v1.32.1+k3s1第 5 步:安装 TensorFusion
-
在 server 机器上安装 Helm,K3s 不自带 Helm。保持
KUBECONFIG=/etc/rancher/k3s/k3s.yaml这个环境变量,Helm 和kubectl才能连上集群。 -
从两种安装方式里选一种:
- 在 Kubernetes 安装:把集群接入 TensorFusion 控制台。
- Helm 快速安装:只用 Helm。
如果前面选了中国大陆镜像加速,Helm 命令里还要加上
-f https://download.tensor-fusion.ai/values-cn.yaml,两篇文档里都有说明。 -
按所选文档里的验证步骤操作,最后会有一个测试 Pod 跑在 vGPU 上。
卸载
-
卸载 TensorFusion,见在 Kubernetes 安装的卸载一节。
-
在每台以 agent 身份加入的 GPU 机器上卸载 K3s:
/usr/local/bin/k3s-agent-uninstall.sh -
在 server 机器上卸载 K3s:
/usr/local/bin/k3s-uninstall.sh
下一步
- 创建 AI 应用:把自己的应用跑在 vGPU 上。
- 迁移现有应用:把现在使用 GPU 的服务迁到 TensorFusion。
- TensorFusion 架构:各组件如何协作。
TensorFusion 文档