本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
草稿:让 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 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/` 目录和应用程序目录压缩为两个单独的 tarball
- 将 tarball 上传到服务器端组件 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 release 已存在,并将执行 `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 开发所能做的一切。祝您起草愉快!
- 在 Stack Overflow 上提问(或回答问题)
- 加入 K8sPort 上的倡导者社区门户
- 在 Twitter 上关注我们 @Kubernetesio 获取最新更新
- 在 Slack 上与社区联系
- 在 GitHub 上参与 Kubernetes 项目