一、介紹
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命令行
這個可以參考之前的文章《 》,目前K8s集群和kubectl命令條件已經具備。
2、安裝並配置Helm
wget https://get.helm.sh/helm-v2.16.1-linux-amd64.tar.gz
tar -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.gz
tar -xzvf draft-v0.14.1-linux-amd64.tar.gz
sudo 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
三、使用
1、下載樣例庫
這裡使用Draft代碼庫中自帶的樣例,下載github上的代碼庫,進入到example-python目錄下,只有兩個文件。
git clone https://github.com/Azure/draft.git
cd examples/example-python/
[root@learncloudnative example-python]# ls
app.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 python
ENV PORT 8080
EXPOSE 8080
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
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
Dockerfile
draft.toml
charts/
在上面的文件列表中還有一個.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,也就是這個新創建的鏡像
部署服務
查看服務
使用kubectl get pods查看K8s集群中的服務。
連接服務
服務部署到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編排。目前,軟件已經實現了集裝箱式的運輸,只需要提供一套鏡像文件和一套編排文件就能快速啟動一套環境。
DevOps如今越來越火了,DevOps相關的文章也多了,成功案例也多了,DevOps相關的崗位也多了,可以用今日頭條app上方的搜索框輸入:DevOps,就能看到好多相關信息。
閱讀更多 DevOps亮哥 的文章