2. 环境准备

在开始大模型部署实战之前,必须先准备好一套可用的Kubernetes环境。大模型推理、微调训练等任务对GPU资源、内存带宽和网络延迟有极高要求,因此集群的搭建方式直接决定了后续实验的效率和可复现性。本章将系统讲解三种主流集群搭建方案——Minikube(本地单节点)、Kind(Docker-in-Docker多节点模拟)和云托管集群(如ACK、EKS、GKE),并深入介绍kubectl的安装配置与必要插件(如GPU调度插件、Ingress Controller、Metrics Server)的部署方法。通过本章学习,你将能够根据自身硬件条件和业务目标,选择最合适的集群方案,并完成从零到可用的完整环境搭建。

Kubernetes集群环境搭建方案决策与工具链 方案A:Minikube 本地单节点 • 适合:个人开发/学习 • 资源:≥4核CPU, 8GB内存 • GPU:需额外配置nvidia-driver • 启动:minikube start --gpus • 限制:单节点,无HA 方案B:Kind Docker容器模拟多节点 • 适合:CI/CD测试/多节点模拟 • 资源:≥8核CPU, 16GB内存 • GPU:支持GPU直通(需配置) • 启动:kind create cluster • 限制:网络性能有损耗 方案C:云托管集群 ACK/EKS/GKE • 适合:生产/大规模GPU集群 • 资源:按需弹性伸缩 • GPU:A100/H100等专业卡 • 启动:云控制台/CLI • 限制:成本较高 统一工具链 kubectl Helm GPU插件 Ingress Metrics 验证命令 kubectl get nodes && kubectl get pods -A

上图展示了三种集群方案的定位差异与统一工具链的关系。在实际选择时,需要综合考虑硬件资源、实验目的、成本预算和运维能力。下面我们将逐一深入分析每种方案的搭建细节与适用场景。

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中的路径必须与宿主机实际路径一致。

风险提示:Kind的GPU直通方案存在一定局限性。由于容器共享宿主机内核,GPU驱动版本必须严格匹配;且多个工作节点无法同时使用同一块GPU。对于需要多GPU并行的大模型训练场景,建议直接使用云托管集群或物理机集群。

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模式。
经验总结:对于大模型部署实战课程,推荐的学习路径是:先在Minikube上熟悉kubectl基本操作和YAML编写,然后切换到Kind模拟多节点环境,测试GPU调度和分布式推理,最后在云托管集群上进行生产级部署。每一步都建议记录环境配置参数和踩坑日志,形成自己的环境搭建手册。

最后,验证环境是否就绪的完整命令集如下:

# 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集群,为后续的大模型部署实验打下坚实基础。