Kubernetes集群部署AI服务指南
为什么要用Kubernetes跑AI服务
AI模型通常需要GPU、弹性扩缩和稳定的服务编排。
原生Docker管理单个容器还行,一旦要应对高并发、滚动更新或资源隔离,就力不从心。Kubernetes集群(K8s) 正好接住这些问题——它能自动调度GPU节点、自愈失败Pod,还能通过Service统一暴露端口。
本文用最简单的方式,让你在本地或单机环境搭起一个小型K8s,并部署一个AI推理服务。
第一步:准备环境与核心工具
你不需要多台服务器,一台内存8G以上的Linux虚拟机(Ubuntu 22.04)就行。
需要装好以下软件:
- Docker:容器运行时,K8s依赖它拉取镜像。
- Minikube:单机版K8s,便于学习和测试。
- kubectl:K8s命令行工具,用来操作集群。
- NVIDIA Container Toolkit(如果要用GPU):让容器识别宿主机的NVIDIA显卡。
安装Docker(跳过具体步骤,但必须加上源)。
sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
然后安装Minikube(用二进制方式,避免apt源版本太老):
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
安装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
避坑注意:如果你用虚拟机,记得给虚拟机分配至少2个CPU核心和4GB内存,否则Minikube启动会报资源不足。
第二步:启动Minikube并检验集群
执行以下命令启动一个单节点集群,并指定驱动器为Docker:
minikube start --driver=docker
等待几分钟,直到提示 Done。
用kubectl查看节点状态:
kubectl get nodes
输出应该显示一个 Ready 状态的节点。
如果你有NVIDIA GPU,需要额外启动参数:
minikube start --driver=docker --gpus all
这个参数会自动启用NVIDIA插件。
第三步:准备AI服务的镜像与配置
下面部署一个TensorFlow Serving示例,它提供一个基于ResNet50的图像分类API。
先拉取镜像:
docker pull tensorflow/serving:2.13.0-gpu
创建一个Deployment YAML文件 ai-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tf-serving
spec:
replicas: 2
selector:
matchLabels:
app: tf-serving
template:
metadata:
labels:
app: tf-serving
spec:
containers:
- name: tf-serving
image: tensorflow/serving:2.13.0-gpu
ports:
- containerPort: 8501
args: ["--model_name=resnet", "--model_base_path=/models/resnet"]
volumeMounts:
- name: model-volume
mountPath: /models/resnet
resources:
limits:
nvidia.com/gpu: 1
volumes:
- name: model-volume
hostPath:
path: /home/user/models/resnet
说明:你需要提前把ResNet50模型文件放在宿主机的/home/user/models/resnet目录下(模型文件可以从TensorFlow官网下载)。若不用GPU,去掉resources和args中的GPU相关字段,镜像改为tensorflow/serving即可。
然后暴露Service:
kubectl apply -f ai-deployment.yaml
kubectl expose deployment tf-serving --type=NodePort --port=8501
查看Pod状态和Service端口:
kubectl get pods
kubectl get svc tf-serving
Service的 PORT(S) 一列会显示类似 8501:31111/TCP,外部访问就用 NodeIP:31111。
第四步:避坑指南——常见报错与解决方法
- Minikube启动卡在“Downloading”:网络问题,换国内源或用代理。可以设置
minikube start --image-mirror-country=cn。 - Pod一直Pending,Events显示“0/1 nodes are available”:检查节点资源或GPU驱动。运行
minikube logs查看详情。 - GPU Pod启动但报错“no NVIDIA GPU found”:确认容器运行时是否支持GPU,运行
kubectl describe node查看nvidia.com/gpu的Capacity是否为0。 - Service无法访问:Minikube集群默认在虚拟机内,需要在宿主机用
minikube service tf-serving命令打开隧道。
第五步:验证AI服务正常响应
用curl发送一张测试图片到服务接口(需要先准备一张 cat.jpg):
curl -X POST http://$(minikube ip):$(kubectl get svc tf-serving -o jsonpath='{.spec.ports[0].nodePort}')/v1/models/resnet:predict -d @- <
实际使用时要把图片转成Base64。
更简单的验证:访问Service的元数据接口,检查模型状态:
curl http://$(minikube ip):$(kubectl get svc tf-serving -o jsonpath='{.spec.ports[0].nodePort}')/v1/models/resnet
返回 "model_version_status": 即部署成功。
[{"version":
"1", "state":
"AVAILABLE"}]
最后几句提醒
如果你在生产环境部署,建议用kubeadm或托管K8s(如阿里云ACK)代替Minikube,并用Helm Chart管理复杂服务。
初次上手先按照本文步骤走通流程,再根据自己训练的模型调整镜像和端口。
遇到Pod重启时,第一时间看日志 kubectl logs ,定位问题更快。