一、参数优化¶
--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 状态更新机制¶
- kubelet 自身会定期更新状态到 apiserver,通过参数 --node-status-update- frequency指定上报频率,默认是 10s 上报一次。
- kube-controller-manager 会每隔 --node-monitor-period时间去检查 kubelet 的 状态,默认是 5s。
- 当 node 失联一段时间后,kubernetes 判定 node 为 notready 状态,这段时长通 过 --node-monitor-grace-period参数配置,默认 40s。
- 当 node 失联一段时间后,kubernetes 判定 node 为 unhealthy 状态,这段时长 通过 --node-startup-grace-period参数配置,默认 1m0s。
- 当 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 中常用的功 能,因此在应用程序开发中可能会相对较少使用。
四、限制驱逐¶
资源紧张时不建议进行驱逐的原因有以下几点:
- 资源可用性:特殊属性节点可能提供了某些独特的能力或功能,例如高性能计算、 存储设备或专用网络连接等。
- 资源调度:对于特殊属性的节点,通常只有少数几台存在于集群中,并且它们被认 为是有限且宝贵的资源。
- 重新调度成本:在高并发集群中频繁地驱逐容器会导致频繁的重新调度操作。重新 调度包括为被驱逐容器选择新的节点、迁移容器的状态和数据等。
五、原地升级¶
- 对组件进行二开,或者通过operator来变现;
- 在 resource 对应于 k8s 中的应用,当 pod 中的 image 改变后只更新 pod 不重建,kubelet 重启 container 生效。