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

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.png

希望这能让你快速了解 kompose 并感到兴奋。它还有更多令人兴奋的功能,比如创建不同类型的资源,创建 Helm Chart,甚至可以使用实验性的 Docker bundle 格式作为输入。请查看 Lachlan Evenson 关于在 Kubernetes 中使用 Docker bundle 的博客。要观看完整的演示,请查看我们在KubeCon 上的演讲。

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