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 管理不同环境的配置差异,使用 ArgoCDFlux 实现 GitOps 持续交付。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。