Draft
Draft 是微软 Deis 团队开源(见 https://github.com/azure/draft)的容器应用开发辅助工具,它可以帮助开发人员简化容器应用程序的开发流程。
Draft 主要由三个命令组成
  • draft init:初始化 docker registry 账号,并在 Kubernetes 集群中部署 draftd(负责镜像构建、将镜像推送到 docker registry 以及部署应用等)
  • draft create:draft 根据 packs 检测应用的开发语言,并自动生成 Dockerfile 和 Kubernetes Helm Charts
  • draft up:根据 Dockfile 构建镜像,并使用 Helm 将应用部署到 Kubernetes 集群(支持本地或远端集群)。同时,还会在本地启动一个 draft client,监控代码变化,并将更新过的代码推送给 draftd。

Draft 安装

由于 Draft 需要构建镜像并部署应用到 Kubernetes 集群,因而在安装 Draft 之前需要
  • 部署一个 Kubernetes 集群,部署方法可以参考 kubernetes 部署方法
  • 安装并初始化 helm(需要 v2.4.x 版本,并且不要忘记运行 helm init),具体步骤可以参考 helm 使用方法
  • 注册 docker registry 账号,比如 Docker HubQuay.io
  • 配置 Ingress Controller 并在 DNS 中设置通配符域 * 的 A 记录(如 *.draft.example.com)到 Ingress IP 地址。最简单的 Ingress Controller 创建方式是使用 helm:
1
# 部署 nginx ingress controller
2
$ helm install stable/nginx-ingress --namespace=kube-system --name=nginx-ingress
3
# 等待 ingress controller 配置完成,并记下外网 IP
4
$ kubectl --namespace kube-system get services -w nginx-ingress-nginx-ingress-controller
Copied!
minikube Ingress Controller
minikube 中配置和使用 Ingress Controller 的方法可以参考 这里
初始化好 Kubernetes 集群和 Helm 后,可以在 这里 下载 draft 二进制文件,并配置 draft
1
# 注意修改用户名、密码和邮件
2
$ token=$(echo '{"username":"feisky","password":"secret","email":"[email protected]"}' | base64)
3
# 注意修改 registry.org 和 basedomain
4
$ draft init --set registry.url=docker.io,registry.org=feisky,registry.authtoken=${token},basedomain=app.feisky.xyz
Copied!

Draft 入门

draft 源码中提供了很多应用的 示例,我们来看一下怎么用 draft 来简化 python 应用的开发流程。
1
$ git clone https://github.com/Azure/draft.git
2
$ cd draft/examples/python
3
$ ls
4
app.py requirements.txt
5
6
$ cat requirements.txt
7
flask
8
$ cat app.py
9
from flask import Flask
10
app = Flask(__name__)
11
12
@app.route('/')
13
def hello_world():
14
return "Hello, World!\n"
15
16
if __name__ == '__main__':
17
app.run(host='0.0.0.0', port=8080)
Copied!
Draft create 生成 Dockerfile 和 chart
1
$ draft create
2
--> Python app detected
3
--> Ready to sail
4
$ ls
5
Dockerfile app.py chart draft.toml requirements.txt
6
$ cat Dockerfile
7
FROM python:onbuild
8
EXPOSE 8080
9
ENTRYPOINT ["python"]
10
CMD ["app.py"]
11
$ cat draft.toml
12
[environments]
13
[environments.development]
14
name = "virulent-sheep"
15
namespace = "default"
16
watch = true
17
watch_delay = 2
Copied!
Draft Up 构建镜像并部署应用
1
$ draft up
2
--> Building Dockerfile
3
Step 1 : FROM python:onbuild
4
onbuild: Pulling from library/python
5
10a267c67f42: Pulling fs layer
6
....
7
Digest: sha256:5178d22192c2b8b4e1140a3bae9021ee0e808d754b4310014745c11f03fcc61b
8
Status: Downloaded newer image for python:onbuild
9
# Executing 3 build triggers...
10
Step 1 : COPY requirements.txt /usr/src/app/
11
Step 1 : RUN pip install --no-cache-dir -r requirements.txt
12
....
13
Successfully built f742caba47ed
14
--> Pushing docker.io/feisky/virulent-sheep:de7e97d0d889b4cdb81ae4b972097d759c59e06e
15
....
16
de7e97d0d889b4cdb81ae4b972097d759c59e06e: digest: sha256:7ee10c1a56ced4f854e7934c9d4a1722d331d7e9bf8130c1a01d6adf7aed6238 size: 2840
17
--> Deploying to Kubernetes
18
Release "virulent-sheep" does not exist. Installing it now.
19
--> Status: DEPLOYED
20
--> Notes:
21
22
http://virulent-sheep.app.feisky.xyzto access your application
23
24
Watching local files for changes...
Copied!
打开一个新的 shell,就可以通过子域名来访问应用了
1
$ curl virulent-sheep.app.feisky.xyz
2
Hello, World!
Copied!
复制链接