这篇文章已超过一年。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kompose:将 Docker-compose 转换为 Kubernetes 的工具
在 Skippbox,我们开发了 kompose,一个可以自动将你的 Docker Compose 应用转换为 Kubernetes 清单的工具。它允许你使用一个 kompose up 命令在 Kubernetes 集群上启动一个 Compose 应用。我们非常高兴能够将 kompose 捐赠给 Kubernetes Incubator。下面是对它的一个快速介绍以及促使我们开发它的一些动力。
Docker 对开发者来说非常棒。它让每个人都能快速上手一个已经打包成 Docker 镜像并在 Docker Registry 上可用的应用。为了构建一个多容器应用,Docker 开发了 Docker-compose(也称为 Compose)。Compose 接收一个基于 YAML 的多容器应用清单,并使用单个命令 docker-compose up 启动所有必需的容器。然而,Compose 只能在本地或与 Docker Swarm 集群一起工作。
但如果你想使用 Swarm 以外的其他东西怎么办?比如 Kubernetes,当然。
Compose 格式不是定义分布式应用的 표준。因此,你需要在选择的容器编排器中重写应用清单。
我们认为 kompose 是一个极好的方式,可以将 Kubernetes 原理展示给 Docker 用户,同时也方便从 Docker Swarm 迁移到 Kubernetes,以便在生产环境中运行你的应用。
在夏天,Kompose 在 Red Hat 的 Tomas Kral 和 Suraj Deshmukh,以及 Google 的 Janet Kuo 的帮助下焕发了新的活力。他们与我们自己的主要 kompose 开发者 Nguyen An-Tu 一起,让 kompose 变得更加令人兴奋。我们将 Kompose 提交给 SIG-apps 中的 Kubernetes Incubator,并获得了整个 Kubernetes 社区的批准;现在你可以在 Kubernetes Incubator 中找到 kompose。
Kompose 现在支持 Docker-compose v2 格式,最近还增加了 persistent volume claims,以及每个 Pod 支持多个容器。它也可以通过指定与默认 Kubernetes 不同的 Provider 来针对 OpenShift 部署。Kompose 现在也已在 Fedora 包中可用,我们期待在未来几周内看到它出现在 CentOS 发行版中。
kompose 是一个单一的 Golang 二进制文件,你可以从 GitHub 上的 release 构建或安装。让我们跳过构建说明,直接进入一个例子。
让我们试试看!
使用 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 服务创建一个 Deployment 和一个 Service。此外,它还自动检测你当前的 Kubernetes endpoint,并在其上创建资源。可以使用一组标志来生成 Replication Controller、Replica Set 或 Daemon Set,而不是 Deployment。
就这样!无需做其他任何事,转换是自动发生的。
现在,如果你对 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
确实,你会看到三个 Service,三个 Deployment 以及由此产生的三个 Pod。为了快速访问应用,在本地访问 frontend Service,就可以使用 Guestbook 应用了,只不过这次它是从 Docker-compose 文件启动的。
希望这能让你快速了解 kompose 并感到兴奋。它还有更多令人兴奋的功能,比如创建不同类型的资源,创建 Helm Chart,甚至可以使用实验性的 Docker bundle 格式作为输入。请查看 Lachlan Evenson 关于在 Kubernetes 中使用 Docker bundle 的博客。要观看完整的演示,请查看我们在KubeCon 上的演讲。
前往 Kubernetes Incubator 查看 kompose,它将帮助你轻松地将 Docker compose 应用迁移到生产环境中的 Kubernetes 集群。
- 下载 Kubernetes
- 在 GitHub 上参与 Kubernetes 项目
- 在 Stack Overflow 上提问(或回答问题)
- 在 Slack 上与社区交流
- 在 Twitter 上关注我们 @Kubernetesio 获取最新动态