透過配置檔案設定 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%"
imagefs.inodesFree: "5%"
在此示例中,kubelet 配置了以下設定:
address
:kubelet 將在 IP 地址192.168.0.8
上提供服務。port
:kubelet 將在埠20250
上提供服務。serializeImagePulls
:映象拉取將並行進行。evictionHard
:kubelet 將在以下任一條件下驅逐 Pod:- 當節點的可用記憶體低於 100MiB 時。
- 當節點主檔案系統的可用空間小於 10% 時。
- 當映象檔案系統的可用空間小於 15% 時。
- 當節點主檔案系統的 95% 以上的 inode 被佔用時。
注意
在此示例中,透過僅更改 evictionHard 的一個預設值,其他引數的預設值將不會被繼承,並將被設定為零。為了提供自定義值,你應該分別提供所有閾值。或者,你可以在 kubelet 配置檔案中將 MergeDefaultEvictionSettings 設定為 true,如果任何引數被更改,其他引數將繼承其預設值而不是 0。imagefs
是一個可選的檔案系統,容器執行時使用它來儲存容器映象和容器可寫層。
透過配置檔案啟動 kubelet 程序
使用 --config
標誌啟動 kubelet,將其設定為 kubelet 配置檔案的路徑。然後 kubelet 將從該檔案載入其配置。
請注意,與配置檔案中目標值相同的命令列標誌將覆蓋該值。這有助於確保與命令列 API 的向後相容性。
請注意,kubelet 配置檔案中的相對檔案路徑是相對於 kubelet 配置檔案所在的位置解析的,而命令列標誌中的相對路徑是相對於 kubelet 的當前工作目錄解析的。
請注意,命令列標誌和 kubelet 配置檔案之間的一些預設值有所不同。如果提供了 --config
並且未透過命令列指定值,則應用 KubeletConfiguration
版本的預設值。在上述示例中,此版本為 kubelet.config.k8s.io/v1beta1
。
kubelet 配置檔案的附加目錄
Kubernetes v1.30 [beta]
你可以為 kubelet 指定一個附加配置目錄。預設情況下,kubelet 不會在任何地方查詢附加配置檔案——你必須指定一個路徑。例如:--config-dir=/etc/kubernetes/kubelet.conf.d
對於 Kubernetes v1.28 到 v1.29,只有在為 kubelet 程序設定了環境變數 KUBELET_CONFIG_DROPIN_DIR_ALPHA
(該變數的值無關緊要)時,才能指定 --config-dir
。
注意
有效的 kubelet 附加配置檔案的字尾必須是.conf
。例如:99-kubelet-address.conf
kubelet 透過按字母數字順序對整個檔名進行排序來處理其配置附加目錄中的檔案。例如,00-kubelet.conf
首先處理,然後被名為 01-kubelet.conf
的檔案覆蓋。
這些檔案可能包含部分配置,但不應無效,並且必須包含型別元資料,特別是 apiVersion
和 kind
。僅對儲存在 kubelet 內部的最終配置結構進行驗證。這為從不同來源管理和合並 kubelet 配置提供了靈活性,同時防止了不良配置。然而,需要注意的是,行為因配置欄位的資料型別而異。
kubelet 配置結構中的不同資料型別以不同的方式合併。有關更多資訊,請參閱參考文件。
Kubelet 配置合併順序
在啟動時,kubelet 會從以下位置合併配置:
- 透過命令列指定的功能門(優先順序最低)。
- kubelet 配置。
- 根據排序順序的附加配置檔案。
- 不包括功能門的命令列引數(優先順序最高)。
注意
kubelet 的配置附加目錄機制與kubeadm
工具允許你修補配置的方式類似但不同。kubeadm
工具為其配置使用特定的修補策略,而 kubelet 配置附加檔案的唯一修補策略是 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%", "imagefs.inodesFree": "5%" }, "evictionPressureTransitionPeriod": "1m0s", "mergeDefaultEvictionSettings": false, "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 配置合併的資訊。