通过配置文件设置 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 的唯一参数的默认值,其他参数的默认值将不会被继承并设置为零。 为了提供自定义值,您应该分别提供所有阈值。 或者,如果您更改了任何参数,可以将 MergeDefaultEvictionSettings 设置为 true,以便其他参数将继承其默认值而不是 0。imagefs 是一个可选的文件系统,容器运行时使用它来存储容器镜像和容器可写层。
启动通过配置文件配置的 Kubelet 进程
说明
如果您使用 kubeadm 初始化集群,请在创建集群时使用 kubelet-config 与kubeadm init 一起使用。 有关详细信息,请参阅 使用 kubeadm 配置 kubelet。使用 --config 标志启动 Kubelet,该标志设置为 Kubelet 配置文件的路径。 然后,Kubelet 将从此文件加载其配置。
请注意,针对与配置文件中相同值定位的命令行标志将覆盖该值。 这有助于确保与命令行 API 的向后兼容性。
请注意,Kubelet 配置文件中的相对文件路径相对于 Kubelet 配置文件的位置解析,而命令行标志中的相对路径相对于 Kubelet 的当前工作目录解析。
请注意,命令行标志和 Kubelet 配置文件之间的一些默认值不同。 如果提供了 --config 并且未通过命令行指定值,则 KubeletConfiguration 版本的默认值适用。 在上面的示例中,此版本是 kubelet.config.k8s.io/v1beta1。
Kubelet 配置文件目录
您可以为 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.confKubelet 按照字母数字顺序处理其配置目录中的文件,对整个文件名进行排序。 例如,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 配置合并的更多信息。