一、介绍
Draft是微软Deis团队开源的一个用Go语言编写的容器应用开发辅助工具,用于帮助开发人员简化容器应用程序构建和部署的开发流程。Draft的设计思路在于,允许开发人员在不了Docker和Kubernetes相关知识的前提下,仍可顺利实现应用程序开发。在Draft的帮助下,开发者甚至不需要在本地计算机中安装Docker和Kubernetes等工具。
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命令条件已经具备。
2、安装并配置Helm
wget https://get.helm.sh/helm-v2.16.1-linux-amd64.tar.gztar-zxvf helm-v2.16.1-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
在使用Helm之前先执行helm init命令,完成初始化设置,这个命令会安装Tiller到现有的K8s集群的kube-system命名空间中,同时进行一些本地化的配置。
查看kube-system命名空间,tiller已经处于Running状态了。
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.gz
sudo mv linux-amd64/draft /usr/local/bin/draft
查看draft版本
[root@learncloudnative ~]#draftversion&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
三、使用
1、下载样例库
这里使用Draft代码库中自带的样例,下载github上的代码库,进入到example-python目录下,只有两个文件。
gitclone https://github.com/Azure/draft.gitcd examples/example-python/[root@learncloudnativeexample-python]# lsapp.py requirements.txt
2、使用draft create命令创建draft文件
Draft提供了一些脚手架将应用程序部署到K8s集群中,通过draft create命令可以创建Helm chart,Dockerfile和一个Draft toml文件。
[root@learncloudnative example-python]#draftcreate-->DraftdetectedPython(97.267760%)-->Readytosail[root@learncloudnative example-python]#ls-a. ..app.pychartsDockerfile.dockerignore.draftignore.draft-tasks.tomldraft.tomlrequirements.txt
由Draft自动生成的charts/ 和 Dockerfile默认是基本的Python配置,这个Dockerfile使用python镜像,并且安装requirements.txt中的依赖,将当前目录拷贝到/usr/src/app中,为了与charts/python/values.yaml中service的internalPort端口保持一致,这个Dockerfile对外暴露的端口也是8080。
[root@learncloudnativeexample-python]# cat Dockerfile FROMpythonENVPORT 8080EXPOSE8080WORKDIR/usr/src/appCOPYrequirements.txt ./RUNpip 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 =truewatch =falsewatch-delay =2auto-connect =falsedockerfile =""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之后配置一些任务。
3、部署服务(draft up)
一切准备好之后,执行draft up 命令将应用部署到K8s集群中。在执行draft up命令时的流程是:
读取并解析代码库中的draft.toml文件
压缩charts/目录和应用目录为两个独立的tar包
使用docker构建容器镜像
使用docker将镜像推送到镜像仓库
使用helm安装这个chart,也就是这个新创建的镜像
部署服务
连接服务
服务部署到K8s集群中,可以使用draft connect连接到服务上,这个命令执行后,会创建一个代理连接到这个pod暴露出来的端口上。
调用服务
使用curl命令调用部署的应用服务。
4、更新服务
修改app.py打印出“Hello,Draft!”,保存后执行draft up从新构建镜像并发布应用到K8s集群中,执行draft connect连接到K8s集群中的服务。
再次,调用URL能看到打印的日志已经是新修改的。
对于更新服务,可以在draft.toml配置文件中指定watch=true可以监听本地文件的变化,当本地文件发生变化后,即触发镜像构建、镜像部署等过程。
5、删除服务
当服务不再使用时,使用draft delete命令将该应用从K8s集群中删除。
查看该应用的状态已经变为Terminating,稍等片刻后,该应用就从集群中删掉了。
四、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还提供了部署到生产环境的流水线工具。二者也都提供了插件体系结构,用于满足构建、部署等解决的多样性。
五、总结
随着云原生时代的到来,本地开发辅助的工具也种类繁多,各大厂也都推出了自己的辅助工具。虽然功能特性不尽相同,但目的是一样的,都是为了提高本地开发的效率,频繁的更新和测试,能够大幅降低问题修复的成本。
容器的出现,彻底改变了软件交付和运行的过程,应用的构建、分发和交付得以在这个层面上实现了标准化,大幅降低了企业IT实施和运维成本,提升了业务创新的效率。
像Draft、Skaffold这样的本地开发辅助工具,就是利用了容器的能力,标准的构建流程,标准的Kubernetes编排。目前,软件已经实现了集装箱式的运输,只需要提供一套镜像文件和一套编排文件就能快速启动一套环境。