本文已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已不准确。
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 愉快!
- 在 Stack Overflow 上提问(或回答问题)
- 在 K8sPort 加入贡献者社区门户
- 在 Twitter 上关注我们 @Kubernetesio 获取最新动态
- 在 Slack 上与社区联系
- 在 GitHub 上参与 Kubernetes 项目