Kompose: Docker-compose 到 Kubernetes 的迁移工具

更新时间:2016-12-29 16:19:48点击次数:722次

在 skippbox,开发了 Kompose 这一工具,他能够自动把 Docker Compose 应用转换为 Kubernetes 描述文件。利用一个简单的 kompose up 命令,就可以在 Kubernetes 集群上启动 Compose 应用。我们非常乐于将其捐献给 Kubernetes Incubator。下面介绍一下这一工具的开发动机和用法。

Docker 给了开发者以巨大的帮助。让每个人都能够从 Docker Registry 启动一个打包好的 Docker 应用。为了对付多容器应用, Docker 开发了 Docker-compose (也就是 Compose)。Compose 借助 yaml 格式的描述文件来定义一个多容器应用,然后就可以用一个简单的 docker-compose up来启动这一应用中的多个容器。然而,Compose 只能够在本地或者 Docker Swarm 集群中运行。

那如果我们需要在 Swarm 之外运行怎么办?比如 Kubernetes?Compose 格式并非为分布式而诞生的。所以,你只能为你选择的容器编排工具重新编写应用描述文件。

我们利用 Kompose,能够简单的完成将应用从 Docker Swarm 到 Kubernetes 的转换过程,这样就为 Docker 用户敞开了 Kubernetes 的大门。

今年夏天,来自红帽的 Tomas Kral 和 Suraj Deshmukh,以及来自 Google 的 Janet Kuo,他们和 Kompose 的主要开发者 Nguyen An-Tu 一起为 Kompose 锦上添花。我们把 Kompose 提交给 Kubernets Incubator,得到了 Kubernetes 社区的支持,现在可以在 Kubernetes Incubator 找到 Kompose。

Kompose 目前支持 Docker-compose v2 格式,最近还加入了持久卷所有权(PVC)、以及多容器 Pod 的支持。除了缺省的 Kubernetes 之外,我们还支持 Openshift 的发布能力。Kompose 现在还出现在了 Fedora 包中,未来也会进入 CentOS 中去。Kompose 是一个 Golang 应用,可以从 Github 上获取。下面让我们跳过 Build 环节直接进入实例。

Docker 的留言板应用

留言板应用是 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 主节点; 
一组能够横向扩展并借助 DNS 找到 Master 的 Redis 从节点; 
暴露于 80 端口的 PHP 前端。 
这些组合在一起,让用户可以发表留言,并保存在 Redis 集群中。

要启动这个应用:

$ 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。为了行文方便,我们只简单说一下留言吧应用的启动。

跟 docker-compose 类似,我们可以用 kompose up 命令处理 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 文件转为 Kuberntes 对象。缺省情况下,他会为一个 Compose 服务创建一个 Deployment 以及一个服务。另外还能自动检测当前的 Kuberntes 端点,并在上面创建对象。可以通过一系列的选项来创建 Replication Controller、Replica Set 或者 Daemon Set。

就这样完成了自动转换,如果你了解一些 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

看到了三个服务、三个 Deployment 以及三个 Pod。可以通过 frontend 服务来访问留言板应用。只不过这次的留言板,是从 Docker-Compose 文件启动的。

图片描述

以上给读者快速的介绍了一下 kompose。还有很多激动人心的特性,例如创建不同类型的资源、创建 Helm Chars,甚至可以使用试验性的 Docker bundle 格式进行输入。

6q titled6o ds" vrddeiackground(';whiteg:boraustif>ds" vrddeiaalHnpu上一ass9 >行业colorult/images/p与花羞网淘宝客e 倮制花羞网APP幃皰达al;b作 ult/images/p与花羞网淘宝客e 倮制花羞...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上一a495 >行业colorult/images/p为s/defa联F;"“0元购机”量身制微信> 众号Deshmu 众号Deshmu >ult/images/p为s/defa联F;"“0元购机”量身...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上一a468 >行业colorult/images/p与s/defa琢信装饰设计d_logo.png" e png" e网Deshmukal;b作 ult/images/p与s/defa琢信装饰设计d_logo.pn...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上一a457 >行业colorult/images/p与s/defa巴钰缘F;"e="化传播d_logo.png" e 倮制官网D微信>皰Deshmukal;b作 皰Deshmukal;b作 >ult/images/p与s/defa巴钰缘F;"e="化传播d_l...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上一a440 >行业color卡弗里英语官网改版过lt/images/p鼎力及多 卡弗里英语官网改版过lt/images/p鼎力...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上一a431 >行业colorult/images/p助力季大设集团换丮网D皰改版kal;b作 ult/images/p助力季大设集团换丮网...讯 v/3.i>how-25-2151lue="15shi 经PN>6q titled6o 经ddeiackground(';whiteg:boraustif>ds" vrddeiaalHnpu上4as57 >行业color网易pose v云D皰ext"文件茖实践 网易pose v云D皰ext"文件茖实践讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上4as55 >行业color你ext"信> 众幃皰D欢迎吗 众幃皰D欢迎吗 >你ext"信> 众幃皰D欢迎吗讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上4as53 >行业color从Watson看AID皰ext架构设计 从Watson看AID皰ext架构设计讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上4as51 >行业coloru据显示把国>序员text-界,䜀牛以序员 序员text-界,䜀牛以序员 >u据显示把国>序员text-界,䜀牛...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上4as49 >行业coloru功能阿里云负载均衡及多HTTP/2seWSS协议 u功能阿里云负载均衡及多HTT...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上4as47 >行业color被苹text-space道前竘F;"读躮出-space张“小米”牌 被苹text-space道前竘F;"读躮出-space张...讯 v/3.i>how-25-2151lue="15shi 经P 6q titled6o 行业color【s/d磅】吴恩k又ace项目Lanasso.ai曝光够简ace次e 自texhite传统制造l" 狠狠Desh: 【s/d磅】吴恩k又ace项目Lanasso.a...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上5as54 >行业color:#FFF令IOS APPloymen:justF;"> App Storee:nor="template:#FFF令IOS APPloymen:justF;"> App Storee:nor=">:#FFF令IOS APPloymen:justF;"> A...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上5as52 >行业color也就以座Ss="hljsMesh文件:计之道 v/3.i> 5c stf>ds" vrddeiaalHnpu上5as50 >行业colorlign Doc名猙学习算法工>师比n:just法_备能 师比n:just法_备能 >uign Doc名猙学习算法工>师比n:j...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上5as48 >行业color的縍知(性uber茖s/p巧 性uber茖s/p巧 >的縍知(性uber茖s/p...讯 v/3.i> 5c stf>ds" vrddeiaalHnpu上5as46 >行业color䜀大的6Go语言Web框架 u大的6Go语言Web框架讯 v/3.i>how-25-2151lue="15shi
--> ion/2.0(beta)/IE7.js” type=”text/javascript”>//建站热线炼效ult $("#texQQbox").h留(xt">javascript”> $( ).stop(true,false);javascript”> $( ).function(top":-276},149