在 Kubernetes (K8S) 中,靜態 Pod(Static Pod)是一種特殊的 Pod 型別,它並不是透過 Kubernetes API Server 進行管理的,而是直接存在於節點上的。靜態 Pod 的配置檔案通常放置在節點上的特定目錄中,由 `kubelet` 直接讀取並建立和管理 Pod。
##### 1. 靜態 Pod 的特點
1. **直接管理**:靜態 Pod 的生命週期是由節點上的 `kubelet` 直接管理的,而不是透過 Kubernetes API Server。這意味著它們不會出現在叢集級別的 API 中,也不會受到 Kubernetes 控制面的影響。
2. **配置檔案存放位置**:靜態 Pod 的配置檔案通常存放在節點的 `/etc/kubernetes/manifests` 目錄中。`kubelet` 會週期性地檢查這個目錄中的配置檔案,並根據配置檔案建立或更新 Pod。
3. **獨立於叢集控制面**:靜態 Pod 的建立和管理獨立於叢集控制面(如 API Server、排程器等),因此即使叢集控制面出現故障,靜態 Pod 仍然可以執行。
4. **不支援滾動更新**:由於靜態 Pod 不受 Kubernetes 控制面管理,因此它們不支援 Kubernetes 提供的滾動更新(Rolling Update)功能。要更新靜態 Pod,你需要手動更新其配置檔案,並重啟 Pod。
5. **適用於特定場景**:靜態 Pod 通常用於執行一些特定的服務,比如在叢集啟動前就需要執行的服務,或者在沒有 Kubernetes API Server 時需要執行的服務。
##### 2. 靜態 Pod 的配置
靜態 Pod 的配置檔案格式與普通的 Pod 規格檔案相同,只是它們不透過 `kubectl apply` 或其他 API 操作來部署。配置檔案通常是一個 JSON 檔案,包含了 Pod 的所有必要資訊,如容器映象、埠對映、環境變數等。
示例配置檔案如下:
```json
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "example-static-pod"
},
"spec": {
"containers": [
{
"name": "example-container",
"image": "nginx:latest",
"ports": [
{
"containerPort": 80
}
]
}
]
}
}
3. 如何建立和管理靜態 Pod
-
建立靜態 Pod:將上述配置檔案儲存為
/etc/kubernetes/manifests/example-static-pod.json
。kubelet
會自動檢測這個檔案並建立 Pod。 -
更新靜態 Pod:如果需要更新 Pod,只需修改配置檔案,然後重新啟動
kubelet
服務或等待kubelet
自動檢測到配置檔案的變化並重新建立 Pod。 -
刪除靜態 Pod:刪除配置檔案即可刪除靜態 Pod。
4. 使用場景
靜態 Pod 主要用於以下場景:
-
本地測試:在開發過程中,有時需要快速測試某些元件,靜態 Pod 可以提供一種快速部署的方式。
-
系統關鍵元件:有些關鍵元件需要在叢集啟動之前就已經執行,例如叢集監控、日誌收集等服務。
-
節點本地服務:某些服務只需要在單個節點上執行,並不需要透過叢集 API 進行管理和排程。
儘管靜態 Pod 在某些情況下很有用,但它們也有一些限制,如缺乏自動化管理和更新機制。因此,在大多數情況下,推薦使用標準的 Kubernetes API 來管理 Pod。