一、介绍

Draft是微软Deis团队开源的一个用Go语言编写的容器应用开发辅助工具,用于帮助开发人员简化容器应用程序构建和部署的开发流程。Draft的设计思路在于,允许开发人员在不了Docker和Kubernetes相关知识的前提下,仍可顺利实现应用程序开发。在Draft的帮助下,开发者甚至不需要在本地计算机中安装Docker和Kubernetes等工具。




开放原子怎么下载docker镜像_python


Draft通过三个命令来完成这个流程:

1、draft init:初始化docker registry账号,并在Kubernetes集群中部署draftd,这个进程负责镜像的构建、将镜像推送到docker registry中。

2、draft create:Draft 根据 packs 检测应用的开发语言,并自动生成 Dockerfile 和 Kubernetes Helm Charts。当前,Draft内部支持8种类型的语言,包括Java、PHP、GO等。

3、draft up:根据Dockerfile构建镜像,并使用Helm将应用部署到Kubernetes集群中。同时,还会在本地启动一个draft client,监控代码的变化,并将更新过的代码推送给draftd。

二、安装

如果要演示使用Draft辅助本地开发,需要有先决条件:

1、Kubernetes集群以及kubectl命令行

这个可以参考之前的文章《Jenkins X--(6)虚拟机里搭建Minikube环境》,目前K8s集群和kubectl命令条件已经具备。


开放原子怎么下载docker镜像_docker_02


2、安装并配置Helm

wget https://get.helm.sh/helm-v2.16.1-linux-amd64.tar.gztar -zxvf helm-v2.16.1-linux-amd64.tar.gzsudo mv linux-amd64/helm /usr/local/bin/helm

在使用Helm之前先执行helm init命令,完成初始化设置,这个命令会安装Tiller到现有的K8s集群的kube-system命名空间中,同时进行一些本地化的配置。


开放原子怎么下载docker镜像_Dockerfile_03


查看kube-system命名空间,tiller已经处于Running状态了。


开放原子怎么下载docker镜像_docker_04


3、安装并配置Draft

一般Draft是安装在开发者本地机器上,因此Draft支持多个平台的安装。

Linux

wget https://azuredraft.blob.core.windows.net/draft/draft-v0.14.1-linux-amd64.tar.gztar -xzvf draft-v0.14.1-linux-amd64.tar.gzsudo mv linux-amd64/draft /usr/local/bin/draft

查看draft版本

[root@learncloudnative ~]# draft version&version.Version{SemVer:"v0.14.1", GitCommit:"fdc29c553a45600ac4f795f3485d4bb9a80c7862", GitTreeState:"clean"}

MacOS

使用Homebrew安装Draft

$ brew install azure/draft/draft

Windows

使用Chocolatey安装Draft

$ choco install draft

GoFish

或者使用GoFish,能同时支持Linux/MacOS/Windows平台。

$ gofish install draft

配置Draft

安装好Draft后,执行下面的命令进行设置,draft的plugin、pack repo、配置等都存储在~/.draft目录下。

$ draft init


开放原子怎么下载docker镜像_Dockerfile_05


三、使用

1、下载样例库

这里使用Draft代码库中自带的样例,下载github上的代码库,进入到example-python目录下,只有两个文件。

git clone https://github.com/Azure/draft.gitcd examples/example-python/[root@learncloudnative example-python]# lsapp.py requirements.txt

2、使用draft create命令创建draft文件

Draft提供了一些脚手架将应用程序部署到K8s集群中,通过draft create命令可以创建Helm chart,Dockerfile和一个Draft toml文件。

[root@learncloudnative example-python]# draft create--> Draft detected Python (97.267760%)--> Ready to sail[root@learncloudnative example-python]# ls -a. .. app.py charts Dockerfile .dockerignore .draftignore .draft-tasks.toml draft.toml requirements.txt

由Draft自动生成的charts/ 和 Dockerfile默认是基本的Python配置,这个Dockerfile使用python镜像,并且安装requirements.txt中的依赖,将当前目录拷贝到/usr/src/app中,为了与charts/python/values.yaml中service的internalPort端口保持一致,这个Dockerfile对外暴露的端口也是8080。

[root@learncloudnative example-python]# cat Dockerfile FROM pythonENV PORT 8080EXPOSE 8080WORKDIR /usr/src/appCOPY requirements.txt ./RUN pip install --no-cache-dir -r requirements.txtCOPY . .ENTRYPOINT ["python"]CMD ["app.py"]

draft.toml是Draft识别的文件,包含了基本的配置详情,如应用名称,部署的命名空间,是否当文件变化后自动部署应用到K8s集群中。

[root@learncloudnative example-python]# cat draft.toml [environments] [environments.development] name = "example-python" namespace = "default" wait = true watch = false watch-delay = 2 auto-connect = false dockerfile = "" chart = ""

.draftignore文件用于在执行draft up时排除一些文件,以及在监控文件变化时排除一些文件不被监听。

[root@learncloudnative example-python]# cat .draftignore *.swp*.tmp*.temp.git*

.dockerignore 文件用于Docker在构建镜像时忽略一些不需要的文件和目录。

[root@learncloudnative example-python]# cat .dockerignore Dockerfiledraft.tomlcharts/

在上面的文件列表中还有一个.draft-tasks.toml文件,这个文件相对于钩子,可以在draft up之前(pre-up)或之后(post-deploy),draft delete之后配置一些任务。


开放原子怎么下载docker镜像_保存blob到本地_06


3、部署服务(draft up)

一切准备好之后,执行draft up 命令将应用部署到K8s集群中。在执行draft up命令时的流程是:

  • 读取并解析代码库中的draft.toml文件
  • 压缩charts/目录和应用目录为两个独立的tar包
  • 使用docker构建容器镜像
  • 使用docker将镜像推送到镜像仓库
  • 使用helm安装这个chart,也就是这个新创建的镜像

部署服务


开放原子怎么下载docker镜像_python_07


查看服务

使用kubectl get pods查看K8s集群中的服务。


开放原子怎么下载docker镜像_保存blob到本地_08


连接服务

服务部署到K8s集群中,可以使用draft connect连接到服务上,这个命令执行后,会创建一个代理连接到这个pod暴露出来的端口上。


开放原子怎么下载docker镜像_保存blob到本地_09


调用服务

使用curl命令调用部署的应用服务。


开放原子怎么下载docker镜像_python_10


4、更新服务

修改app.py打印出“Hello,Draft!”,保存后执行draft up从新构建镜像并发布应用到K8s集群中,执行draft connect连接到K8s集群中的服务。


开放原子怎么下载docker镜像_保存blob到本地_11


再次,调用URL能看到打印的日志已经是新修改的。


开放原子怎么下载docker镜像_docker_12


对于更新服务,可以在draft.toml配置文件中指定watch=true可以监听本地文件的变化,当本地文件发生变化后,即触发镜像构建、镜像部署等过程。

5、删除服务

当服务不再使用时,使用draft delete命令将该应用从K8s集群中删除。


开放原子怎么下载docker镜像_docker_13


查看该应用的状态已经变为Terminating,稍等片刻后,该应用就从集群中删掉了。


开放原子怎么下载docker镜像_docker_14


四、Draft与Skaffold对比

Skaffold也是云原生下辅助本地开发的命令行工具,在这篇文章《一款云原生时代本地开发调试的利器-Skaffold》中有介绍。Draft和Skaffold这两个工具都可以用作CI/CD流水线中的构建块,自动化的将更新的程序部署到Kubernetes集群上,最终目的是让更新的应用程序在K8s集群中运行,以更频繁更新、部署来减少错误。

Draft是微软开源的构建和部署工具。它就像一个流水线编排的CLI,因为使用的Helm进行管理,也被归类为包管理器。Draft的定位在本地编写代码和提交给源代码管理之前供开发人员使用。Draft可以直接从本地计算机生成Docker镜像,然后将其部署到集群中。它创建并使用Helm charts来生成Kubernetes manifests来部署应用程序。使用Draft可以部署应用程序到运行在Azure上的Kubernetes。

Skaffold是Google发布的一个相对较新的工具。Skaffold是一个命令行工具,管理应用程序的构建、推送和部署到Kubernetes的整个工作流程。它的设计可以使你持续迭代本地代码,然后Skaffold将构建和部署这些更新到本地或远程的Kubernetes集群中。

虽然二者都允许开发人员在本地迭代和测试Kubernetes应用程序,但Skaffold还提供了部署到生产环境的流水线工具。二者也都提供了插件体系结构,用于满足构建、部署等解决的多样性。


开放原子怎么下载docker镜像_保存blob到本地_15

Skaffold工作流程


五、总结

随着云原生时代的到来,本地开发辅助的工具也种类繁多,各大厂也都推出了自己的辅助工具。虽然功能特性不尽相同,但目的是一样的,都是为了提高本地开发的效率,频繁的更新和测试,能够大幅降低问题修复的成本。

容器的出现,彻底改变了软件交付和运行的过程,应用的构建、分发和交付得以在这个层面上实现了标准化,大幅降低了企业IT实施和运维成本,提升了业务创新的效率。

像Draft、Skaffold这样的本地开发辅助工具,就是利用了容器的能力,标准的构建流程,标准的Kubernetes编排。目前,软件已经实现了集装箱式的运输,只需要提供一套镜像文件和一套编排文件就能快速启动一套环境。

DevOps如今越来越火了,DevOps相关的文章也多了,成功案例也多了,DevOps相关的岗位也多了,可以用今日头条app上方的搜索框输入:DevOps,就能看到好多相关信息。


开放原子怎么下载docker镜像_python_16