kubelet | Kubernetes

一、参数优化

--max-pods:kubelet 可以运行的最大 Pod 数量。

--image-pull-progress-deadline:配置镜像拉取超时。

--eviction-hard 和 --eviction-soft:这两个参数用于定义 kubelet 中 Pod 驱逐 (Eviction)策略的硬性和软性限制。

--image-gc-high-threshold 和 --image-gc-low-threshold:这两个参数用于定义 kubelet 中镜像垃圾回收(Garbage Collection)的阈值。

--serialize-image-pulls:该选项配置串行拉取镜像,默认值时true,配置为false可以增加并发度。

二、Kubelet 状态更新机制

  1. kubelet 自身会定期更新状态到 apiserver,通过参数 --node-status-update- frequency指定上报频率,默认是 10s 上报一次。
  2. kube-controller-manager 会每隔 --node-monitor-period时间去检查 kubelet 的 状态,默认是 5s。
  3. 当 node 失联一段时间后,kubernetes 判定 node 为 notready 状态,这段时长通 过 --node-monitor-grace-period参数配置,默认 40s。
  4. 当 node 失联一段时间后,kubernetes 判定 node 为 unhealthy 状态,这段时长 通过 --node-startup-grace-period参数配置,默认 1m0s。
  5. 当 node 失联一段时间后,kubernetes 开始删除原 node 上的 pod,这段时长是通 过 --pod-eviction-timeout参数配置,默认 5m0s。

社区默认的配置:

参数
–node-status-update-frequency 10s
–node-monitor-period 5s
–node-monitor-grace-period 40s
–pod-eviction-timeout 5m

快速更新和快速响应:

参数
–node-status-update-frequency 4s
–node-monitor-period 2s
–node-monitor-grace-period 20s
–pod-eviction-timeout 30s

中等更新和平均响应:

参数
–node-status-update-frequency 20s
–node-monitor-period 5s
–node-monitor-grace-period 2m
–pod-eviction-timeout 1m

这种场景下会 20s 更新一次 node 状态,controller manager 认为 node 状态不正常之 前,会有 2m60⁄205=30 次的 node 状态更新,Node 状态为 down 之后 1m,就会触发 驱逐操作。

如果有 1000 个节点,1分钟之内就会有 60s/20s*1000=3000 次的节点状态更新操作。

低更新和慢响应:

参数
–node-status-update-frequency 1m
–node-monitor-period 5s
–node-monitor-grace-period 5m
–pod-eviction-timeout 1m

Kubelet 将会 1m 更新一次节点的状态,在认为不健康之后会有 5m/1m*5=25 次重试更 新的机会。Node为不健康的时候,1m 之后 pod开始被驱逐。

三、使用bookmark机制

Kubernetes(K8s)中的 "bookmark" 是一个用于标记资源的机制,允许用户保存特定 资源对象的状态,并随后通过该标记来检索和操作该资源。

在 Kubernetes API 中,bookmark 是由 API 资源对象的 metadata 字段中的 resourceVersion 和 kind 属性组成的。这个 bookmark 可以用作查询参数传递给API,以便在操作期间锁定特定的资源状态。

使用 bookmark 的常见场景是在众多资源对象中执行分页操作或轮询更新。例如,在获 取 Pod 列表的过程中,如果列表很大并且你希望在下次获取时继续之前的状态,可以通 过将当前的 bookmark 作为查询参数传递给 API 来实现。

以下是一个获取 Pod 列表的示例请求,其中使用了一个 bookmark:

GET /api/v1/namespaces/default/pods?limit=10&bookmark=f2b9fc35-5f82-4820-bfa4-7079595c48b3

在响应中,Kubernetes API 将返回下一个页面的 Pod 列表,并在 metadata 中包含下 一个bookmark,以便在后续请求中使用。

尽管 bookmark 对于分页和追踪资源状态很有用,但它不是 Kubernetes 中常用的功 能,因此在应用程序开发中可能会相对较少使用。

四、限制驱逐

资源紧张时不建议进行驱逐的原因有以下几点:

  1. 资源可用性:特殊属性节点可能提供了某些独特的能力或功能,例如高性能计算、 存储设备或专用网络连接等。
  2. 资源调度:对于特殊属性的节点,通常只有少数几台存在于集群中,并且它们被认 为是有限且宝贵的资源。
  3. 重新调度成本:在高并发集群中频繁地驱逐容器会导致频繁的重新调度操作。重新 调度包括为被驱逐容器选择新的节点、迁移容器的状态和数据等。

五、原地升级

  • 对组件进行二开,或者通过operator来变现;
  • 在 resource 对应于 k8s 中的应用,当 pod 中的 image 改变后只更新 pod 不重建,kubelet 重启 container 生效。