k8s节点升级cpu与内存后,静态pod无法启动-cpuManagerPolicy
简述: 最近k8s master内存压力比较大, pod数量越来越多, 打算对cpu 内存进行扩容
扩容有 cpu 4C/8G, 变更成8C/16G, 通过升级后,发现apiserver 静态pod无法启动,
在kubelet 配置文件中发现 --cpu-manager-policy=static配置, 删除后,重启kubelet出现
could not restore state from checkpoint: configured policy "static" differs from state
checkpoint policy "none", please drain this node and delete the CPU manager
checkpoint file "/var/lib/kubelet/cpu_manager_state"
before restarting Kubelet
发现 /var/lib/kubelet/cpu_manager_state 中指定cpu核数[0-3]. 通过官网查询具体详情
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/cpu-management-policies/
控制节点上的 CPU 管理策略
按照设计,Kubernetes 对 Pod 执行相关的很多方面进行了抽象,使得用户不必关心。 然而,为了正常运行,有些工作负载要求在延迟和/或性能方面有更强的保证。 为此,kubelet 提供方法来实现更复杂的负载放置策略,同时保持抽象,避免显式的放置指令。
CPU 管理策略
默认情况下,kubelet 使用 CFS 配额 来执行 Pod 的 CPU 约束。 当节点上运行了很多 CPU 密集的 Pod 时,工作负载可能会迁移到不同的 CPU 核, 这取决于调度时 Pod 是否被扼制,以及哪些 CPU 核是可用的。 许多工作负载对这种迁移不敏感,因此无需任何干预即可正常工作。
然而,有些工作负载的性能明显地受到 CPU 缓存亲和性以及调度延迟的影响。 对此,kubelet 提供了可选的 CPU 管理策略,来确定节点上的一些分配偏好。
配置
CPU 管理策略通过 kubelet 参数 --cpu-manager-policy
或 KubeletConfiguration 中的 cpuManagerPolicy
字段来指定。 支持两种策略:
none
: 默认策略,表示现有的调度行为。static
: 允许为节点上具有某些资源特征的 Pod 赋予增强的 CPU 亲和性和独占性。
CPU 管理器定期通过 CRI 写入资源更新,以保证内存中 CPU 分配与 cgroupfs 一致。 同步频率通过新增的 Kubelet 配置参数 --cpu-manager-reconcile-period
来设置。 如果不指定,默认与 --node-status-update-frequency
的周期相同。
Static 策略的行为可以使用 --cpu-manager-policy-options
参数来微调。 该参数采用一个逗号分隔的 key=value
策略选项列表。 此特性可以通过 CPUManagerPolicyOptions
特性门控来完全禁用。
策略选项分为两组:alpha 质量(默认隐藏)和 beta 质量(默认可见)。 这些组分别由 CPUManagerPolicyAlphaOptions
和 CPUManagerPolicyBetaOptions
特性门控来管控。 不同于 Kubernetes 标准,这里是由这些特性门控来管控选项组,因为为每个单独选项都添加一个特性门控过于繁琐。
更改 CPU 管理器策略
由于 CPU 管理器策略只能在 kubelet 生成新 Pod 时应用,所以简单地从 "none" 更改为 "static" 将不会对现有的 Pod 起作用。 因此,为了正确更改节点上的 CPU 管理器策略,请执行以下步骤:
驱逐节点。 停止 kubelet。 删除旧的 CPU 管理器状态文件。该文件的路径默认为 /var/lib/kubelet/cpu_manager_state。 这将清除 CPUManager 维护的状态,以便新策略设置的 cpu-sets 不会与之冲突。 编辑 kubelet 配置以将 CPU 管理器策略更改为所需的值。 启动 kubelet。
相关文章
- 【K8S】基于coredns配置自定义域名类似配置HOST
- Centos7二进制部署k8s-v1.20.2 ipvs版本(kube-proxy、calico)
- Prometheus 基于k8s服务发现 监控apiserver
- k8s安装istio及istio入门示例
- K8S java应用jvm内存诊断解决方案:java应用诊断和在线debug利器bistoury介绍及在K8S环境中的使用
- 【收藏】十分钟弄懂 k8s Operator 应用的制作流程
- K8S资源限定(CPU、内存)及pod数量修改
- K8S集群搭建:安装kubeadm集群部署工具
- 【GO】k8s 管理系统项目21[前端部分–Footer和main]
- 【云原生 | Kubernetes 系列】Redis单机和Redis-cluster的K8S实现
- 分析 k8s docker 查看 内存 CPU使用率 k8s docker 性能 分析
- k32.第十三章 K8s高级篇-中间件容器化及Helm (三)
- k25.第十一章 K8s进阶篇-细粒度权限控制 (一)
- 使用kubeadm快速部署一个k8s集群(亲测有效)
- 【云原生之kubernetes实战】在k8s环境下部署Homepage个人导航页
- 微服务 在 k8s 中部署网关 Eureka 服务
- 微服务 在k8s中部署订单order服务
- 【K8S系列】深入解析 k8s:入门指南(一)
- 【K8S系列】深入解析滚动升级
- k8s学习之路 | Day3 跟着官方体验 Minikube