- 云原生
- Kubernetes
- 容器编排
- 开发工具
- CLI
【免费下载链接】kompose
Convert Compose to Kubernetes
Kompose(Kubernetes + Compose)是 Kubernetes 生态中的 Compose 转换工具,可以把docker-compose.yaml一键转换为 Kubernetes 或 OpenShift 资源清单。本文将带你从安装、转换到部署走通完整流程,并结合仓库源码讲解其 Loader–Transformer–Outputter 三阶段架构与kompose convert的底层原理,让你既能上手实操,也能理解转换背后的设计。
什么是 Kompose?
Kompose 是一款面向容器编排平台(Kubernetes 或 OpenShift)的 Compose 转换工具。它接收一份符合 Compose 规范的文件,将其翻译为 Kubernetes 资源对象。项目 README 中的定位描述为:
kompose是一个帮助熟悉docker-compose的用户迁移到 Kubernetes 的工具,它读取 Compose 规范文件并将其翻译为 Kubernetes 资源。
这种转换非常适合从本地 Compose 环境迁移到 Kubernetes 的场景:转换结果可能并不与原始 Compose 完全等价,但对于在 Kubernetes 上首次部署应用而言,它能极大降低迁移成本。开发者喜爱它的核心原因有两个:
- 先用 Compose 简化开发流程,再把容器部署到生产集群;
- 一条命令
kompose convert即可完成转换。
It's as simple as 1-2-3:三步完成部署
官方首页给出了极简的三步走流程,这也是 Kompose 的核心使用范式:
- 准备一份示例
docker-compose.yaml文件(或使用你自己的 Compose 文件); - 执行
kompose convert生成 Kubernetes 资源清单; - 执行
kubectl apply,然后在集群中检查新部署的容器。
完整的命令序列如下:
$ wget https://raw.githubusercontent.com/kubernetes/kompose/master/examples/docker-compose-v3.yaml -O docker-compose.yaml $ kompose convert $ kubectl apply -f . $ kubectl get po NAME READY STATUS RESTARTS AGE frontend-591253677-5t038 1/1 Running 0 10s redis-master-2410703502-9hshf 1/1 Running 0 10s redis-replica-4049176185-hr1lr 1/1 Running 0 10s从输出可以看到,kompose convert把 Compose 中的每个服务分别生成为 Deployment 和 Service 两类资源,kubectl apply -f .一次性应用当前目录下的全部清单文件后,Pod 随即进入 Running 状态。
如果你希望获得更详细的实战指引,可以参考仓库中的 Getting Started 指南,其中覆盖了 Minikube、Minishift 与 RHEL 三种环境下的完整部署过程。
在 Linux、macOS 或 Windows 上安装 Kompose
安装 Kompose 最直接的方式是下载官方发布的二进制文件:
# Linux curl -L https://github.com/kubernetes/kompose/releases/download/v1.25.0/kompose-linux-amd64 -o kompose # macOS curl -L https://github.com/kubernetes/kompose/releases/download/v1.25.0/kompose-darwin-amd64 -o kompose chmod +x kompose sudo mv ./kompose /usr/local/bin/komposeWindows 用户则下载kompose-windows-amd64.exe后,将二进制所在目录加入 PATH 即可。
注意:上表二进制版本以仓库文档中记录的 v1.25.0 为例。发布节奏为约三周一个版本,安装时建议到 release 页面获取最新版本号并替换 URL 中的版本号。
除二进制安装外,仓库 安装文档 还整理了更多安装途径,包括:
- Go 安装:
go install github.com/kubernetes/kompose@latest(拉取 main 分支的最新开发代码); - CentOS:启用 EPEL 仓库后执行
sudo yum -y install kompose; - macOS:
brew install kompose(Homebrew)或 MacPorts; - Windows:
choco install kubernetes-kompose(Chocolatey)或winget install Kubernetes.kompose; - Docker/Podman 镜像方式:
docker build -t kompose https://github.com/kubernetes/kompose.git#main构建后,用docker run --rm -it -v $PWD:/opt -w /opt kompose kompose convert挂载当前目录运行。
kompose convert 的底层原理:Loader → Transformer → Outputter
kompose convert并非魔法,它背后是一套清晰的三阶段流水线。仓库 架构文档 明确说明 Kompose 包含三个阶段:Loader(加载器)、Transformer(转换器)和 Outputter(输出器),每个阶段都有定义良好的接口,便于后续扩展新的加载格式或目标平台。
阶段一:Loader 读取输入文件
Loader 负责读取输入文件(当前支持 Compose 规范),并将其转换为 Kompose 内部的统一数据结构KomposeObject。接口定义如下:
// pkg/loader/loader.go type Loader interface { LoadFile(files []string, profiles []string, noInterpolate bool) (kobject.KomposeObject, error) }KomposeObject是 Kompose 对容器编排意图的抽象表示,核心结构(源码位于 pkg/kobject/kobject.go):
type KomposeObject struct { ServiceConfigs map[string]ServiceConfig } type ServiceConfig struct { ContainerName string Image string Environment []EnvVar Port []Ports Command []string WorkingDir string Args []string Volumes []string Network []string Labels map[string]string Annotations map[string]string CapAdd []string CapDrop []string Entrypoint []string Expose []string Privileged bool Restart string User string }从源码结构可以看出,Compose 文件中的image、ports、command、volumes、labels、environment等字段都会被解析并映射到ServiceConfig的对应字段上。
阶段二:Transformer 生成目标平台对象
Transformer 接收KomposeObject,将其转换为目标平台(Kubernetes 或 OpenShift)的对象。接口定义:
// pkg/transformer/transformer.go type Transformer interface { Transform(kobject.KomposeObject, kobject.ConvertOptions) ([]runtime.Object, error) }在 pkg/app/app.go 的getTransformer中,根据--provider参数选择实现:默认 provider 使用kubernetes.Kubernetes,OpenShift 实现openshift.OpenShift内嵌(继承)了 Kubernetes 转换器。OpenShift 转换器会在 Kubernetes 资源基础上额外生成 DeploymentConfig 与 ImageStream 等 OpenShift 特有对象。
阶段三:Outputter 输出结果
Outputter 对 Transformer 的产出执行最终动作:可以打印到 stdout,也可以写为 YAML/JSON 文件。在 pkg/app/app.go 的Convert主流程中,转换完成后调用kubernetes.PrintList(objects, opt)完成输出。
一条命令背后的完整调用链
汇总 main.go、cmd/root.go 与 cmd/convert.go 的源码,kompose convert的实际执行链为:
main.go调用cmd.Execute(),进入 cobra 命令框架;cmd/root.go的PersistentPreRun校验 provider 必须是kubernetes或openshift(默认kubernetes),并处理--verbose、--suppress-warnings等全局参数;cmd/convert.go的PreRun组装kobject.ConvertOptions,调用app.ValidateFlags与app.ValidateComposeFile做参数与输入文件校验——若未指定-f,则依次探测compose.yaml、compose.yml、docker-compose.yaml、docker-compose.yml(见 pkg/app/app.go 的DefaultComposeFiles);Run调用app.Convert(ConvertOpt)依次执行 Loader 加载、Transformer 转换与 PrintList 输出。
常用命令参数与输出格式
kompose convert支持丰富的参数,下面整理自 cmd/convert.go 的命令行定义:
| 参数 | 说明 | 默认值 |
|---|---|---|
-f, --file | 指定 Compose 文件(全局参数,可多次指定实现多文件合并) | 无(自动探测默认文件名) |
--provider | 目标平台,kubernetes或openshift(全局参数) | kubernetes |
-o, --out | 指定输出文件名或目录 | 当前目录 |
--stdout | 将转换结果打印到标准输出 | false |
-j, --json | 输出 JSON 格式 | false |
-y, --yaml | 输出 YAML 格式(当前默认格式,已标记为废弃) | true |
--controller | 输出控制器类型:deployment、daemonSet、replicationController | deployment |
--replicas | 生成资源规格中的副本数 | 1 |
--volumes | 卷类型:persistentVolumeClaim、emptyDir、hostPath、configMap | persistentVolumeClaim |
--pvc-request-size | 指定 PVC 存储请求大小 | 空 |
-n, --namespace | 指定生成资源的命名空间 | 空 |
--generate-network-policies | 是否生成 NetworkPolicy | false |
--with-kompose-annotation | 是否在生成资源上添加 kompose 注解 | true |
--no-interpolate | 保留 Compose 文件中的环境变量名(不做插值) | false |
--profile | 指定要使用的 profile,可多次使用 | 空 |
-v, --verbose | 详细输出(调试日志) | false |
--indent | 生成 YAML 的缩进空格数 | 2 |
一些值得注意的使用要点:
- 多文件输入:
kompose -f first.yaml -f second.yaml convert可合并多个 Compose 文件; - 输出到 stdout:
kompose convert --stdout便于管道处理,且与--out互斥(源码 pkg/app/app.go 有显式校验); - 控制器选择:
--deployment、--daemon-set、--replication-controller等旧参数已标记废弃,官方推荐使用--controller统一指定; - Kubernetes 与 OpenShift 参数隔离:
--chart、--controller等为 Kubernetes 专属,--build-repo、--build-branch、--deployment-config等为 OpenShift 专属,混用会直接报错(见ValidateFlags的 provider 分支校验); - 版本兼容:转换仅支持 Compose v1/v2 输入,未指定文件时使用
DefaultComposeFiles中列出的默认文件名。
结合仓库示例文件实战
仓库 examples/compose.yaml 提供了一个包含三个服务(redis-leader、redis-replica、web)的示例 Compose 文件。直接运行转换即可得到 6 个清单文件:
$ kompose convert INFO Kubernetes file "frontend-service.yaml" created INFO Kubernetes file "redis-leader-service.yaml" created INFO Kubernetes file "redis-replica-service.yaml" created INFO Kubernetes file "frontend-deployment.yaml" created INFO Kubernetes file "redis-leader-deployment.yaml" created INFO Kubernetes file "redis-replica-deployment.yaml" created(注:示例 Compose 中实际服务名为 redis-leader、redis-replica、web,仓库文档中输出示例沿用了旧版 frontend 命名,实际文件名以你本机运行结果为准。)
如果你倾向 OpenShift 平台,则改用kompose convert --provider=openshift,输出中会额外生成*-deploymentconfig.yaml与*-imagestream.yaml文件,转换后同样可以用kubectl apply部署到 OpenShift 集群。另外仓库 script/test/fixtures 目录下存放了大量输入/输出配对用例(覆盖 volumes、configmap、secrets、cronjob、hpa、statefulset 等场景),是了解各类 Compose 特性转换行为的最佳参考素材。
总结
Kompose 的价值在于打通了「Compose 本地开发」与「Kubernetes 生产部署」之间的鸿沟。通过kompose convert这一条命令,开发者可以快速获得可部署的 Kubernetes 清单;而理解其 Loader–Transformer–Outputter 的分层设计,则有助于你在遇到转换不符合预期时,顺着 pkg/loader 与 pkg/transformer 的源码定位问题根源。进一步的深入资料可参考仓库中的 架构文档、转换文档 与 用户指南。
- 云原生
- Kubernetes
- 容器编排
- 开发工具
- CLI
【免费下载链接】kompose
Convert Compose to Kubernetes
相关推荐
如何快速集成React Native Material Dropdown:5分钟实现Material Design下拉菜单
如何快速集成React Native Material Dropdown:5分钟实现Material Design下拉菜单 React Native Mater
Docker Compose bridge convert 命令详解:将 Compose 文件转换为 Kubernetes 清单与 Helm Chart
Docker Compose bridge convert 命令详解:将 Compose 文件转换为 Kubernetes 清单与 Helm Chart Doc
云原生容器编排DevOpsCLI抖音批量下载实战教程:douyin-downloader 免费工具从零到下载完成
抖音批量下载实战教程:douyin downloader 免费工具从零到下载完成 收藏夹里攒了几百条抖音链接,想整批存到本地却还得一个个长按另存?douyin
网页爬虫CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考