AI应用的容器化部署:从Docker到Kubernetes

前言
我们的产品从单服务器部署到多服务器部署时,遇到了很多问题:环境不一致、部署复杂、扩容困难。
后来我们引入了容器化和 Kubernetes,问题迎刃而解。今天,分享我们的实践经验。
一、容器化基础
1.1 Docker 入门
python
class DockerSetup:
def create_dockerfile(self) -> str:
"""创建 Dockerfile"""
return """
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
"""
1.2 Docker Compose
python
class DockerCompose:
def create_config(self) -> dict:
"""创建 Docker Compose 配置"""
return {
"version": "3.8",
"services": {
"web": {
"build": ".",
"ports": ["8000:8000"],
"depends_on": ["redis"]
},
"redis": {
"image": "redis:7-alpine"
}
}
}
二、Kubernetes 入门
2.1 Pod 配置
python
class KubernetesPod:
def create_pod(self) -> dict:
"""创建 Pod 配置"""
return {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {"name": "ai-app"},
"spec": {
"containers": [{
"name": "app",
"image": "ai-app:latest",
"ports": [{"containerPort": 8000}]
}]
}
}
2.2 Deployment 配置
python
class KubernetesDeployment:
def create_deployment(self) -> dict:
"""创建 Deployment"""
return {
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {"name": "ai-app"},
"spec": {
"replicas": 3,
"selector": {"matchLabels": {"app": "ai-app"}},
"template": {
"metadata": {"labels": {"app": "ai-app"}},
"spec": {
"containers": [{
"name": "app",
"image": "ai-app:latest",
"ports": [{"containerPort": 8000}]
}]
}
}
}
}
三、服务发现与负载均衡
3.1 Service 配置
python
class KubernetesService:
def create_service(self) -> dict:
"""创建 Service"""
return {
"apiVersion": "v1",
"kind": "Service",
"metadata": {"name": "ai-app-service"},
"spec": {
"selector": {"app": "ai-app"},
"ports": [{"port": 80, "targetPort": 8000}],
"type": "LoadBalancer"
}
}
3.2 Ingress 配置
python
class KubernetesIngress:
def create_ingress(self) -> dict:
"""创建 Ingress"""
return {
"apiVersion": "networking.k8s.io/v1",
"kind": "Ingress",
"metadata": {"name": "ai-app-ingress"},
"spec": {
"rules": [{
"host": "api.example.com",
"http": {
"paths": [{
"path": "/",
"pathType": "Prefix",
"backend": {
"service": {
"name": "ai-app-service",
"port": {"number": 80}
}
}
}]
}
}]
}
}
四、CI/CD 集成
4.1 持续集成
python
class CICDWorkflow:
def create_workflow(self) -> dict:
"""创建 CI/CD 工作流"""
return {
"name": "CI/CD",
"on": {"push": {"branches": ["main"]}},
"jobs": {
"build": {"steps": ["checkout", "build", "test"]},
"deploy": {"steps": ["deploy"]}
}
}
4.2 自动部署
python
class AutoDeployment:
def deploy(self, image_tag: str) -> dict:
"""自动部署"""
return {
"image": f"ai-app:{image_tag}",
"strategy": "rollingUpdate",
"success": True
}
五、最佳实践
5.1 容器化原则
- ✅ 单一职责:每个容器只运行一个进程
- ✅ 不可变容器:容器创建后不修改
- ✅ 健康检查:配置 liveness 和 readiness 探针
- ✅ 资源限制:设置 CPU 和内存限制
5.2 Kubernetes 最佳实践
- ✅ 副本管理:使用 Deployment 管理 Pod
- ✅ 服务发现:使用 Service 进行服务发现
- ✅ 配置管理:使用 ConfigMap 和 Secret
- ✅ 自动扩缩容:使用 Horizontal Pod Autoscaler
六、总结
容器化和 Kubernetes 是现代化部署的基石。关键在于:
- 标准化环境:确保开发、测试、生产环境一致
- 自动化部署:减少人工操作
- 弹性伸缩:根据负载自动调整
- 持续改进:不断优化部署流程
记住:容器化不是目的,是手段。