You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Docker-Compose应用完全迁移至Kubernetes(k8s)运行?

能否将Docker Compose配置转为Kubernetes版本?

不能完全以Docker Compose的方式在Kubernetes(k8s)上运行应用——两者的编排模型差异很大(Docker Compose偏向单节点/Swarm环境,k8s是集群化编排),但可以将你的docker-compose.yml转换为等价的k8s资源清单,实现相同的应用运行效果。

以下是对应每个服务的k8s配置,以及关键转换说明:

核心转换要点

  • Docker Compose的services → k8s的Deployment(管理Pod副本)
  • ports → k8s的Service(提供集群内部/外部访问入口)
  • volumes → k8s的hostPath(测试环境,对应原主机目录)或PersistentVolumeClaim(生产环境推荐)
  • depends_on → k8s通过**就绪探针(readinessProbe)**实现服务依赖检查(比单纯启动顺序更可靠)
  • build → k8s不直接构建镜像,需先手动构建镜像并推送到镜像仓库(比如你的私有registry)

1. 私有Registry服务配置

Deployment(registry-deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: registry
  template:
    metadata:
      labels:
        app: registry
    spec:
      containers:
      - name: registry
        image: registry:2
        ports:
        - containerPort: 5000
        env:
        - name: REGISTRY_HTTP_TLS_CERTIFICATE
          value: /certs/domain.crt
        - name: REGISTRY_HTTP_TLS_KEY
          value: /certs/domain.key
        - name: REGISTRY_AUTH
          value: htpasswd
        - name: REGISTRY_AUTH_HTPASSWD_PATH
          value: /auth/htpasswd
        - name: REGISTRY_AUTH_HTPASSWD_REALM
          value: Registry Realm
        volumeMounts:
        - name: registry-data
          mountPath: /var/lib/registry
        - name: registry-certs
          mountPath: /certs
        - name: registry-auth
          mountPath: /auth
        restartPolicy: Always
      volumes:
      - name: registry-data
        hostPath:
          path: /home/app/docker/test/data
          type: DirectoryOrCreate
      - name: registry-certs
        hostPath:
          path: /home/app/docker/test/certs
          type: DirectoryOrCreate
      - name: registry-auth
        hostPath:
          path: /home/app/docker/test/auth
          type: DirectoryOrCreate

Service(registry-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: registry
spec:
  type: NodePort
  ports:
  - port: 5000
    targetPort: 5000
    nodePort: 30500 # 可选,指定节点端口,不指定则自动分配
  selector:
    app: registry

2. Node应用服务配置

Deployment(node-deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node
spec:
  replicas: 1
  selector:
    matchLabels:
      app: node
  template:
    metadata:
      labels:
        app: node
    spec:
      containers:
      - name: node
        image: <你的RegistryIP>:5000/node-app:latest # 替换为实际Registry地址
        ports:
        - containerPort: 3000
        volumeMounts:
        - name: node-html
          mountPath: /usr/src/node/index.html
          subPath: index.html
      volumes:
      - name: node-html
        hostPath:
          path: /home/app/docker/test/volumes/index.html
          type: FileOrCreate

Service(node-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: node
spec:
  type: ClusterIP
  ports:
  - port: 3000
    targetPort: 3000
  selector:
    app: node

3. Nginx反向代理服务配置

Deployment(nginx-deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: <你的RegistryIP>:5000/nginx-app:latest # 替换为实际Registry地址
        ports:
        - containerPort: 80
        # 就绪探针:检查node服务就绪后,nginx才接收流量
        readinessProbe:
          httpGet:
            host: node
            path: /
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 10

Service(nginx-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort # 云环境可改用LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080 # 可选,指定节点端口
  selector:
    app: nginx

额外操作步骤

  1. 构建并推送镜像
    k8s无法直接构建镜像,需手动构建node和nginx镜像并推送到私有registry:

    # 构建node镜像
    docker build -t <你的RegistryIP>:5000/node-app:latest ./web
    docker push <你的RegistryIP>:5000/node-app:latest
    
    # 构建nginx镜像
    docker build -t <你的RegistryIP>:5000/nginx-app:latest ./nginx
    docker push <你的RegistryIP>:5000/nginx-app:latest
    
  2. 部署到k8s
    将所有yaml文件放在同一目录,执行命令部署:

    kubectl apply -f .
    
  3. 生产环境注意事项

    • 替换hostPath为PersistentVolumeClaim,避免节点故障导致数据丢失
    • 调整replicas数量实现服务冗余
    • 配置Ingress替代NodePort,实现更灵活的外部访问控制

内容的提问来源于stack exchange,提问作者potato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:40:34