这篇文章已过时一年多。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否未变得不正确。
Kompose:一个从 Docker-compose 到 Kubernetes 的工具
在 Skippbox,我们开发了 kompose,这是一款可以自动将您的 Docker Compose 应用程序转换为 Kubernetes 清单的工具。让您可以通过一个 kompose up 命令在 Kubernetes 集群上启动 Compose 应用程序。我们非常高兴将 kompose 捐赠给 Kubernetes Incubator。因此,这里简要介绍一下它以及促使我们开发它的一些动机。
Docker 对开发人员来说非常棒。它允许每个人快速启动一个已打包在 Docker 镜像中且在 Docker 注册表上可用的应用程序。为了构建多容器应用程序,Docker 开发了 Docker-compose(又名 Compose)。Compose 接受基于 yaml 的多容器应用程序清单,并通过单个命令 docker-compose up 启动所有必需的容器。但是 Compose 只能在本地或使用 Docker Swarm 集群工作。
但是,如果您想使用 Swarm 以外的东西呢?当然是 Kubernetes。
Compose 格式不是定义分布式应用程序的标准。因此,您需要使用您选择的容器编排器重新编写应用程序清单。
我们将 kompose 视为向 Docker 用户公开 Kubernetes 原则以及轻松从 Docker Swarm 迁移到 Kubernetes 以在生产环境中运行您的应用程序的绝佳方式。
在夏季,在 Red Hat 的 Tomas Kral 和 Suraj Deshmukh 以及 Google 的 Janet Kuo 的帮助下,Kompose 焕发了新的活力。他们与我们自己的 kompose 首席开发人员 Nguyen An-Tu 一起,正在让 kompose 变得更加令人兴奋。我们在 SIG-apps 中向 Kubernetes Incubator 提出了 Kompose,并获得了 Kubernetes 社区的普遍批准;您现在可以在 Kubernetes Incubator 中找到 kompose。
Kompose 现在支持 Docker-compose v2 格式,最近添加了持久卷声明以及每个 Pod 的多个容器。它还可以通过指定与默认 Kubernetes 不同的提供程序来用于定位 OpenShift 部署。Kompose 现在也可在 Fedora 软件包中使用,我们期待在未来几周内在 CentOS 发行版中看到它。
kompose 是一个单独的 Golang 二进制文件,您可以从 GitHub 上的发行版构建或安装它。让我们跳过构建说明,直接进入一个示例。
让我们试一下!
使用 Docker 的 Guestbook 应用程序
Guestbook 应用程序已成为 Kubernetes 的规范示例。在 Docker-compose 格式中,可以使用这个最小的文件启动 guestbook
version: "2"
services:
redis-master:
image: gcr.io/google\_containers/redis:e2e
ports:
- "6379"
redis-slave:
image: gcr.io/google\_samples/gb-redisslave:v1
ports:
- "6379"
environment:
- GET\_HOSTS\_FROM=dns
frontend:
image: gcr.io/google-samples/gb-frontend:v4
ports:
- "80:80"
environment:
- GET\_HOSTS\_FROM=dns
它由三个服务组成。一个 redis-master 节点,一组可以扩展并通过其 DNS 名称查找 redis-master 的 redis-slave。以及一个在端口 80 上公开自己的 PHP 前端。生成的应用程序允许您留下存储在 redis 集群中的简短消息。
要在普通的 Docker 主机上使用 docker-compose 启动它,请执行以下操作
$ docker-compose -f docker-guestbook.yml up -d
Creating network "examples\_default" with the default driver
Creating examples\_redis-slave\_1
Creating examples\_frontend\_1
Creating examples\_redis-master\_1
到目前为止一切顺利,这是普通的 Docker 用法。现在让我们看看如何在无需重新编写任何内容的情况下将其放在 Kubernetes 上。
使用“kompose”的 Guestbook
Kompose 当前有三个主要命令:up、down 和 convert。为简单起见,这里我们将展示一个启动 Guestbook 应用程序的用法。
与 docker-compose 类似,我们可以使用 kompose up 命令指向表示 Guestbook 应用程序的 Docker-compose 文件。就像这样
$ kompose -f ./examples/docker-guestbook.yml up
We are going to create Kubernetes deployment and service for your dockerized application.
If you need more kind of controllers, use 'kompose convert' and 'kubectl create -f' instead.
INFO[0000] Successfully created service: redis-master
INFO[0000] Successfully created service: redis-slave
INFO[0000] Successfully created service: frontend
INFO[0000] Successfully created deployment: redis-master
INFO[0000] Successfully created deployment: redis-slave
INFO[0000] Successfully created deployment: frontend
Application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc' for details.
kompose 会自动将 Docker-compose 文件转换为 Kubernetes 对象。默认情况下,它为每个 compose 服务创建一个部署和一个服务。此外,它会自动检测您当前的 Kubernetes 端点并在其上创建资源。可以使用一组标志来生成复制控制器、副本集或守护进程集,而不是部署。
就是这样!无需执行任何其他操作,转换会自动进行。
现在,如果您已经了解一些 Kubernetes,那么您应该熟悉客户端 kubectl,并且可以检查集群上创建的内容。
$ kubectl get pods,svc,deployments
NAME READY STATUS RESTARTS AGE
frontend-3780173733-0ayyx 1/1 Running 0 1m
redis-master-3028862641-8miqn 1/1 Running 0 1m
redis-slave-3788432149-t3ejp 1/1 Running 0 1m
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.0.0.34 \<none\> 80/TCP 1m
redis-master 10.0.0.219 \<none\> 6379/TCP 1m
redis-slave 10.0.0.84 \<none\> 6379/TCP 1m
NAME DESIRED CURRENT UP-TO-DATE
AVAILABLE AGE
frontend 1 1 1 1 1m
redis-master 1 1 1 1 1m
redis-slave 1 1 1 1 1m
事实上,您会看到三个服务、三个部署和生成的三个 Pod。要快速访问应用程序,请在本地访问 frontend 服务并享受 Guestbook 应用程序,但这次是从 Docker-compose 文件启动的。
希望这能让您快速了解 kompose 并让您感到兴奋。它们还有更多令人兴奋的功能,例如创建不同类型的资源、创建 Helm 图表,甚至使用实验性的 Docker 包格式作为输入。请查看 Lachlan Evenson 的博客,了解 如何将 Docker 包与 Kubernetes 结合使用。有关全面的演示,请参阅我们在 KubeCon 上的演讲
前往 Kubernetes Incubator 并查看 kompose,它将帮助您轻松地将 Docker compose 应用程序迁移到生产环境中的 Kubernetes 集群。
- 下载 Kubernetes
- 参与 GitHub 上的 Kubernetes 项目
- 在 Stack Overflow 上发布问题(或回答问题)
- 在 Slack 上与社区联系
- 在 Twitter @Kubernetesio 上关注我们,获取最新更新