通过配置文件设置 Kubelet 参数

开始之前

本页面中的某些步骤使用了 jq 工具。如果你没有安装 jq,可以通过操作系统的软件源安装,或从 https://jqlang.github.io/jq/ 获取。

某些步骤还涉及安装 curlcurl 也可以通过操作系统的软件源安装。

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 配置文件的 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 目录中的文件。例如,首先处理 00-kubelet.conf,然后由名为 01-kubelet.conf 的文件覆盖。

这些文件可以包含部分配置,但不应是无效的,并且必须包含类型元数据,特别是 apiVersionkind。仅对 kubelet 内部存储的最终配置结构进行验证。这提供了从不同源管理和合并 kubelet 配置的灵活性,同时防止了不需要的配置。但是,请注意,行为会因配置字段的数据类型而异。

Kubelet 配置结构中不同的数据类型合并方式不同。有关详细信息,请参阅参考文档

Kubelet 配置合并顺序

启动时,kubelet 会合并以下来源的配置:

  • 通过命令行指定的 Feature Gate(优先级最低)。
  • kubelet 配置。
  • Drop-in 配置文件,根据排序顺序。
  • 不包括 Feature Gate 的命令行参数(优先级最高)。

查看 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"
      }
    }
    

接下来

  • 通过查看 KubeletConfiguration 参考文档了解更多关于 kubelet 配置的信息。
  • 参考文档中了解更多关于 kubelet 配置合并的信息。
最后修改时间:2025 年 2 月 14 日太平洋标准时间下午 6:16:更新 Kubelet 配置 (ad1e23c324)