透過組態檔設定 Kubelet 參數
開始之前
此頁面中的某些步驟使用 jq
工具。如果您沒有 jq
,可以透過作業系統的軟體來源安裝,或從 https://jqlang.github.io/jq/ 取得。
某些步驟也涉及安裝 curl
,可以透過作業系統的軟體來源安裝。
kubelet 組態參數的子集可以透過磁碟上的組態檔設定,以替代命令列標誌。
建議透過組態檔提供參數,因為它可以簡化節點部署和組態管理。
建立組態檔
可以透過檔案設定的 kubelet 組態子集由 KubeletConfiguration
結構定義。
組態檔必須是此結構中參數的 JSON 或 YAML 表示形式。請確保 kubelet 對該檔案具有讀取權限。
以下是此檔案可能的外觀範例
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: "192.168.0.8"
port: 20250
serializeImagePulls: false
evictionHard:
memory.available: "100Mi"
nodefs.available: "10%"
nodefs.inodesFree: "5%"
imagefs.available: "15%"
在此範例中,kubelet 設定了以下設定
address
:kubelet 將在 IP 位址192.168.0.8
上提供服務。port
:kubelet 將在埠號20250
上提供服務。serializeImagePulls
:映像檔提取將並行完成。evictionHard
:kubelet 將在以下條件之一成立時驅逐 Pod- 當節點的可用記憶體降至 100MiB 以下時。
- 當節點主檔案系統的可用空間少於 10% 時。
- 當映像檔檔案系統的可用空間少於 15% 時。
- 當節點主檔案系統超過 95% 的 inode 正在使用中時。
注意
在範例中,透過僅變更 evictionHard 的一個參數的預設值,其他參數的預設值將不會被繼承,並且將設定為零。為了提供自訂值,您應該分別提供所有閾值。imagefs
是一個可選的檔案系統,容器執行階段使用它來儲存容器映像檔和容器可寫入層。
啟動透過組態檔設定的 kubelet 程序
啟動 kubelet 時,將 --config
標誌設定為 kubelet 組態檔的路徑。然後 kubelet 將從此檔案載入其組態。
請注意,目標值與組態檔相同的命令列標誌將覆寫該值。這有助於確保與命令列 API 的回溯相容性。
請注意,kubelet 組態檔中的相對檔案路徑是相對於 kubelet 組態檔的位置解析的,而命令列標誌中的相對路徑是相對於 kubelet 目前工作目錄解析的。
請注意,命令列標誌和 kubelet 組態檔之間,某些預設值有所不同。如果提供了 --config
且未透過命令列指定值,則適用 KubeletConfiguration
版本的預設值。在上述範例中,此版本為 kubelet.config.k8s.io/v1beta1
。
kubelet 組態檔的 Drop-in 目錄
Kubernetes v1.30 [beta]
您可以為 kubelet 指定一個 Drop-in 組態目錄。預設情況下,kubelet 不會在任何地方尋找 Drop-in 組態檔 - 您必須指定路徑。例如:--config-dir=/etc/kubernetes/kubelet.conf.d
對於 Kubernetes v1.28 到 v1.29,如果您還為 kubelet 程序設定環境變數 KUBELET_CONFIG_DROPIN_DIR_ALPHA
,則只能指定 --config-dir
(該變數的值無關緊要)。
注意
有效 kubelet Drop-in 組態檔的尾碼必須是.conf
。例如:99-kubelet-address.conf
kubelet 透過依字母數字順序排序整個檔案名稱來處理其組態 Drop-in 目錄中的檔案。例如,首先處理 00-kubelet.conf
,然後使用名為 01-kubelet.conf
的檔案覆寫。
這些檔案可能包含部分組態,但不應無效,並且必須包含類型中繼資料,特別是 apiVersion
和 kind
。驗證僅在最終產生的組態結構(在 kubelet 內部儲存)上執行。這提供了從不同來源管理和合併 kubelet 組態的彈性,同時防止不必要的組態。但是,重要的是要注意行為會根據組態欄位的資料類型而有所不同。
kubelet 組態結構中的不同資料類型以不同的方式合併。請參閱參考文件以取得更多資訊。
Kubelet 組態合併順序
在啟動時,kubelet 從以下位置合併組態
- 透過命令列指定的功能閘道(最低優先順序)。
- kubelet 組態。
- Drop-in 組態檔,依排序順序。
- 排除功能閘道的命令列引數(最高優先順序)。
注意
kubelet 的 config drop-in 目錄機制與kubeadm
工具允許你修補組態的方式相似但有所不同。kubeadm
工具針對其組態使用特定的修補策略,而 kubelet 組態 drop-in 檔案的唯一修補策略是 replace
。kubelet 根據字母數字順序排序後綴來確定合併順序,並替換優先順序較高的檔案中存在的每個欄位。檢視 kubelet 組態
由於組態現在可以透過此功能分散在多個檔案中,如果有人想要檢查最終執行的組態,他們可以按照以下步驟檢查 kubelet 組態
在你的終端機中使用
kubectl proxy
啟動代理伺服器。kubectl proxy
這會產生類似以下的輸出
Starting to serve on 127.0.0.1:8001
開啟另一個終端機視窗並使用
curl
來獲取 kubelet 組態。將<node-name>
替換為你節點的實際名稱curl -X GET http://127.0.0.1:8001/api/v1/nodes/<node-name>/proxy/configz | jq .
{ "kubeletconfig": { "enableServer": true, "staticPodPath": "/var/run/kubernetes/static-pods", "syncFrequency": "1m0s", "fileCheckFrequency": "20s", "httpCheckFrequency": "20s", "address": "192.168.1.16", "port": 10250, "readOnlyPort": 10255, "tlsCertFile": "/var/lib/kubelet/pki/kubelet.crt", "tlsPrivateKeyFile": "/var/lib/kubelet/pki/kubelet.key", "rotateCertificates": true, "authentication": { "x509": { "clientCAFile": "/var/run/kubernetes/client-ca.crt" }, "webhook": { "enabled": true, "cacheTTL": "2m0s" }, "anonymous": { "enabled": true } }, "authorization": { "mode": "AlwaysAllow", "webhook": { "cacheAuthorizedTTL": "5m0s", "cacheUnauthorizedTTL": "30s" } }, "registryPullQPS": 5, "registryBurst": 10, "eventRecordQPS": 50, "eventBurst": 100, "enableDebuggingHandlers": true, "healthzPort": 10248, "healthzBindAddress": "127.0.0.1", "oomScoreAdj": -999, "clusterDomain": "cluster.local", "clusterDNS": [ "10.0.0.10" ], "streamingConnectionIdleTimeout": "4h0m0s", "nodeStatusUpdateFrequency": "10s", "nodeStatusReportFrequency": "5m0s", "nodeLeaseDurationSeconds": 40, "imageMinimumGCAge": "2m0s", "imageMaximumGCAge": "0s", "imageGCHighThresholdPercent": 85, "imageGCLowThresholdPercent": 80, "volumeStatsAggPeriod": "1m0s", "cgroupsPerQOS": true, "cgroupDriver": "systemd", "cpuManagerPolicy": "none", "cpuManagerReconcilePeriod": "10s", "memoryManagerPolicy": "None", "topologyManagerPolicy": "none", "topologyManagerScope": "container", "runtimeRequestTimeout": "2m0s", "hairpinMode": "promiscuous-bridge", "maxPods": 110, "podPidsLimit": -1, "resolvConf": "/run/systemd/resolve/resolv.conf", "cpuCFSQuota": true, "cpuCFSQuotaPeriod": "100ms", "nodeStatusMaxImages": 50, "maxOpenFiles": 1000000, "contentType": "application/vnd.kubernetes.protobuf", "kubeAPIQPS": 50, "kubeAPIBurst": 100, "serializeImagePulls": true, "evictionHard": { "imagefs.available": "15%", "memory.available": "100Mi", "nodefs.available": "10%", "nodefs.inodesFree": "5%" }, "evictionPressureTransitionPeriod": "1m0s", "enableControllerAttachDetach": true, "makeIPTablesUtilChains": true, "iptablesMasqueradeBit": 14, "iptablesDropBit": 15, "featureGates": { "AllAlpha": false }, "failSwapOn": false, "memorySwap": {}, "containerLogMaxSize": "10Mi", "containerLogMaxFiles": 5, "configMapAndSecretChangeDetectionStrategy": "Watch", "enforceNodeAllocatable": [ "pods" ], "volumePluginDir": "/usr/libexec/kubernetes/kubelet-plugins/volume/exec/", "logging": { "format": "text", "flushFrequency": "5s", "verbosity": 3, "options": { "json": { "infoBufferSize": "0" } } }, "enableSystemLogHandler": true, "enableSystemLogQuery": false, "shutdownGracePeriod": "0s", "shutdownGracePeriodCriticalPods": "0s", "enableProfilingHandler": true, "enableDebugFlagsHandler": true, "seccompDefault": false, "memoryThrottlingFactor": 0.9, "registerNode": true, "localStorageCapacityIsolation": true, "containerRuntimeEndpoint": "unix:///var/run/crio/crio.sock" } }
下一步是什麼
- 透過查看
KubeletConfiguration
參考資料,進一步了解 kubelet 組態。 - 在參考文件中,進一步了解 kubelet 組態合併。