使用 kubectl 建立部署
目標
- 瞭解應用程式部署。
- 使用 kubectl 在 Kubernetes 上部署您的第一個應用。
Kubernetes 部署
注意
本教程使用一個需要 AMD64 架構的容器。如果您在具有不同 CPU 架構的計算機上使用 minikube,您可以嘗試使用支援模擬 AMD64 的驅動程式(例如 Docker Desktop 驅動程式)。一旦您有一個正在執行的 Kubernetes 叢集,您就可以在其上部署容器化應用程式。為此,您需要建立一個 Kubernetes Deployment。Deployment 指示 Kubernetes 如何建立和更新應用程式例項。建立 Deployment 後,Kubernetes 控制平面會將該 Deployment 中包含的應用程式例項排程到叢集中的各個節點上執行。
應用程式例項建立後,Kubernetes Deployment 控制器會持續監控這些例項。如果託管例項的節點發生故障或被刪除,Deployment 控制器會用叢集中另一個節點上的例項替換該例項。這提供了一種自愈機制,以應對機器故障或維護。
在沒有編排工具的時代,通常使用安裝指令碼來啟動應用程式,但它們無法從機器故障中恢復。透過建立應用程式例項並使其在不同節點上持續執行,Kubernetes Deployment 提供了一種根本不同的應用程式管理方法。
在 Kubernetes 上部署您的第一個應用
您可以使用 Kubernetes 命令列介面 kubectl 來建立和管理 Deployment。`kubectl` 使用 Kubernetes API 與叢集互動。在本模組中,您將學習建立 Deployment 以在 Kubernetes 叢集上執行應用程式最常用的 `kubectl` 命令。
建立 Deployment 時,您需要指定應用程式的容器映象以及要執行的副本數量。您可以稍後透過更新 Deployment 來更改這些資訊;訓練營的模組 5 和模組 6 將討論如何擴充套件和更新您的 Deployment。
對於您的第一個 Deployment,您將使用一個打包在 Docker 容器中的 hello-node 應用程式,該應用程式使用 NGINX 回顯所有請求。(如果您尚未嘗試建立 hello-node 應用程式並使用容器進行部署,您可以先按照 Hello Minikube 教程中的說明進行操作。)
您還需要安裝 kubectl。如果需要安裝,請訪問安裝工具。
現在您已經瞭解了 Deployment 是什麼,讓我們來部署我們的第一個應用程式吧!
kubectl 基礎
kubectl 命令的常見格式是:`kubectl action resource`。
這將對指定的*資源*(如 `node` 或 `deployment`)執行指定的*操作*(如 `create`、`describe` 或 `delete`)。您可以在子命令後使用 `--help` 獲取有關可能引數的更多資訊(例如:`kubectl get nodes --help`)。
透過執行 `kubectl version` 命令,檢查 kubectl 是否配置為與您的叢集通訊。
檢查 kubectl 是否已安裝,並且您可以看到客戶端和伺服器版本。
要檢視叢集中的節點,請執行 `kubectl get nodes` 命令。
您將看到可用的節點。稍後,Kubernetes 將根據節點的可用資源選擇部署應用程式的位置。
部署應用程式
讓我們使用 `kubectl create deployment` 命令在 Kubernetes 上部署我們的第一個應用程式。我們需要提供部署名稱和應用程式映象位置(對於託管在 Docker Hub 之外的映象,請包含完整的倉庫 URL)。
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
太棒了!您剛剛透過建立 Deployment 部署了您的第一個應用程式。這為您做了幾件事:
- 搜尋適合執行應用程式例項的節點(我們只有 1 個可用節點)
- 排程應用程式在該節點上執行
- 配置叢集在需要時重新排程例項到新節點
要列出您的 Deployment,請使用 `kubectl get deployments` 命令。
kubectl get deployments
我們看到有 1 個 Deployment 正在執行您的應用程式的單個例項。該例項正在您的節點上的容器中執行。
檢視應用
在 Kubernetes 中執行的 Pod 執行在一個私有、隔離的網路中。預設情況下,它們在同一個 Kubernetes 叢集中的其他 Pod 和服務中是可見的,但在該網路之外則不可見。當我們使用 `kubectl` 時,我們透過 API 端點與我們的應用程式進行互動。
我們將在稍後的模組 4 中介紹如何將應用程式暴露到 Kubernetes 叢集之外的其他選項。此外,作為基本教程,我們在此不詳細解釋 `Pod` 是什麼,這將在後續主題中介紹。
`kubectl proxy` 命令可以建立一個代理,將通訊轉發到叢集範圍的私有網路。代理可以透過按 Control-C 終止,並且在執行時不會顯示任何輸出。
您需要開啟第二個終端視窗來執行代理。
kubectl proxy
我們現在在我們的主機(終端)和 Kubernetes 叢集之間建立了連線。代理允許從這些終端直接訪問 API。
您可以透過代理端點檢視所有這些 API。例如,我們可以使用 `curl` 命令直接透過 API 查詢版本。
curl https://:8001/version
注意
如果埠 8001 無法訪問,請確保您在第二個終端中啟動的 `kubectl proxy` 正在執行。API 伺服器將根據 Pod 名稱為每個 Pod 自動建立一個端點,該端點也可透過代理訪問。
首先我們需要獲取 Pod 名稱,並將其儲存在環境變數 `POD_NAME` 中。
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
您可以透過執行以下命令,透過代理 API 訪問 Pod:
curl https://:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/
為了使新的 Deployment 無需使用代理即可訪問,需要一個 Service,這將在模組 4 中解釋。
下一步
- 教程:檢視 Pod 和節點。
- 瞭解更多關於 Deployments 的資訊。