首頁 >web前端 >js教程 >CKA 全日課程 Kubernetes 中的靜態 Pod、手動排程、標籤和選擇器

CKA 全日課程 Kubernetes 中的靜態 Pod、手動排程、標籤和選擇器

Linda Hamilton
Linda Hamilton原創
2024-11-04 13:33:02928瀏覽

CKA Full Course Day Static Pods, Manual Scheduling, Labels, and Selectors in Kubernetes

任務:在沒有調度程式的情況下手動調度 Pod

在此任務中,我們將探索如何透過直接將 pod 指派到叢集中的特定節點來繞過 Kubernetes 調度程式。對於需要 pod 在特定節點上運行而無需執行通常的調度過程的特定場景,這可能是一種有用的方法。

先決條件

我們假設您有一個正在運行的 Kubernetes 集群,該集群是使用類似於先前文章中描述的 KIND(Docker 中的 Kubernetes)配置創建的。在這裡,我們建立了一個名為 kind-cka-cluster 的叢集:

kind create cluster --name kind-cka-cluster --config config.yml

由於我們已經在先前的文章中介紹了使用 KIND 進行叢集創建,因此我們不會再次討論這些細節。

步驟 1:驗證叢集節點

要查看此新叢集中可用的節點,請執行:

kubectl get nodes

您應該會看到與此類似的輸出:

NAME                           STATUS   ROLES           AGE   VERSION
kind-cka-cluster-control-plane Ready    control-plane   7m   v1.31.0

對於此任務,我們將在 kind-cka-cluster-control-plane 上調度我們的 pod。

步驟 2:定義 Pod 清單 (node.yml)

現在,讓我們建立一個 YAML 格式的 pod 清單。使用 pod 配置中的 nodeName 字段,我們可以為 pod 指定確切的節點,完全繞過 Kubernetes 調度程式。

node.yml:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kind-cka-cluster-control-plane

在此清單中:

  • 我們將 nodeName 設為 kind-cka-cluster-control-plane,這意味著調度程序將跳過分配節點,而該特定節點上的 Kubelet 將處理放置。

這種方法是一種直接選擇節點的方法,重寫了其他方法,例如nodeSelector或親和性規則。

根據 Kubernetes 文件:

「nodeName是比affinity或nodeSelector更直接的節點選擇形式。nodeName是Pod規格中的一個欄位。如果nodeName欄位不為空,則排程器會忽略該Pod,而命名節點上的kubelet會嘗試放置該節點上的Pod 會否決使用nodeSelector 或親和性和反親和性規則。

更多詳細信息,請參閱 Kubernetes 節點分配文件。

第 3 步:應用 Pod 清單

準備好清單後,將其套用到叢集:


kubectl apply -f node.yml
此指令建立 nginx pod 並直接指派給 kind-cka-cluster-control-plane 節點。

第 4 步:驗證 Pod 放置位置

最後,檢查 pod 是否在指定節點上運作:


kubectl get pods -o wide
輸出應確認 nginx pod 確實在 kind-cka-cluster-control-plane 上運作:


kind create cluster --name kind-cka-cluster --config config.yml

這驗證了透過設定nodeName字段,我們成功繞過了Kubernetes調度程式並直接將我們的pod調度到控制平面節點上。


任務:登入控制平面節點,進入預設靜態 Pod 清單目錄,嘗試重新啟動控制平面元件。

要存取我們新建立的叢集的控制平面節點,請使用以下命令:

kubectl get nodes

導覽至包含靜態 pod 清單的目錄:

NAME                           STATUS   ROLES           AGE   VERSION
kind-cka-cluster-control-plane Ready    control-plane   7m   v1.31.0

驗證目前清單:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kind-cka-cluster-control-plane

要重新啟動 kube-controller-manager,請暫時移動其清單檔案:

kubectl apply -f node.yml

確認重啟後,將manifest檔恢復到原來的位置:

kubectl get pods -o wide

透過這些步驟,我們成功示範如何存取控制平面並操作靜態 pod 清單來管理控制平面組件的生命週期。


確認 kube-controller-manager 重啟

將 kube-controller-manager.yaml 清單檔案暫時移至 /tmp 後,我們可以驗證 kube-controller-manager 是否已重新啟動。正如之前的文章中提到的,我使用的是 k9s,它確實清楚地顯示了重啟,但是對於沒有 k9s 的讀者,請嘗試以下命令

檢查事件
要收集更多信息,請使用:

NAME    READY   STATUS    RESTARTS   AGE   IP           NODE                             NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          28s   10.244.0.5   kind-cka-cluster-control-plane   <none>           <none>

在輸出末尾尋找事件。成功重啟將顯示類似以下內容的事件:

docker exec -it kind-cka-cluster-control-plane bash

出現「Kill​​ing」、「Created」和「Started」事件表明 kube-controller-manager 已停止並重新啟動成功。


清理

完成任務並確認 pod 的行為後,清理不再需要的所有資源非常重要。這有助於維護整潔的環境並釋放叢集中的資源。

列出 Pod:
首先,您可以檢查叢集中目前運行的 Pod:

cd /etc/kubernetes/manifests

您可能會看到以下輸出:

ls

描述 Pod:
要獲取有關特定 pod 的更多信息,請使用描述命令:

mv kube-controller-manager.yaml /tmp

這將為您提供有關 pod 的詳細信息,例如其名稱、命名空間、節點和其他配置:

mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/

刪除 Pod:
如果您發現不再需要該 pod,可以使用以下命令安全地將其刪除:

   kubectl describe pod kube-controller-manager-kind-cka-cluster-control-plane -n kube-system

驗證刪除:
執行刪除指令後,您可以再次列出 pod 來驗證 pod 是否已被刪除:

   Events:
     Type    Reason   Age                    From     Message
     ----    ------   ----                   ----     -------
     Normal  Killing  4m12s (x2 over 8m32s)  kubelet  Stopping container kube-controller-manager
     Normal  Pulled   3m6s (x2 over 7m36s)   kubelet  Container image "registry.k8s.io/kube-controller-manager:v1.31.0" already present on machine
     Normal  Created  3m6s (x2 over 7m36s)   kubelet  Created container kube-controller-manager
     Normal  Started  3m6s (x2 over 7m36s)   kubelet  Started container kube-controller-manager

確保 nginx pod 不再出現在清單中。

透過執行這些清理步驟,您可以協助確保 Kubernetes 叢集保持組織有序且有效率。


建立具有特定標籤的多個 Pod

在本節中,我們將基於 nginx 鏡像建立三個 pod,每個 pod 都有唯一的名稱和指示不同環境的特定標籤:env:test、env:dev 和 env:prod。

第 1 步:建立腳本

首先,我們將建立一個腳本,其中包含產生 pod 的命令。使用以下命令建立腳本檔案:

kind create cluster --name kind-cka-cluster --config config.yml

接下來,將以下程式碼貼到檔案中:

kubectl get nodes

第 2 步:使腳本可執行

儲存檔案後,使用以下指令使腳本可執行:

NAME                           STATUS   ROLES           AGE   VERSION
kind-cka-cluster-control-plane Ready    control-plane   7m   v1.31.0

第 3 步:執行腳本

運行腳本來建立 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kind-cka-cluster-control-plane

您應該看到指示 Pod 建立的輸出:

kubectl apply -f node.yml

第 4 步:驗證建立的 Pod

然後腳本將顯示建立的 Pod 的狀態:

kubectl get pods -o wide

此時,您可以根據 pod 的標籤來過濾它們。例如,要尋找帶有 env=dev 標籤的 pod,請使用下列指令:

NAME    READY   STATUS    RESTARTS   AGE   IP           NODE                             NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          28s   10.244.0.5   kind-cka-cluster-control-plane   <none>           <none>

您應該看到確認 pod 正在運行的輸出:

docker exec -it kind-cka-cluster-control-plane bash

標籤和提及

  • @piyushsachdeva
  • 第 13 天:影片教學

以上是CKA 全日課程 Kubernetes 中的靜態 Pod、手動排程、標籤和選擇器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn