从Docker Compose到Kubernetes:无缝迁移的完整实践指南
引言:告别复杂配置,拥抱容器编排新范式
你是否还在为Docker Compose项目迁移到Kubernetes而头疼?手动转换配置文件、学习复杂的Kubernetes概念、处理服务发现和网络问题——这些痛点是否让你望而却步?本文将带你探索如何利用Compose on Kubernetes工具,轻松实现Docker Compose到Kubernetes的无缝迁移,让你在保留熟悉的Compose语法的同时,充分享受Kubernetes强大的编排能力。
读完本文,你将能够:
- 理解Compose on Kubernetes的核心架构和工作原理
- 掌握在不同Kubernetes环境中安装Compose on Kubernetes的方法
- 熟练使用Docker CLI部署和管理Kubernetes上的Compose应用
- 深入了解Compose文件到Kubernetes资源的映射关系
- 解决迁移过程中可能遇到的常见问题
一、Compose on Kubernetes:架构解析与核心优势
1.1 什么是Compose on Kubernetes?
Compose on Kubernetes是一个开源工具,它允许你直接将Docker Compose文件部署到Kubernetes集群上。这意味着你可以继续使用熟悉的Compose语法来定义应用,同时利用Kubernetes的强大功能进行编排和管理。
1.2 核心架构
Compose on Kubernetes由两个主要的服务器组件和客户端工具构成:
flowchart TD
Client[Docker CLI] -->|kubectl/API| K8sAPI[Kubernetes API Server]
K8sAPI -->|Aggregation| ComposeAPI[Compose API Server]
ComposeAPI -->|存储| Etcd[(etcd)]
ComposeController[Compose Controller] -->|监听/协调| ComposeAPI
ComposeController -->|管理资源| K8sAPI
subgraph Kubernetes Cluster
K8sAPI
ComposeAPI
ComposeController
Etcd
end
1.2.1 Compose API Server
Compose API Server通过API服务器聚合机制扩展了Kubernetes API,添加了用于创建和管理stack的路由。它负责:
- 接收和验证来自客户端的请求
- 将stack存储在etcd键值存储中
- 提供声明式REST API
- 处理不同版本Compose文件的转换(如v1beta1到v1beta2)
1.2.2 Compose Controller
Compose Controller是核心的协调组件,负责:
- 监视etcd中的stack对象变化
- 将stack分解为Kubernetes资源
- 协调当前集群状态与期望状态
- 聚合stack的整体状态
1.3 工作流程
sequenceDiagram
participant 用户
participant DockerCLI[Docker CLI]
participant K8sAPI[Kubernetes API Server]
participant ComposeAPI[Compose API Server]
participant Etcd[etcd]
participant Controller[Compose Controller]
用户->>DockerCLI: docker stack deploy --orchestrator=kubernetes -c docker-compose.yml myapp
DockerCLI->>K8sAPI: POST /apis/compose.docker.com/v1beta2/namespaces/default/stacks
K8sAPI->>ComposeAPI: 转发请求
ComposeAPI->>Etcd: 存储stack对象
Etcd-->>ComposeAPI: 确认存储
ComposeAPI-->>K8sAPI: 返回响应
K8sAPI-->>DockerCLI: 部署成功
Controller->>ComposeAPI: 监视stack变化
ComposeAPI->>Controller: 推送stack更新
loop 协调循环
Controller->>K8sAPI: 创建/更新Kubernetes资源
K8sAPI->>Controller: 返回资源状态
Controller->>ComposeAPI: 更新stack状态
end
1.4 核心优势
- 降低学习曲线:无需学习复杂的Kubernetes YAML配置,继续使用熟悉的Compose语法
- 声明式API:基于Kubernetes的声明式API模型,确保系统状态与期望状态一致
- 无缝集成:与Kubernetes生态系统深度集成,支持所有标准Kubernetes功能
- 简化部署流程:一条命令即可完成整个应用栈的部署和管理
- 保留Docker CLI体验:使用熟悉的
docker stack命令进行应用生命周期管理
二、环境准备与安装指南
2.1 支持的环境
Compose on Kubernetes可在多种Kubernetes环境中安装:
- Docker Desktop(推荐用于开发环境)
- Azure AKS
- Google GKE
- MicroK8s
- Minikube
- Kind
2.2 前置要求
- Kubernetes集群(1.14+推荐)
- kubectl命令行工具
- Docker CLI(18.09+)
- Helm(用于部署etcd)
2.3 在Docker Desktop上安装(推荐)
2.3.1 启用Kubernetes
- 打开Docker Desktop设置
- 导航到Kubernetes选项卡
- 勾选"Enable Kubernetes"
- 点击"Apply & Restart"
2.3.2 创建命名空间
kubectl create namespace compose
2.3.3 部署etcd
Compose on Kubernetes需要独立的etcd实例(不同于kube-system中的etcd):
helm repo add stable https://charts.helm.sh/stable
helm install compose-etcd stable/etcd --namespace compose \
--set replicaCount=1 \
--set resources.requests.memory=128Mi \
--set resources.limits.memory=256Mi \
--set persistentVolume.enabled=false \
--set service.type=ClusterIP
2.3.4 下载并运行安装程序
# 下载适合你系统的安装程序
# 对于Linux
curl -LO https://github.com/docker/compose-on-kubernetes/releases/download/v0.4.16/installer-linux
chmod +x installer-linux
# 对于macOS
curl -LO https://github.com/docker/compose-on-kubernetes/releases/download/v0.4.16/installer-darwin
chmod +x installer-darwin
# 运行安装程序
./installer-linux -namespace=compose -etcd-servers=http://compose-etcd-client:2379
2.3.5 验证安装
kubectl api-versions | grep compose
预期输出:
compose.docker.com/v1beta1
compose.docker.com/v1beta2
检查Pod状态:
kubectl get pods -n compose
2.4 在其他Kubernetes环境中安装
| 环境 | 安装指南 | 主要步骤 |
|---|---|---|
| Azure AKS | install-on-aks.md | 1. 创建AKS集群 2. 部署etcd 3. 安装Compose on Kubernetes |
| Google GKE | install-on-gke.md | 1. 创建GKE集群 2. 配置RBAC 3. 部署etcd 4. 安装Compose on Kubernetes |
| MicroK8s | install-on-microk8s.md | 1. 启用必要插件 2. 配置kubectl 3. 部署etcd 4. 安装Compose on Kubernetes |
| Minikube | install-on-minikube.md | 1. 启动Minikube 2. 部署etcd 3. 安装Compose on Kubernetes |
| Kind | install-on-kind.md | 1. 创建Kind集群 2. 部署etcd 3. 安装Compose on Kubernetes |
三、实战指南:部署应用
3.1 准备Compose文件
以下是一个简单的多服务应用示例(保存为docker-compose.yml):
version: '3.3'
services:
db:
image: dockersamples/k8s-wordsmith-db
volumes:
- db-data:/var/lib/postgresql/data
words:
image: dockersamples/k8s-wordsmith-api
deploy:
replicas: 5
depends_on:
- db
web:
image: dockersamples/k8s-wordsmith-web
ports:
- "33000:80"
depends_on:
- words
volumes:
db-data:
3.2 部署应用栈
使用Docker CLI部署应用:
docker stack deploy --orchestrator=kubernetes -c docker-compose.yml hellokube
3.3 验证部署
3.3.1 检查stack状态
kubectl get stacks compose.docker.com
输出示例:
NAME CREATED AT
hellokube 2023-05-15T10:30:00Z
3.3.2 查看stack详情
kubectl describe stack hellokube
3.3.3 检查创建的资源
kubectl get all -l com.docker.compose.stack=hellokube
输出示例:
NAME READY STATUS RESTARTS AGE
pod/hellokube-db-0 1/1 Running 0 2m
pod/hellokube-words-7f9b4 1/1 Running 0 2m
pod/hellokube-words-8d2e7 1/1 Running 0 2m
pod/hellokube-words-9a3c5 1/1 Running 0 2m
pod/hellokube-words-b2d1f 1/1 Running 0 2m
pod/hellokube-words-c4e3g 1/1 Running 0 2m
pod/hellokube-web-6b8d7f9c8d 1/1 Running 0 2m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hellokube-db ClusterIP None <none> 5432/TCP 2m
service/hellokube-web LoadBalancer 10.100.200.201 <pending> 33000:30080/TCP 2m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hellokube-web 1/1 1 1 2m
NAME DESIRED CURRENT READY AGE
replicaset.apps/hellokube-web-6b8d7f9c8d 1 1 1 2m
NAME READY AGE
statefulset.apps/hellokube-db 1/1 2m
statefulset.apps/hellokube-words 5/5 2m
3.3.4 访问应用
如果使用的是Docker Desktop或有外部IP的环境:
curl http://localhost:33000
对于没有外部IP的环境(如Minikube),使用端口转发:
kubectl port-forward service/hellokube-web 33000:80
然后在浏览器中访问 http://localhost:33000
3.4 扩展服务
通过更新Compose文件中的deploy.replicas值,然后重新部署:
services:
words:
image: dockersamples/k8s-wordsmith-api
deploy:
replicas: 10 # 从5扩展到10
docker stack deploy --orchestrator=kubernetes -c docker-compose.yml hellokube
3.5 查看日志
# 查看web服务日志
kubectl logs -l com.docker.compose.service=web
# 查看特定pod日志
kubectl logs hellokube-web-6b8d7f9c8d-xyzabc
3.6 删除应用栈
docker stack rm --orchestrator=kubernetes hellokube
四、Compose到Kubernetes资源的映射
理解Compose文件如何映射到Kubernetes资源对于调试和优化应用非常重要。以下是主要的映射关系:
4.1 基本映射
| Docker Compose概念 | Kubernetes概念 | 说明 |
|---|---|---|
| Stack | CustomResource (compose.docker.com/Stack) | 整个应用栈的顶级资源 |
| Service | Deployment/StatefulSet | 根据是否有持久卷决定 |
| Service (单实例) | StatefulSet (1副本) | 带持久卷的单实例服务 |
| Volume | PersistentVolumeClaim | 持久化存储 |
| Network | ClusterIP Service + DNS | 服务发现 |
| Port mapping | Service (NodePort/LoadBalancer) | 外部访问 |
| Deploy replicas | Deployment.spec.replicas | 副本数量 |
| Healthcheck | Liveness/Readiness Probe | 健康检查 |
4.2 详细映射示例
以我们之前的docker-compose.yml为例:
Compose服务 -> Kubernetes资源
mindmap
root((hellokube stack))
db (db service)
StatefulSet (hellokube-db)
ClusterIP Service (hellokube-db)
PersistentVolumeClaim (db-data)
words (words service)
StatefulSet (hellokube-words)
ClusterIP Service (hellokube-words)
5 Replicas
web (web service)
Deployment (hellokube-web)
LoadBalancer Service (hellokube-web)
NodePort 33000:80
标签和选择器
Compose on Kubernetes为所有创建的资源添加了标签,以便跟踪和管理:
| 标签 | 说明 | 示例值 |
|---|---|---|
| com.docker.compose.stack | 所属stack名称 | hellokube |
| com.docker.compose.service | 所属服务名称 | web |
| com.docker.compose.project | 项目名称(通常与stack相同) | hellokube |
| com.docker.compose.version | Compose版本 | 3.3 |
这些标签可用于查询相关资源:
# 查找属于hellokube stack的所有资源
kubectl get all -l com.docker.compose.stack=hellokube
# 查找web服务的所有pod
kubectl get pods -l com.docker.compose.service=web
五、高级配置与优化
5.1 资源限制
可以在Compose文件中为服务添加资源限制,这些将映射到Kubernetes的资源请求和限制:
services:
web:
image: dockersamples/k8s-wordsmith-web
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.2'
memory: 256M
映射到Kubernetes的:
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 200m
memory: 256Mi
5.2 健康检查
services:
web:
image: dockersamples/k8s-wordsmith-web
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
映射到Kubernetes的:
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 40
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 40
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 3
5.3 环境变量和配置
5.3.1 环境变量
services:
web:
image: dockersamples/k8s-wordsmith-web
environment:
- WORDS_API=http://words:8080
- LOG_LEVEL=info
env_file:
- .env.production
5.3.2 配置文件
对于更复杂的配置,可以使用ConfigMap:
services:
web:
image: dockersamples/k8s-wordsmith-web
volumes:
- type: bind
source: ./config
target: /app/config
read_only: true
这将创建一个ConfigMap并挂载到容器中。
5.4 滚动更新
Compose on Kubernetes默认使用滚动更新策略:
services:
web:
image: dockersamples/k8s-wordsmith-web:1.0
deploy:
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
更新镜像版本后重新部署将触发滚动更新:
services:
web:
image: dockersamples/k8s-wordsmith-web:2.0 # 更新版本
docker stack deploy --orchestrator=kubernetes -c docker-compose.yml hellokube
六、常见问题与解决方案
6.1 安装问题
6.1.1 API服务器聚合未启用
症状:安装后kubectl api-versions | grep compose无输出
解决方案:确保Kubernetes集群启用了API聚合。对于自管理集群,检查API服务器启动参数:
--enable-aggregator-routing=true
6.1.2 etcd部署失败
症状:etcd pod一直处于Pending或Error状态
解决方案:检查资源是否充足,对于开发环境,可以减少etcd资源需求:
helm install compose-etcd stable/etcd --namespace compose \
--set replicaCount=1 \
--set resources.requests.cpu=100m \
--set resources.requests.memory=128Mi \
--set resources.limits.cpu=500m \
--set resources.limits.memory=256Mi \
--set persistentVolume.enabled=false
6.2 部署问题
6.2.1 服务无法访问
症状:应用已部署,但无法通过端口访问
排查步骤:
- 检查服务是否创建:
kubectl get svc -l com.docker.compose.stack=hellokube - 检查服务端点是否就绪:
kubectl describe svc hellokube-web - 检查pod状态:
kubectl get pods -l com.docker.compose.stack=hellokube - 检查pod日志:
kubectl logs <pod-name>
6.2.2 依赖服务启动顺序问题
症状:应用启动时出现连接数据库失败
解决方案:使用健康检查和依赖等待:
services:
words:
image: dockersamples/k8s-wordsmith-api
depends_on:
- db
deploy:
restart_policy:
condition: on-failure
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 5s
timeout: 5s
retries: 5
6.3 性能问题
6.3.1 资源限制导致服务不稳定
症状:pod频繁重启,日志中有OOM(内存溢出)错误
解决方案:调整资源限制:
services:
web:
deploy:
resources:
limits:
memory: 1G # 增加内存限制
七、开发与贡献
7.1 本地开发环境设置
如果你想为Compose on Kubernetes贡献代码或进行自定义开发,可以按照以下步骤设置开发环境:
7.1.1 前置要求
- Git
- Go 1.12+
- Docker Desktop(Mac或Windows),引擎版本18.09+
- 启用Buildkit:
export DOCKER_BUILDKIT=1 - 启用Docker Desktop中的Kubernetes
7.1.2 获取代码
git clone https://gitcode.com/gh_mirrors/co/compose-on-kubernetes.git
cd compose-on-kubernetes
7.1.3 构建调试版本
make -f debug.Makefile install-debug-images
此命令将:
- 构建带有调试符号的镜像
- 在
docker命名空间中安装API服务器和Compose控制器的调试版本 - 创建调试用的LoadBalancer服务
7.1.4 验证开发安装
kubectl get all -n docker
7.2 提交贡献
Compose on Kubernetes欢迎社区贡献。如果你有改进或修复,请遵循以下步骤:
- Fork仓库
- 创建特性分支:
git checkout -b my-new-feature - 提交更改:
git commit -am 'Add some feature' - 推送到分支:
git push origin my-new-feature - 创建Pull Request
八、总结与展望
Compose on Kubernetes为熟悉Docker Compose的开发者提供了一条平滑过渡到Kubernetes的路径。它允许你继续使用简洁的Compose语法,同时利用Kubernetes强大的编排能力。
8.1 主要优势回顾
- 降低学习门槛:无需学习复杂的Kubernetes YAML配置
- 提高生产力:使用简洁的Compose语法快速定义和部署应用
- 保留熟悉工具链:继续使用Docker CLI进行应用管理
- 无缝迁移:现有Compose文件几乎无需修改即可部署到Kubernetes
8.2 注意事项
- 该项目目前已不再维护,对于生产环境,请考虑其他替代方案
- 对于复杂的Kubernetes原生功能,可能仍需要直接使用Kubernetes API或配置
8.3 替代方案
如果Compose on Kubernetes不再满足你的需求,可以考虑以下替代方案:
- Kompose:将Compose文件转换为Kubernetes YAML文件
- kustomize:Kubernetes原生的配置管理工具
- Helm:Kubernetes包管理工具,适合复杂应用
- Docker Compose v2+:支持
docker compose up --compatibility模式生成Kubernetes资源
通过本文介绍的方法,你应该能够轻松地将Docker Compose应用部署到Kubernetes集群,并利用Kubernetes的强大功能进行扩展和管理。无论你是刚开始接触容器编排,还是从Docker Swarm迁移到Kubernetes,Compose on Kubernetes都提供了一个简单而强大的过渡方案。
希望本文对你有所帮助!如果你有任何问题或反馈,请在评论区留言。别忘了点赞、收藏并关注我们,获取更多容器和Kubernetes相关的教程和最佳实践。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00