You need to enable JavaScript to run this app.
导航
自定义集群 Kubelet 参数
最近更新时间:2024.08.19 11:06:34首次发布时间:2024.04.18 11:08:16

kubelet 提供了一系列的参数配置,用于定义和调整节点行为。本文介绍配置 kubelet 参数的方法。

背景信息

什么是 kubelet

Kubernetes 集群中的 kubelet 是一个在集群中每个节点上运行的关键组件,它将节点的详细信息报告给控制平面,并根据控制平面的指令管理容器的生命周期和节点资源。主要包括:

  • 容器生命周期管理:kubelet 负责根据从 API Server 接收到的 PodSpec(Pod 的描述信息)来启动、停止和维护容器的运行状态。确保容器按照用户定义的规格运行。
  • 健康检查:kubelet 定期对容器进行健康检查,以确保应用程序正常运行。如果检查失败,kubelet 可以重启容器,保持应用的稳定性和可用性。
  • 资源管理:kubelet 负责管理节点资源的使用,例如 CPU、内存等。它确保每个容器都能获得其需要的资源,同时避免资源的过度分配。
  • 节点状态报告:kubelet 定期向 Kubernetes 的 Master 节点报告自己所在节点的状态,包括资源利用率、运行的容器等信息,这有助于 Kubernetes 调度器做出更好的调度决策。

kubelet 更改原则

说明

为应对大规模场景下的需求,VKE 已经对节点 kubelet 进行了功能增强和稳定性提升,建议您直接使用 kubelet 的默认参数即可。

如果您需要更改 VKE 集群中 kubelet 的默认参数,需要对 Kubernetes 集群和工作负载有深入的理解。建议在更改任何默认设置之前,充分理解每个参数的作用,并通过测试来评估更改的影响。参数的详细解释,请参见 官方文档

例如在以下场景下,您可能需要修改 kubelet 的默认值参数:

  • 资源限制:如果节点有特定的资源限制或者特别的资源需求,需要调整与资源管理相关的参数,例如通过--max-pods控制 Pod 的最大数量。
  • 自定义调度:如果需要在特定的节点上运行特定的工作负载,需要调整 kubelet 的标签或污点,例如通过--node-labels来为节点打上指定的标签。
  • 特定的性能优化:为了针对特定的工作负载进行性能优化,特别是对于具有特定硬件需求的工作负载,如使用高性能计算、人工智能、机器学习、数据科学的应用。可能需要调整一些高级参数,例如通过topology-manager-policy指定 Kubernetes 节点上的拓扑管理器(Topology Manager)的行为策略。

操作前须知

警告

  • 修改集群的 kubelet 参数,可能导致集群和业务不稳定。因此操作前,请务必阅读本小节的内容,并谨慎操作!
  • 建议使用控制台,配置节点的常见 kubelet 参数,详情请参见 配置节点池 kubelet 参数

修改节点 kubelet 参数,需要注意:

  • 可能会导致集群不稳定,可能导致的后果包括但不限于:节点 NotReady、节点上运行的容器发生重启或被驱逐等。建议修改前明确相关参数的含义,并在测试环境充分验证后,再操作。
  • 如果有多套环境(例如测试环境、预发布环境、生产环境),建议先从测试环境开始验证参数修改。验证成功后,再进入下一个环境。重复此过程,直至修改生产环境中的参数配置。

VKE 集群扩容节点时会根据节点规格和功能配置,在节点安装时初始化 kubelet 系统配置,并将系统配置保存在节点的/var/lib/kubelet/kubeadm-flags.env文件中,包括:

注意

集群节点升级时会根据此文件进行参数覆盖,请勿直接修改该文件及相关参数。

参数名称参数含义
eviction-hard硬驱逐门限。
kube-reservedKubernetes 节点预留资源配置。
max-pods单节点最大 Pod 数量。
system-reserved系统预留资源配置。
node-labels节点初始化时的标签。
topology-manager-policy拓扑管理策略。
topology-manager-scope拓扑管理策略的资源粒度。
feature-gates特性门控开关。

前提条件

  • 已创建集群,且集群和节点均处于 运行中 状态。
  • 选择合适的操作时间,建议在集群业务处于低峰期操作。

通过控制台配置

容器服务支持在控制台上,配置节点池的常见 kubelet 参数,实现节点池下新增节点和存量节点参数的修改。详情请参见 配置节点池 kubelet 参数

通过 CLI 配置

配置新增节点参数

对于控制台配置中未涉及的 kubelet 参数,支持通过修改集群 kubelet 参数配置的方法,实现新增节点使用自定义参数的目的。

在集群kube-system命名空间下,修改名为kubelet-config的 ConfigMap 中的 KubeletConfiguration 内容。修改完成后,集群中的新增节点即可使用新配置。

说明

  • 修改集群参数后,对于存量节点,即使重启也不会改变节点已有的 kubelet 参数配置。如有需求,请参见 修改存量节点参数
  • 后续若集群进行了控制面升级,且升级了 Kubernetes 次要版本,则可能存在参数不兼容的情况,因此在控制面升级完成后需要重新配置kubelet-config ConfigMap 的自定义参数,以保证集群中新增节点使用期望的自定义配置。集群升级相关信息,请参见 升级集群
apiVersion: v1
kind: ConfigMap
metadata:
  name: kubelet-config
  namespace: kube-system
data:
  kubelet: |
    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    address: 0.0.0.0
    authentication:
      anonymous:
        enabled: false
      webhook:
        cacheTTL: 2m0s
        enabled: true
      x509: {}
    authorization:
      mode: Webhook
      webhook:
        cacheAuthorizedTTL: 5m0s
        cacheUnauthorizedTTL: 30s
    cgroupDriver: cgroupfs
    cgroupsPerQOS: true
    clusterDNS:
    - 172.31.0.10
    clusterDomain: cluster.local
    configMapAndSecretChangeDetectionStrategy: Watch
    containerLogMaxFiles: 5
    containerLogMaxSize: 100Mi
    contentType: application/vnd.kubernetes.protobuf
    cpuCFSQuota: true
    cpuCFSQuotaPeriod: 100ms
    cpuManagerPolicy: none
    cpuManagerReconcilePeriod: 10s
    enableControllerAttachDetach: true
    enableDebuggingHandlers: true
    enableServer: true
    enableSystemLogHandler: true
    enforceNodeAllocatable:
    - pods
    eventBurst: 10
    eventRecordQPS: 5
    evictionHard:
      imagefs.available: 15%
      memory.available: 100Mi
      nodefs.available: 10%
      nodefs.inodesFree: 5%
    evictionPressureTransitionPeriod: 5m0s
    failSwapOn: true
    fileCheckFrequency: 20s
    hairpinMode: promiscuous-bridge
    healthzBindAddress: 127.0.0.1
    healthzPort: 10248
    httpCheckFrequency: 20s
    imageGCHighThresholdPercent: 85
    imageGCLowThresholdPercent: 80
    imageMinimumGCAge: 2m0s
    iptablesDropBit: 15
    iptablesMasqueradeBit: 14
    kubeAPIBurst: 10
    kubeAPIQPS: 5
    kubeReserved:
      cpu: 100m
      memory: 500Mi
    logging:
      format: text
    makeIPTablesUtilChains: true
    maxOpenFiles: 1000000
    maxPods: 0
    nodeLeaseDurationSeconds: 40
    nodeStatusMaxImages: 50
    nodeStatusReportFrequency: 5m0s
    nodeStatusUpdateFrequency: 10s
    oomScoreAdj: -999
    podPidsLimit: -1
    port: 10250
    registryBurst: 5
    registryPullQPS: 2
    resolvConf: /etc/resolv.conf
    rotateCertificates: true
    runtimeRequestTimeout: 2m0s
    serializeImagePulls: true
    shutdownGracePeriod: 0s
    shutdownGracePeriodCriticalPods: 0s
    staticPodPath: /etc/kubernetes/manifests
    streamingConnectionIdleTimeout: 4h0m0s
    syncFrequency: 1m0s
    systemReserved:
      cpu: 100m
      memory: 500Mi
    tlsCertFile: /etc/kubernetes/pki/kubelet-tls.crt
    tlsPrivateKeyFile: /etc/kubernetes/pki/kubelet-tls.key
    topologyManagerPolicy: none
    topologyManagerScope: container
    volumePluginDir: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
    volumeStatsAggPeriod: 1m0s

修改存量节点参数

对于控制台配置中未涉及的 kubelet 参数,如果要修改存量节点,操作步骤如下:

  1. 使用 kubectl 连接集群。详情请参见 连接集群
  2. 执行以下命令,安全清空目标节点中的工作负载,并禁止新的工作负载调度到该节点上。其中,${node-name}为节点名称。
kubectl drain ${node-name} --ignore-daemonsets
  1. 登录节点,执行以下命令,备份 kubelet 配置文件。
cp /var/lib/kubelet/config.yaml  /var/lib/kubelet/config.yaml_bak
  1. 根据需求,修改配置文件/var/lib/kubelet/config.yaml中的参数配置。例如:当需要开启 kubelet 序列化拉取镜像时,修改serializeImagePulls参数的值为true
vim  /var/lib/kubelet/config.yaml


5. 执行以下命令,重启 kubelet 服务。

systemctl daemon-reload 
systemctl restart kubelet
  1. 服务重启完成后,执行以下命令,恢复节点调度。其中,${node-name}为节点名称。
kubectl uncordon ${node-name}

结果验证

  1. 使用 kubectl 连接集群。详情请参见 连接集群
  2. 验证 kubelet 参数是否生效。
    1. 执行以下命令,确认节点名称。
    kubectl get node -owide 
    
    1. 在节点中启动代理。
    kubectl proxy
    
    1. 打开新的终端页面,执行以下命令,直接访问 kube-apisever,获取已经生效的 kubelet 配置。其中,${node-name}为节点名称。
    curl -sSL http://127.0.0.1:8001/api/v1/nodes/${node-name}/proxy/configz |jq