保姆级教程:在Ubuntu上搞定K8S v1.28.15 + Docker + GPU支持(含离线包和避坑指南)

张开发
2026/4/18 23:41:22 15 分钟阅读

分享文章

保姆级教程:在Ubuntu上搞定K8S v1.28.15 + Docker + GPU支持(含离线包和避坑指南)
企业级K8S离线部署实战Ubuntu环境下的DockerGPU全栈方案在数字化转型浪潮中Kubernetes已成为企业容器编排的事实标准但生产环境往往面临严格的内网隔离要求。想象一下这样的场景数据中心服务器无法访问外网却需要部署支持GPU加速的AI训练平台或是金融行业因合规要求必须完全离线搭建容器云。本文将手把手带您突破网络边界限制在Ubuntu系统上完成K8S v1.28.15DockerGPU支持的全套离线部署方案。1. 离线环境准备与依赖管理1.1 系统基础配置在开始前确保所有目标服务器满足以下条件Ubuntu 20.04/22.04 LTS推荐最小化安装至少2核CPU/4GB内存/50GB磁盘空间已配置静态IP和主机名解析拥有sudo权限的运维账户关键系统参数调整所有节点均需执行# 禁用swap并持久化配置 sudo swapoff -a sudo sed -i / swap / s/^/#/ /etc/fstab # 加载内核模块 cat EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF # 设置网络参数 cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system1.2 离线资源包规划建议提前准备以下资源包可通过跳板机下载后传输Docker CE离线包包含docker-ce_28.0.2_amd64.deb及所有依赖NVIDIA容器工具包libnvidia-container*nvidia-container-runtime*nvidia-container-toolkit*Kubernetes组件kubeadm_1.28.15_amd64.debkubelet_1.28.15_amd64.debkubectl_1.28.15_amd64.deb容器镜像归档k8s-core-images.tar含API Server等控制平面组件flannel-images.tar网络插件nvidia-device-plugin.tarGPU支持提示使用docker save和docker load命令可实现镜像的离线迁移例如docker save -o k8s-core-images.tar registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.15 ...2. Docker离线部署与GPU集成2.1 手动安装Docker CE不同于在线安装离线部署需要处理复杂的依赖关系。以下是经过验证的安装流程按顺序安装依赖包sudo dpkg -i containerd.io_1.7.5_amd64.deb sudo dpkg -i docker-ce-cli_28.0.2_amd64.deb sudo dpkg -i docker-ce_28.0.2_amd64.deb验证安装sudo docker version --format {{.Server.Version}} # 预期输出28.0.2配置国内镜像加速如有内部仓库{ registry-mirrors: [https://内部仓库地址], exec-opts: [native.cgroupdriversystemd] }2.2 NVIDIA容器工具链集成GPU支持是AI场景下的刚需离线环境需特别注意驱动兼容性组件版本要求兼容性说明主机驱动≥525.60.13需与CUDA版本匹配nvidia-container-toolkit1.17.5依赖libnvidia-containerk8s-device-plugin0.17.1对应K8S 1.28安装步骤# 按顺序安装NVIDIA容器组件 sudo dpkg -i libnvidia-container1_1.17.5-1_amd64.deb sudo dpkg -i nvidia-container-toolkit-base_1.17.5-1_amd64.deb sudo dpkg -i nvidia-container-toolkit_1.17.5-1_amd64.deb # 验证GPU可见性 docker run --rm --gpus all nvidia/cuda:12.2-base nvidia-smi3. Kubernetes离线集群搭建3.1 解决Docker与K8S兼容问题由于K8S自v1.24起移除了对Docker的直接支持我们需要通过cri-dockerd桥接部署cri-dockerd组件sudo cp cri-dockerd /usr/bin/ sudo chmod x /usr/bin/cri-dockerd配置systemd服务单元# /etc/systemd/system/cri-docker.service [Unit] DescriptionCRI Interface for Docker Afternetwork.target docker.service [Service] ExecStart/usr/bin/cri-dockerd \ --container-runtime-endpoint fd:// \ --pod-infra-container-image registry.aliyuncs.com/google_containers/pause:3.9 Restartalways加载并启动服务sudo systemctl daemon-reload sudo systemctl enable --now cri-docker3.2 控制平面初始化使用预拉取的镜像初始化集群sudo kubeadm init \ --cri-socket unix:///var/run/cri-dockerd.sock \ --pod-network-cidr10.244.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.28.15 \ --upload-certs关键参数说明--image-repository指定离线镜像仓库路径--upload-certs自动生成证书便于节点加入--cri-socket指向cri-dockerd的套接字3.3 网络插件部署Flannel的离线部署需要特别注意镜像标签# 加载预存的Flannel镜像 docker load -i flannel-images.tar # 应用定制化的Flannel配置 kubectl apply -f - EOF apiVersion: apps/v1 kind: DaemonSet metadata: name: kube-flannel-ds namespace: kube-flannel spec: template: spec: containers: - name: kube-flannel image: ghcr.io/flannel-io/flannel:v0.26.4 EOF4. GPU节点扩展与运维技巧4.1 节点批量加入方案针对大规模集群建议使用自动化脚本添加节点#!/bin/bash # add_node.sh 节点IP join命令 NODE_IP$1 JOIN_CMD$2 scp -r /opt/k8s-offline $NODE_IP:/opt/ ssh $NODE_IP EOF cd /opt/k8s-offline ./install_docker.sh ./install_k8s.sh $JOIN_CMD EOF脚本依赖的目录结构/opt/k8s-offline ├── install_docker.sh # Docker安装脚本 ├── install_k8s.sh # Kubelet配置脚本 ├── images/ # 所有容器镜像 └── conf/ # 配置文件模板4.2 常见故障排查指南问题1GPU设备未识别# 检查设备插件日志 kubectl logs -n kube-system ds/nvidia-device-plugin # 验证节点资源 kubectl describe node 节点名 | grep nvidia.com/gpu问题2镜像拉取失败解决方案使用ctr image import命令导入containerd格式镜像备用方案搭建本地registry并重打标签问题3cri-dockerd超时# 增加服务超时配置 sudo sed -i /^ExecStart/ s/$/ --network-plugincni --cni-conf-dir/etc/cni/net.d/ \ /etc/systemd/system/cri-docker.service sudo systemctl restart cri-docker在最近为某医疗影像分析平台部署的离线K8S集群中上述方案成功在3天内完成了20个GPU节点的部署期间最大的挑战是NVIDIA驱动版本与容器工具链的兼容性问题。最终通过标准化基础镜像和版本锁定解决了稳定性问题。

更多文章