在此任務中,我們將探索如何透過直接將 pod 指派到叢集中的特定節點來繞過 Kubernetes 調度程式。對於需要 pod 在特定節點上運行而無需執行通常的調度過程的特定場景,這可能是一種有用的方法。
我們假設您有一個正在運行的 Kubernetes 集群,該集群是使用類似於先前文章中描述的 KIND(Docker 中的 Kubernetes)配置創建的。在這裡,我們建立了一個名為 kind-cka-cluster 的叢集:
kind create cluster --name kind-cka-cluster --config config.yml
由於我們已經在先前的文章中介紹了使用 KIND 進行叢集創建,因此我們不會再次討論這些細節。
要查看此新叢集中可用的節點,請執行:
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。
現在,讓我們建立一個 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
在此清單中:
這種方法是一種直接選擇節點的方法,重寫了其他方法,例如nodeSelector或親和性規則。
根據 Kubernetes 文件:
更多詳細信息,請參閱 Kubernetes 節點分配文件。「nodeName是比affinity或nodeSelector更直接的節點選擇形式。nodeName是Pod規格中的一個欄位。如果nodeName欄位不為空,則排程器會忽略該Pod,而命名節點上的kubelet會嘗試放置該節點上的Pod 會否決使用nodeSelector 或親和性和反親和性規則。
第 3 步:應用 Pod 清單
kubectl apply -f node.yml
第 4 步:驗證 Pod 放置位置
kubectl get pods -o wide
kind create cluster --name kind-cka-cluster --config config.yml
這驗證了透過設定nodeName字段,我們成功繞過了Kubernetes調度程式並直接將我們的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.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
出現「Killing」、「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 叢集保持組織有序且有效率。
在本節中,我們將基於 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
以上是CKA 全日課程 Kubernetes 中的靜態 Pod、手動排程、標籤和選擇器的詳細內容。更多資訊請關注PHP中文網其他相關文章!