本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

Kompose:一个从 Docker-compose 到 Kubernetes 的工具

Skippbox,我们开发了 kompose,一个自动将您的Docker Compose应用程序转换为Kubernetes清单的工具。它允许您通过一个简单的`kompose up`命令在Kubernetes集群上启动一个Compose应用程序。我们非常高兴能将kompose捐赠给Kubernetes孵化器。下面将快速介绍它以及促使我们开发它的一些动因。

Docker 对开发者来说非常棒。它让每个人都能快速开始使用已打包在 Docker 镜像中并可在 Docker Registry 上获取的应用程序。为了构建多容器应用程序,Docker 开发了 Docker-compose (又称 Compose)。Compose 接受一个基于 yaml 的多容器应用程序清单,并通过一个命令 `docker-compose up` 启动所有必需的容器。然而,Compose 只能在本地或 Docker Swarm 集群上运行。

但是,如果您想使用 Swarm 以外的东西呢?比如 Kubernetes 当然可以。

Compose 格式不是定义分布式应用程序的标准。因此,您需要重新编写应用程序清单以适应您选择的容器编排器。

我们认为 kompose 是向 Docker 用户介绍 Kubernetes 原理的绝佳方式,也是轻松地从 Docker Swarm 迁移到 Kubernetes 以在生产环境中操作您的应用程序的绝佳方式。

在夏天,Kompose 在 Red Hat 的 Tomas Kral 和 Suraj Deshmukh,以及 Google 的 Janet Kuo 的帮助下,找到了新的发展动力。他们与我们的首席 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 是一个用 Go 语言编写的独立二进制文件,您可以从 GitHub 上的发布页面构建或安装。让我们跳过构建说明,直接进入一个示例。

让我们来试试看!

使用Docker的Guestbook应用程序

留言簿应用程序已成为 Kubernetes 的典型示例。在 Docker-compose 格式中,留言簿可以使用这个最小文件启动

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节点,一组redis-slave可以通过其DNS名称进行扩容并找到redis-master。以及一个在端口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”的留言簿

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 端点,并在其上创建了资源。可以使用一组标志来生成 Replication Controllers、Replica Sets 或 Daemon Sets,而不是 Deployments。

就是这样!无需其他操作,转换自动完成。
现在,如果你对 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 服务,享受留言簿应用程序,但这次是从 Docker-compose 文件启动的。

kompose.png

希望这能让您快速了解 kompose 并感到兴奋。还有更多激动人心的功能,例如创建不同类型的资源、创建 Helm Charts,甚至使用实验性的 Docker bundle 格式作为输入。请查看 Lachlan Evenson 关于 使用 Docker bundle 与 Kubernetes 的博客。要获取整体演示,请观看我们在 KubeCon 上的演讲

前往 Kubernetes Incubator 并查看 kompose,它将帮助您轻松地将 Docker compose 应用程序迁移到生产环境中的 Kubernetes 集群。