2. 环境准备
在开始大模型部署实战之前,必须先准备好一套可用的Kubernetes环境。大模型推理、微调训练等任务对GPU资源、内存带宽和网络延迟有极高要求,因此集群的搭建方式直接决定了后续实验的效率和可复现性。本章将系统讲解三种主流集群搭建方案——Minikube(本地单节点)、Kind(Docker-in-Docker多节点模拟)和云托管集群(如ACK、EKS、GKE),并深入介绍kubectl的安装配置与必要插件(如GPU调度插件、Ingress Controller、Metrics Server)的部署方法。通过本章学习,你将能够根据自身硬件条件和业务目标,选择最合适的集群方案,并完成从零到可用的完整环境搭建。
上图展示了三种集群方案的定位差异与统一工具链的关系。在实际选择时,需要综合考虑硬件资源、实验目的、成本预算和运维能力。下面我们将逐一深入分析每种方案的搭建细节与适用场景。
2.1 核心原理:Kubernetes集群的组成与工作负载调度基础
Kubernetes集群本质上是一个由控制平面(Control Plane)和工作节点(Worker Nodes)组成的分布式系统。控制平面负责集群状态管理、调度决策和API服务,而工作节点则承载实际的应用容器。对于大模型部署而言,工作节点通常需要配备高性能GPU(如NVIDIA A100、H100或消费级RTX 4090),并且需要Kubernetes能够识别并调度这些GPU资源。
在环境准备阶段,我们需要理解三个关键概念:节点(Node)、Pod和资源请求(Resource Requests)。节点是集群中的物理或虚拟机器,Pod是Kubernetes调度的最小单位,而资源请求则告诉调度器每个Pod需要多少CPU、内存和GPU。大模型推理服务通常需要声明GPU资源(如nvidia.com/gpu: 1),这要求集群中必须安装NVIDIA Device Plugin。
此外,集群的网络模型也至关重要。Kubernetes要求每个Pod拥有独立的IP地址,Pod之间可以直接通信。对于大模型分布式推理(如Tensor Parallelism),节点间的网络带宽和延迟直接影响性能。因此,在搭建集群时,需要选择支持高性能网络的CNI插件(如Calico、Cilium),并确保节点间网络配置正确。
2.2 判断方法与操作流程:三种集群搭建方案的详细步骤
选择哪种方案,取决于你的具体场景。下表对比了三种方案的关键差异,帮助你做出决策:
| 对比维度 | Minikube | Kind | 云托管集群 |
|---|---|---|---|
| 节点数量 | 单节点(可扩展多节点) | 多节点(容器模拟) | 多节点(物理/虚拟) |
| GPU支持 | 需手动配置nvidia-docker | 支持GPU直通(需宿主机支持) | 原生支持(选择GPU实例规格) |
| 启动时间 | 3-5分钟 | 2-3分钟 | 10-15分钟(含资源创建) |
| 适合场景 | 个人学习、小模型测试 | CI/CD、多节点模拟、开发测试 | 生产环境、大规模训练/推理 |
| 成本 | 免费(仅耗电) | 免费(仅耗电) | 按量付费(GPU实例较贵) |
| 运维复杂度 | 低 | 中 | 高(但云厂商提供托管) |
下面分别介绍三种方案的搭建流程。
2.2.1 Minikube搭建流程
Minikube是最轻量级的本地集群方案,适合在个人电脑上快速启动一个单节点集群。它支持多种驱动(Docker、VirtualBox、KVM等),推荐使用Docker驱动以简化依赖。
# 1. 安装Minikube(以Linux为例)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 2. 启动集群(指定Docker驱动和资源配额)
minikube start --driver=docker --cpus=4 --memory=8192 --disk-size=20g
# 3. 验证集群状态
kubectl get nodes
kubectl cluster-info
如果需要GPU支持,Minikube提供了--gpus参数,但要求宿主机已安装NVIDIA驱动和nvidia-container-toolkit。启动命令如下:
minikube start --driver=docker --gpus all
启动后,Minikube会自动配置kubectl的上下文(context),并安装必要的组件(如CoreDNS、Storage Provisioner)。但需要注意的是,Minikube默认不安装NVIDIA Device Plugin,需要手动部署:
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml
2.2.2 Kind搭建流程
Kind(Kubernetes in Docker)通过Docker容器模拟多个节点,非常适合在本地模拟多节点集群环境,用于测试分布式调度和网络策略。Kind的配置文件采用YAML格式,可以灵活定义节点数量和角色。
# 1. 安装Kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 2. 创建多节点集群配置文件 kind-config.yaml
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
# 3. 创建集群
kind create cluster --config kind-config.yaml --name llm-cluster
# 4. 验证节点
kubectl get nodes
Kind集群默认使用kindnet作为CNI插件,对于大模型场景,建议替换为Calico以支持更精细的网络策略。此外,Kind的GPU支持需要额外配置,因为容器内访问GPU需要挂载设备文件。一种常见做法是使用NVIDIA Container Toolkit,并在Kind配置中指定GPU设备。
2.2.3 云托管集群搭建流程
云托管集群(如阿里云ACK、AWS EKS、Google GKE)是最接近生产环境的方案。以阿里云ACK为例,创建GPU集群的步骤如下:
# 1. 安装阿里云CLI并配置凭证
aliyun configure
# 2. 创建集群(使用GPU实例规格)
aliyun cs POST /clusters --body '{
"name": "llm-gpu-cluster",
"region_id": "cn-hangzhou",
"vpcid": "vpc-xxxx",
"container_cidr": "172.20.0.0/16",
"service_cidr": "172.21.0.0/20",
"worker_instance_types": ["ecs.gn6i-c4g1.xlarge"],
"worker_system_disk_category": "cloud_essd",
"num_of_nodes": 3,
"login_password": "YourPassword123!"
}'
云托管集群的优势在于:控制平面由云厂商管理,无需关心etcd和API Server的高可用;GPU实例规格丰富,支持A100、H100等专业卡;自动集成云监控、日志服务和Ingress Controller。但需要注意,云集群的成本较高,且网络配置(如安全组、VPC路由)需要一定的云网络知识。
2.3 案例拆解:从零搭建一个支持GPU的Kind集群用于大模型推理测试
下面通过一个完整案例,演示如何搭建一个支持GPU的Kind集群,并部署一个简单的GPU测试Pod。该案例的背景是:某算法团队需要在本地验证一个7B参数大模型的推理性能,但只有一台配备RTX 4090 GPU的工作站,希望模拟多节点环境以测试分布式推理。
初始环境与约束:
- 宿主机:Ubuntu 22.04,RTX 4090 24GB,Docker 24.0,NVIDIA驱动535.104.05
- 目标:创建1个控制平面节点+2个工作节点的Kind集群,每个工作节点可调度GPU
- 约束:宿主机只有1块GPU,因此只能将GPU直通给其中一个工作节点
操作步骤:
# 1. 安装NVIDIA Container Toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 2. 创建Kind配置,指定GPU设备
cat <<EOF > kind-gpu.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
extraMounts:
- hostPath: /dev/nvidia0
containerPath: /dev/nvidia0
- hostPath: /dev/nvidiactl
containerPath: /dev/nvidiactl
- hostPath: /dev/nvidia-modeset
containerPath: /dev/nvidia-modeset
- hostPath: /usr/lib/x86_64-linux-gnu/libcuda.so.1
containerPath: /usr/lib/x86_64-linux-gnu/libcuda.so.1
- hostPath: /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.535
containerPath: /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.535
EOF
# 3. 创建集群
kind create cluster --config kind-gpu.yaml --name gpu-test
# 4. 部署NVIDIA Device Plugin
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml
# 5. 验证GPU可调度
kubectl get nodes -o json | jq '.items[].status.allocatable'
结果与验证:执行kubectl get nodes -o json后,可以看到其中一个工作节点的allocatable字段中包含"nvidia.com/gpu": "1"。随后部署一个测试Pod:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda-test
image: nvidia/cuda:12.0-base
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
EOF
kubectl logs gpu-test
输出应显示RTX 4090的详细信息。该案例验证了Kind集群中GPU直通的可行性,但需要特别注意:宿主机必须安装与容器内CUDA版本兼容的驱动,且extraMounts中的路径必须与宿主机实际路径一致。
2.4 安装kubectl与必要插件
无论选择哪种集群方案,kubectl都是与集群交互的核心工具。安装kubectl的推荐方式如下:
# 下载最新稳定版
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 验证安装
kubectl version --client
除了kubectl,以下插件对于大模型部署至关重要:
| 插件名称 | 作用 | 安装方式 |
|---|---|---|
| NVIDIA Device Plugin | 将GPU资源暴露给Kubernetes调度器 | kubectl apply -f nvidia-device-plugin.yml |
| Metrics Server | 提供Pod和节点的CPU/内存监控数据 | kubectl apply -f components.yaml |
| Ingress Controller | 管理外部访问流量,支持TLS终结 | helm install ingress-nginx ingress-nginx/ingress-nginx |
| Helm | Kubernetes包管理器,简化应用部署 | curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash |
安装Metrics Server后,可以执行kubectl top nodes查看资源使用情况,这对于监控大模型推理服务的GPU利用率至关重要。Ingress Controller则用于将外部HTTP请求路由到推理服务,支持基于路径和域名的路由规则。
2.5 常见误区与总结复盘
在环境准备过程中,初学者常犯以下错误:
- 误区一:忽略kubectl版本与集群版本的兼容性。kubectl的版本应与集群版本相差不超过一个次要版本,否则可能出现API兼容性问题。
- 误区二:在Minikube中直接部署大模型。Minikube的资源限制(默认2核4GB)无法满足大模型推理需求,即使调整参数,单节点也无法模拟分布式推理。
- 误区三:忘记配置GPU资源限制。如果Pod没有声明
nvidia.com/gpu资源限制,调度器不会将GPU分配给该Pod,导致推理服务无法使用GPU。 - 误区四:忽略网络插件对性能的影响。默认的kube-proxy使用iptables模式,在大流量场景下性能较差。建议使用IPVS模式或Cilium的eBPF模式。
最后,验证环境是否就绪的完整命令集如下:
# 1. 检查节点状态
kubectl get nodes -o wide
# 2. 检查GPU资源
kubectl describe node <node-name> | grep -A5 "Allocatable"
# 3. 检查核心组件
kubectl get pods -n kube-system
# 4. 验证GPU调度
kubectl run gpu-test --image=nvidia/cuda:12.0-base --restart=Never -- nvidia-smi
通过以上步骤,你将获得一个功能完整、支持GPU调度的Kubernetes集群,为后续的大模型部署实验打下坚实基础。