適用於初學者的基本 kubectl 和 Helm 命令

2020-03-18 11:31:00

去雜貨店“採購”這些命令,你需要用這些 Kubernetes 工具來入門。

最近,我丈夫告訴我他即將要去參加一個工作面試,面試時他需要在計算機上執行一些基本命令。他對這場面試感到焦慮,但是對於他來說,學習和記住事情的最好方法是將不了解的事物比喻為非常熟悉的事物。因為我們的談話是在我逛雜貨店試圖決定當晚要烹飪的食物之後進行的,所以這啟發我用一次去雜貨店的行程來介紹 kubectlhelm 命令。

Helm(“舵輪”)是在 Kubernetes(來自希臘語,意思是“舵手” 或 “領航員”)中管理應用程式的工具。你可以輕鬆地使用你的應用程式資訊來部署“海圖chart”,從而可以在你的 Kubernetes 環境中幾分鐘之內讓它們就緒並預設定好。在學習新知識時,檢視範例的“海圖”以了解其用法總是很有幫助的,因此,如果有時間,請檢視這些成型的“海圖”。(LCTT 譯註:Kubernetes 生態中大量使用了和航海有關的比喻,因此本文在翻譯時也採用了這些比喻)

kubectl 是與 Kubernetes 環境互動的命令列介面,允許你設定和管理叢集。它需要一些設定才能在環境中工作,因此請仔細閱讀其文件以了解你需要做什麼。

我會在範例中使用名稱空間,你可以在我的文章《》中了解它。

現在我們已經準備好了,讓我們開始 kubectlhelm 基本命令的購物之旅!

用 Helm 列出清單

你去商店之前要做的第一件事是什麼?好吧,如果你做事有條理,會建立一個“清單”。同樣,這是我將解釋的第一個基本的 Helm 命令。

在一個用 Helm 部署的應用程式中,list 命令提供有關應用程式當前版本的詳細資訊。在此範例中,我有一個已部署的應用程式:Jenkins CI/CD 應用程式。執行基本的 list 命令總是會顯示預設的名稱空間。由於我沒有在預設的名稱空間中部署任何內容,因此不會顯示任何內容:

$helm listNAME    NAMESPACE    REVISION    UPDATED    STATUS    CHART    APP VERSION

但是,如果執行帶有額外標誌的命令,則會顯示我的應用程式和資訊:

$helm list --all-namespacesNAME     NAMESPACE  REVISION  UPDATED                   STATUS      CHART           APP  VERSIONjenkins  jenkins        1         2020-01-18 16:18:07 EST   deployed    jenkins-1.9.4   lts

最後,我可以指示 list 命令只檢查我想從中獲取資訊的名稱空間:

$helm list --namespace jenkinsNAME     NAMESPACE  REVISION  UPDATED                   STATUS    CHART          APP VERSIONjenkins    jenkins      1              2020-01-18 16:18:07 EST  deployed  jenkins-1.9.4  lts    

現在我有了一個清單,並且知道該清單上有什麼,我可以使用 get 命令來“獲取”我的物品!我會從 Kubernetes 叢集開始,看看我能從中獲取到什麼?

用 Kubectl 獲取物品

kubectl get 命令提供了有關 Kubernetes 中許多事物的資訊,包括“吊艙Pod”、節點和名稱空間。同樣,如果沒有指定名稱空間標誌,就會使用預設的名稱空間。首先,我獲取叢集中的名稱空間以檢視正在執行的名稱空間:

$kubectl get namespacesNAME             STATUS   AGEdefault          Active   53mjenkins          Active   44mkube-node-lease  Active   53mkube-public      Active   53mkube-system      Active   53m

現在我已經知道了在我的環境中執行的有哪些名稱空間了,接下來獲取節點並檢視有多少個節點正在執行:

$kubectl get nodesNAME       STATUS   ROLES       AGE   VERSIONminikube   Ready    master  55m   v1.16.2

我有一個節點正在執行,這主要是因為我的 Minikube 執行在一台小型伺服器上。要得到在我的這一個節點上執行的“吊艙”可以這樣:

$kubectl get podsNo resources found in default namespace.

啊哦,它是空的。我將通過以下方式獲取 Jenkins 名稱空間中的內容:

$kubectl get pods --namespace jenkinsNAME                      READY  STATUS   RESTARTS  AGEjenkins-7fc688c874-mh7gv  1/1    Running  0         40m

好訊息!這裡發現了一個“吊艙”,它還沒有重新啟動過,已執行了 40 分鐘了。好的,如今我知道“吊艙”已經裝好,所以我想看看用 Helm 命令可以得到什麼。

用 Helm 獲取資訊

helm get 命令稍微複雜一點,因為這個“獲取”命令所需要的不僅僅是一個應用程式名稱,而且你可以從應用程式中請求多個內容。我會從獲取用於製作該應用程式的值開始,然後展示“獲取全部”的操作結果的片段,該操作將提供與該應用程式相關的所有資料。

$helm get values jenkins -n jenkinsUSER-SUPPLIED VALUES:null

由於我只安裝了最小限度的穩定版,因此設定沒有更改。如果我執行“獲取全部”命令,我將得到所有的“海圖”:

$helm get all jenkins -n jenkins

output from helm get all command

這會產生大量資料,因此我始終建議保留一份 Helm “海圖”的副本,以便你可以檢視“海圖”中的模板。我還建立自己的值來了解自己所擁有的。

現在,我把所有的商品都放在購物車中了,我會檢查一下“描述”它們包含什麼的標籤。這些範例僅與 kubectl 命令有關,它們描述了我通過 Helm 部署的內容。

用 kubectl 檢視描述

正如我使用“獲取”命令(該命令可以描述 Kubernetes 中的幾乎所有內容)所做的那樣,我將範例限定到名稱空間、“吊艙”和節點上。由於我知道它們每一個是什麼,因此這很容易。

$kubectl describe ns jenkinsName:           jenkinsLabels:         <none>Annotations:  <none>Status:         ActiveNo resource quota.No resource limits.

我可以看到我的名稱空間的名稱,並且它是活動的,沒有資源或限額限制。

describe pods 命令會產生大量資訊,因此我這裡提供的是一小段輸出。如果你在不使用“吊艙”名稱的情況下執行該命令,它將返回名稱空間中所有“吊艙”的資訊,這可能會很麻煩。因此,請確保在此命令中始終包含“吊艙”名稱。例如:

$kubectl describe pods jenkins-7fc688c874-mh7gv --namespace jenkins

output of kubectl-describe-pods

這會提供容器的狀態、管理方式、標籤以及“吊艙”中所使用的映象(還有很多其它資訊)。沒有在這個簡化過的輸出中包括的資料有:在 Helm 設定值檔案中應用的各種條件下的資源請求和限制、初始化容器和儲存卷資訊。如果你的應用程式由於資源不足而崩潰,或者是一個需要執行前置指令碼進行設定的初始設定容器,或者生成不應該儲存於純文字 YAML 檔案中的隱藏密碼,則此資料很有用。

最後,我將使用 describe node 命令,當然,它是用來描述節點的。由於本範例只有一個名為 Minikube 的範例,因此我將使用這個名字。如果你的環境中有多個節點,則必須包含你想查詢的的節點名稱。

與“吊艙”一樣,這個節點的命令會產生大量資料,因此我將僅包括輸出片段。

$kubectl describe node minikube

output of kubectl describe node

注意,describe node 是更重要的基本命令之一。如此圖所示,該命令返回統計資訊,該資訊指示節點何時資源用盡,並且該資料非常適合在需要擴充套件時(如果你的環境中沒有自動擴充套件)向你發出警報。此輸出片段中未包含的其它內容包括:對所有資源和限制的請求所佔的百分比,以及資源的使用期限和分配(例如,對於我的應用程式而言)。

買單

使用這些命令,我完成了“購物”並得到了我想要的一切。希望這些基本命令也能在你使用 Kubernetes 的日常工作中提供幫助。

我鼓勵你經常使用命令列並學習“幫助”部分中的速記標誌,你可以通過執行以下命令來檢視這些標誌:

$helm --help

$kubectl -h

花生醬和果凍

有些東西像花生醬和果凍一樣混在一起。Helm 和 kubectl 就有點像那樣交錯在一起。

我經常在自己的環境中使用這些工具。因為它們在很多地方都有很多相似之處,所以在使用其中一個之後,我通常需要跟進另一個。例如,我可以進行 Helm 部署,並使用 kubectl 觀察它是否失敗。一起試試它們,看看它們能為你做什麼。