如何将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
额外操作步骤
构建并推送镜像
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部署到k8s
将所有yaml文件放在同一目录,执行命令部署:kubectl apply -f .生产环境注意事项
- 替换
hostPath为PersistentVolumeClaim,避免节点故障导致数据丢失 - 调整
replicas数量实现服务冗余 - 配置Ingress替代NodePort,实现更灵活的外部访问控制
- 替换
内容的提问来源于stack exchange,提问作者potato
相关产品推荐
相关产品推荐

