這篇文章已超過一年。較舊的文章可能包含過時的內容。請確認頁面中的資訊自發布以來未變得不正確。

草稿:Kubernetes 容器開發變得簡單

大約一個月前,Microsoft 宣布收購 Deis,以擴展我們在容器和 Kubernetes 方面的專業知識。今天,我很高興宣布一個新的開源專案,該專案源自於這個新擴編的 Azure 團隊:Draft。

雖然現在大家都很清楚 Kubernetes 在大規模部署和管理應用程式方面的優勢。但為 Kubernetes 開發新應用程式的過程仍然相當困難。如果你是容器、Kubernetes 或雲端應用程式開發的新手,那就更困難了。

Draft 填補了這個角色。顧名思義,它是一個工具,可協助你開始撰寫在 Kubernetes 中執行的容器化應用程式的初稿。當你第一次執行 draft 工具時,它會自動偵測你正在處理的程式碼,並建立支架來支援容器化你的應用程式。Draft 會使用啟發式方法和各種預先定義的專案範本,建立初始 Dockerfile 以容器化你的應用程式,以及 Helm Chart,以便在 Kubernetes 叢集中部署和維護你的應用程式。團隊甚至可以攜帶自己的 draft 專案範本,以自訂工具所建立的支架。

但是,draft 的價值不僅僅在於在某些檔案中建立支架來協助你建立應用程式。Draft 也會在你現有的 Kubernetes 叢集中部署伺服器,該伺服器會自動與你筆記型電腦上的程式碼保持同步。每當你對應用程式進行變更時,你筆記型電腦上的 draft daemon 會將程式碼與 Kubernetes 中的 draft 伺服器同步,並自動建置和部署新的容器,而無需任何使用者操作。Draft 實現了雲端的「內部迴圈」開發體驗。

當然,如同現今所有基礎架構軟體的期望,Draft 以開源專案形式提供,而且它本身也處於「草稿」階段 :) 我們熱切邀請社群今天就來試用 draft,我們認為它非常棒,即使在這個早期階段也是如此。但我們特別興奮地想看看如何圍繞 draft 發展社群,使其對所有 Kubernetes 上容器化應用程式的開發人員更強大。

為了讓你了解 Draft 的功能,以下範例取自 GitHub 儲存庫中「入門指南」頁面。

examples directory」目錄中包含多個範例應用程式。在本逐步解說中,我們將使用「python example application」python 範例應用程式,該應用程式使用「Flask」提供非常簡單的 Hello World 網頁伺服器。

$ cd examples/python

Draft 建立

我們需要一些「支架」才能將我們的應用程式部署到「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 image」映像檔,該映像檔將安裝 requirements.txt 中的相依性,並將目前目錄複製到 /usr/src/app 中。為了與 chart/values.yaml 中的服務值對齊,此 Dockerfile 會從容器公開埠 80。

draft.toml 檔案包含關於應用程式的基本組態,例如名稱、將部署到的 namespace,以及是否在本地檔案變更時自動部署應用程式。

$ cat draft.toml  
[environments]  
 [environments.development]  
   name = "tufted-lamb"  
   namespace = "default"  
   watch = true  
   watch\_delay = 2

Draft 啟動

現在我們準備好將 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 啟動 (升級)

現在,如果我們觀察最初使用 draft up 呼叫的終端機,Draft 會注意到本地端有變更,並再次呼叫 draft up。然後,Draft 會判斷 Helm 版本已存在,並將執行 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 開發方面所能做的一切。祝你 drafting 愉快!