透過配置檔案設定 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 配置了以下設定:

  1. address:kubelet 將在 IP 地址 192.168.0.8 上提供服務。

  2. port:kubelet 將在埠 20250 上提供服務。

  3. serializeImagePulls:映象拉取將並行進行。

  4. evictionHard:kubelet 將在以下任一條件下驅逐 Pod:

    • 當節點的可用記憶體低於 100MiB 時。
    • 當節點主檔案系統的可用空間小於 10% 時。
    • 當映象檔案系統的可用空間小於 15% 時。
    • 當節點主檔案系統的 95% 以上的 inode 被佔用時。

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 透過按字母數字順序對整個檔名進行排序來處理其配置附加目錄中的檔案。例如,00-kubelet.conf 首先處理,然後被名為 01-kubelet.conf 的檔案覆蓋。

這些檔案可能包含部分配置,但不應無效,並且必須包含型別元資料,特別是 apiVersionkind。僅對儲存在 kubelet 內部的最終配置結構進行驗證。這為從不同來源管理和合並 kubelet 配置提供了靈活性,同時防止了不良配置。然而,需要注意的是,行為因配置欄位的資料型別而異。

kubelet 配置結構中的不同資料型別以不同的方式合併。有關更多資訊,請參閱參考文件

Kubelet 配置合併順序

在啟動時,kubelet 會從以下位置合併配置:

  • 透過命令列指定的功能門(優先順序最低)。
  • kubelet 配置。
  • 根據排序順序的附加配置檔案。
  • 不包括功能門的命令列引數(優先順序最高)。

檢視 kubelet 配置

由於此功能允許配置分散在多個檔案中,如果有人想要檢查最終的實際配置,他們可以按照以下步驟檢查 kubelet 配置:

  1. 在終端中使用 kubectl proxy 啟動代理伺服器。

    kubectl proxy
    

    這將給出如下輸出:

    Starting to serve on 127.0.0.1:8001
    
  2. 開啟另一個終端視窗,並使用 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"
      }
    }
    

下一步

最後修改於 2025 年 2 月 14 日太平洋標準時間下午 6:16:更新 Kubelet 配置 (ad1e23c324)