Kompose Docker Compose 转 K8S 教程
当你在搬瓦工 VPS 上使用 Docker Compose 管理容器应用,并准备迁移到 Kubernetes 集群时,Kompose 是一个非常实用的迁移工具。它可以将 Docker Compose 文件自动转换为 Kubernetes 的 Deployment、Service、PersistentVolumeClaim 等资源配置文件,大大简化了从 Compose 到 K8S 的迁移过程。
一、安装 Kompose
# 下载最新版本
curl -Lo kompose https://github.com/kubernetes/kompose/releases/latest/download/kompose-linux-amd64
chmod +x kompose
mv kompose /usr/local/bin/
kompose version
二、基本转换
2.1 从 Compose 文件生成 K8S 配置
# 准备 Docker Compose 文件
cat > docker-compose.yml <<'EOF'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- web-data:/usr/share/nginx/html
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
web-data:
EOF
# 转换为 Kubernetes YAML 文件
kompose convert
# 转换后生成的文件:
# web-deployment.yaml
# web-service.yaml
# redis-deployment.yaml
# redis-service.yaml
# web-data-persistentvolumeclaim.yaml
2.2 直接部署到 Kubernetes
# 直接转换并部署(需要 kubectl 已配置)
kompose up
# 删除部署的资源
kompose down
2.3 指定输出格式
# 输出为 Helm Chart
kompose convert --chart
# 输出为单个文件
kompose convert --out combined.yaml
# 输出 JSON 格式
kompose convert --out output.json -j
三、使用标签自定义转换
Kompose 支持通过 Docker Compose 标签来控制转换行为:
services:
web:
image: nginx:latest
ports:
- "80:80"
labels:
kompose.service.type: LoadBalancer
kompose.service.expose: "example.com"
kompose.controller.type: statefulset
kompose.image-pull-policy: Always
deploy:
replicas: 3
resources:
limits:
cpus: "0.5"
memory: 256M
worker:
image: myworker:latest
labels:
kompose.controller.type: daemonset
常用标签说明:
kompose.service.type:Service 类型(ClusterIP/NodePort/LoadBalancer)。kompose.service.expose:创建 Ingress 资源,指定域名。kompose.controller.type:控制器类型(deployment/statefulset/daemonset)。kompose.image-pull-policy:镜像拉取策略。kompose.volume.size:PVC 的大小。
四、复杂应用转换示例
services:
app:
image: myapp:latest
ports:
- "8080:8080"
environment:
- DB_HOST=db
- DB_PORT=3306
- REDIS_HOST=cache
depends_on:
- db
- cache
labels:
kompose.service.type: NodePort
kompose.volume.size: 1Gi
volumes:
- app-data:/app/data
deploy:
replicas: 2
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: myapp
volumes:
- db-data:/var/lib/mysql
labels:
kompose.controller.type: statefulset
kompose.volume.size: 10Gi
cache:
image: redis:7-alpine
volumes:
app-data:
db-data:
kompose convert
ls -la *.yaml
五、转换后的手动调整
Kompose 自动转换后,通常还需要手动调整以下内容:
- 健康检查:添加 livenessProbe 和 readinessProbe。
- 资源限制:根据实际需求调整 CPU 和内存限制。
- ConfigMap/Secret:将环境变量中的敏感信息迁移到 Secret 中。
- 网络策略:根据安全需求添加 NetworkPolicy。
- 存储类:配置正确的 StorageClass。
六、常见问题
volumes 转换不正确
Compose 的绑定挂载(host path)不能直接转换为 K8S 资源,需要改为命名卷或手动配置 PV/PVC。
网络模式差异
Compose 中同一项目的服务默认可以互相访问,K8S 中需要通过 Service 名称访问,Kompose 会自动生成对应的 Service。
总结
Kompose 是从 Docker Compose 迁移到 Kubernetes 的得力助手,它大幅降低了迁移的工作量。转换后建议使用 Kustomize 管理不同环境的配置差异,使用 ArgoCD 或 Flux 实现 GitOps 持续交付。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。