本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

草稿:讓 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 開發所能做的一切。祝您起草愉快!