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

Draft:简化 Kubernetes 容器开发

大约一个月前,微软宣布收购 Deis,以扩展我们在容器和 Kubernetes 领域的专业知识。今天,我很高兴地宣布一项源自这个新扩大的 Azure 团队的全新开源项目:Draft。

尽管现在 Kubernetes 在大规模部署和管理应用方面的优势已广为人知。但为 Kubernetes 开发新应用的过程仍然过于困难。如果您是容器、Kubernetes 或云应用开发的新手,则会更加困难。

Draft 正是填补了这一空白。正如其名称所示,它是一个帮助您开始为在 Kubernetes 中运行的容器化应用创建第一份草稿的工具。当您首次运行 draft 工具时,它会自动发现您正在处理的代码,并构建起支持应用容器化的脚手架。通过启发式方法和各种预定义项目模板,draft 将创建一个初步的 Dockerfile 来容器化您的应用,以及一个 Helm Chart,使您的应用能够部署并在 Kubernetes 集群中维护。团队甚至可以引入自己的 draft 项目模板,以定制该工具构建的脚手架。

但 draft 的价值不仅限于简单地构建一些文件来帮助您创建应用。Draft 还会将一个服务器部署到您现有的 Kubernetes 集群中,该服务器会自动与您笔记本电脑上的代码保持同步。每当您对应用进行更改时,您笔记本电脑上的 draft daemon 会将代码与 Kubernetes 中的 draft 服务器同步,然后会自动构建并部署一个新的容器,无需任何用户操作。Draft 实现了云端的“内循环”开发体验。

当然,正如当今所有基础设施软件所期望的那样,Draft 作为开源项目提供,而且它本身也处于“草稿”形式 :) 我们热切邀请社区成员今天就来试用 draft,即使是这个早期版本,我们认为它也相当棒。但我们尤其兴奋地期待着如何围绕 draft 发展社区,使其对所有 Kubernetes 上的容器化应用开发者来说变得更加强大。

为了让您了解 Draft 的功能,这里提供一个示例,取自 入门 页面,位于 GitHub 仓库 中。

examples 目录 中包含多个示例应用。在本次演练中,我们将使用 python 示例应用,该应用使用 Flask 提供一个非常简单的 Hello World Web 服务器。

$ cd examples/python

Draft Create

我们需要一些“脚手架”将应用部署到 Kubernetes 集群中。Draft 可以使用 draft create 命令创建一个 Helm chart、一个 Dockerfile 和一个 draft.toml 文件。

$ draft create

--\> Python app detected

--\> Ready to sail

$ ls

Dockerfile  app.py  chart/  draft.toml  requirements.txt

Draft 创建的 chart/ 和 Dockerfile 资产默认为基本的 Python 配置。该 Dockerfile 利用了 python:onbuild 镜像,它将安装 requirements.txt 中的依赖项,并将当前目录复制到 /usr/src/app。为了与 chart/values.yaml 中的服务值保持一致,此 Dockerfile 从容器中暴露端口 80。

draft.toml 文件包含应用的基本配置,例如名称、部署到的命名空间,以及当本地文件更改时是否自动部署应用。

$ cat draft.toml  
[environments]  
 [environments.development]  
   name = "tufted-lamb"  
   namespace = "default"  
   watch = true  
   watch\_delay = 2

Draft Up

现在我们准备将 app.py 部署到 Kubernetes 集群中。

Draft 使用一个 draft up 命令处理这些任务

  • 从 draft.toml 读取配置
  • 将 chart/ 目录和应用目录分别压缩成两个 tar 包
  • 将 tar 包上传到服务器端组件 draftd
  • draftd 随后构建 docker 镜像并将镜像推送到注册表
  • draftd 指示 helm 安装 Helm chart,并引用刚刚构建的 Docker 注册表镜像

将 watch 选项设置为 true,我们可以在后台运行此命令,同时稍后进行更改…

$ draft up  
--\> Building Dockerfile  
Step 1 : FROM python:onbuild  
onbuild: Pulling from library/python  
...  
Successfully built 38f35b50162c  
--\> Pushing docker.io/microsoft/tufted-lamb:5a3c633ae76c9bdb81b55f5d4a783398bf00658e  
The push refers to a repository [docker.io/microsoft/tufted-lamb]  
...  
5a3c633ae76c9bdb81b55f5d4a783398bf00658e: digest: sha256:9d9e9fdb8ee3139dd77a110fa2d2b87573c3ff5ec9c045db6009009d1c9ebf5b size: 16384  
--\> Deploying to Kubernetes  
   Release "tufted-lamb" does not exist. Installing it now.  
--\> Status: DEPLOYED  
--\> Notes:  
    1. Get the application URL by running these commands:  
    NOTE: It may take a few minutes for the LoadBalancer IP to be available.  
          You can watch the status of by running 'kubectl get svc -w tufted-lamb-tufted-lamb'  
 export SERVICE\_IP=$(kubectl get svc --namespace default tufted-lamb-tufted-lamb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')  
 echo http://$SERVICE\_IP:80  

Watching local files for changes...

与部署的应用交互

使用成功部署后方便的输出,我们现在可以访问我们的应用。请注意,Kubernetes 配置负载均衡器可能需要几分钟时间。请耐心等待!

$ export SERVICE\_IP=$(kubectl get svc --namespace default tufted-lamb-tufted-lamb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')  
$ curl [http://$SERVICE\_IP](http://%24service_ip/)

当我们 curl 访问应用时,会看到应用正在运行!一个美丽的“Hello World!”迎接我们。

更新应用

现在,我们将 app.py 中的“Hello, World!”输出更改为“Hello, Draft!”

$ cat \<\<EOF \> app.py  
from flask import Flask  

app = Flask(\_\_name\_\_)  

@app.route("/")  
def hello():  
   return "Hello, Draft!\n"  

if \_\_name\_\_ == "\_\_main\_\_":  
   app.run(host='0.0.0.0', port=8080)  
EOF

Draft Up(grade)

现在,如果我们观察最初调用 draft up 的终端,Draft 会注意到本地发生了更改,并再次调用 draft up。Draft 会判断 Helm 发布已存在,并将执行 helm upgrade 而不是尝试再次执行 helm install。

--\> Building Dockerfile  
Step 1 : FROM python:onbuild  
...  
Successfully built 9c90b0445146  
--\> Pushing docker.io/microsoft/tufted-lamb:f031eb675112e2c942369a10815850a0b8bf190e  
The push refers to a repository [docker.io/microsoft/tufted-lamb]  
...  
--\> Deploying to Kubernetes  
--\> Status: DEPLOYED  
--\> Notes:  
    1. Get the application URL by running these commands:  
    NOTE: It may take a few minutes for the LoadBalancer IP to be available.  
          You can watch the status of by running 'kubectl get svc -w tufted-lamb-tufted-lamb'  
 export SERVICE\_IP=$(kubectl get svc --namespace default tufted-lamb-tufted-lamb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')  
 echo [http://$SERVICE\_IP:80](http://%24service_ip/)

现在当我们运行 curl http://$SERVICE_IP 时,我们的第一个应用已经通过 Draft 部署并更新到了我们的 Kubernetes 集群!

我们希望这能让您了解 Draft 为简化 Kubernetes 开发所能做到的一切。祝您 Drafting 愉快!