本文超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
Draft:简化 Kubernetes 容器开发
大约一个月前,微软宣布收购 Deis,以扩展我们在容器和 Kubernetes 方面的专业知识。今天,我很高兴地宣布一个来自这个新扩展的 Azure 团队的新开源项目:Draft。
虽然现在 Kubernetes 用于大规模部署和管理应用程序的优势已广为人知,但为 Kubernetes 开发新应用程序的过程仍然太难。如果您是容器、Kubernetes 或云应用程序开发的新手,那就更难了。
Draft 填补了这一角色。顾名思义,它是一个帮助您开始在 Kubernetes 中运行的容器化应用程序的初稿的工具。当您第一次运行 draft 工具时,它会自动发现您正在处理的代码并构建支持将您的应用程序容器化的框架。使用启发式方法和各种预定义的项目模板,draft 将创建一个初始 Dockerfile 来容器化您的应用程序,以及一个 Helm Chart 以使您的应用程序能够在 Kubernetes 集群中部署和维护。团队甚至可以带来他们自己的 draft 项目模板来自定义该工具构建的框架。
但 draft 的价值不仅仅在于搭建一些文件来帮助您创建应用程序。Draft 还会将服务器部署到您现有的 Kubernetes 集群中,该集群会自动与您笔记本电脑上的代码保持同步。每当您对应用程序进行更改时,笔记本电脑上的 draft 守护程序都会将该代码与 Kubernetes 中的 draft 服务器同步,并且无需任何用户操作即可自动构建和部署新容器。Draft 支持云的“内循环”开发体验。
当然,正如当今所有基础设施软件的预期一样,Draft 可以作为开源项目提供,它本身也处于“草案”形式 :) 我们热切邀请社区来试用 draft,我们认为它非常棒,即使是在这个早期阶段。但我们尤其兴奋地看到我们如何围绕 draft 建立一个社区,使其对 Kubernetes 上所有容器化应用程序的开发人员更加强大。
为了让您了解 Draft 可以做什么,这里有一个来自 入门 页面(位于 GitHub 存储库 中)的示例。
examples 目录 中包含多个示例应用程序。在本演练中,我们将使用 python 示例应用程序,该应用程序使用 Flask 提供一个非常简单的 Hello World 网络服务器。
$ cd examples/python
Draft Create(创建)
我们需要一些“框架”来将我们的应用程序部署到 Kubernetes 集群中。 Draft 可以使用 draft create 创建 Helm 图表、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/ 目录和应用程序目录压缩为两个单独的 tarball
- 将 tarball 上传到服务器端组件 draftd
- 然后 draftd 构建 docker 镜像并将镜像推送到注册表
- draftd 指示 helm 安装 Helm 图表,引用刚刚构建的 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 项目