07 - 节点 CPU 升级,导致 kubelet 无法启动

本文所编辑的内容,参考了原文1原文2原文3

1 事件背景

大家都知道 k8s 容量不够的时候,都是添加节点(横向扩展)来解决问题。这几天有小伙伴在升级 k8s 容量的时候碰到一个问题,他将集群中某一个 node节点的 CPU 做了升级(纵向扩展),然后重启了这个 node 节点导致 kubelet 无法启动,然后大量 pod 被驱逐,报警电话响个不停。为了紧急恢复业务,果断参加故障恢复。


2 现象获取

在知道事件背景后,我登上了那个已经重启完毕的 node 节点,开始了一系列的网络测试,确认 node 这个宿主机到 Apiserver 和 Loadbalancer 的 ip 和 port 都是通的。随后赶紧看了下 kubelet 的日志,果不其然,一行日志让我看到问题点:

E1121 23:43:52.644552   23453 policy_static.go:158] "Static policy invalid state, please drain node and remove policy state file" err="current set of available CPUs \"0-7\" doesn't match with CPUs in state \"0-3\""
E1121 23:43:52.644569   23453 cpu_manager.go:230] "Policy start error" err="current set of available CPUs \"0-7\" doesn't match with CPUs in state \"0-3\""
E1121 23:43:52.644587   23453 kubelet.go:1431] "Failed to start ContainerManager" err="start cpu manager error: current set of available CPUs \"0-7\" doesn't match with CPUs in state \"0-3\""

说到这里,很多小伙伴会说:“就这??”。 真的就这。是因为啥呢? 是因为 kubelet 启动参数里面有一个参数很重要:–cpu-manager-policy 。表示 kubelet 在使用宿主机的 cpu 是什么逻辑策略。如果你设定为 static ,那么就会在参数 –root-dir 指定的目录下生成一个 cpu_manager_state 这样一个绑定文件。


cpu_manager_state 内容大致长得如下:

[root@master-01 system]# cat /var/lib/kubelet/cpu_manager_state
{ "policyName": "static", "defaultCpuSet": "0-7", "checksum": 14413152 }

当你升级这个 k8s node 节点的 CPU 配置,并且使用了 static cpu 管理模式,那么 kubelet 会读取 cpu_manager_state 文件,然后跟现有的宿主运行的资源做对比,如果不一致,kubelet 就不会启动了


3 原理分析

参考官网


4 解决方案

因此,当我们发现“start cpu manager error”之类的错误时,就可以按照下面的步骤进行尝试解决:

第一步:首先要删除系统的/var/lib/kubelet/cpu_manager_state或者/var/lib/kubelet/memory_manager_state(扩容内存的话,也有可能会出现这个问题),避免与旧的策略产生冲突
# rm /var/lib/kubelet/cpu_manager_state

第二步:加载服务 
# systemctl daemon-reload

第三步:重启kubelet服务 
# systemctl restart kubelet 

这样的话,新的CPU管理策略文件就会重新生成,然后观察服务否恢复正常。

Kubernetes 架构kube-apiserver、kube-controller-manager、scheduler 和 kubelet 是四个核心组件,它们之间相互协作,从而实现 Kubernetes集群管理功能。 1. kube-apiserver:作为 Kubernetes 集群的接口,处理所有 REST API 请求。kube-apiserver 接收到用户提交的配置信息,然后将其存储到 etcd 。 2. kube-controller-manager:控制器管理器是 Kubernetes 集群的核心组件,它包含了多个控制器,用于管理集群的各种资源,如 Pod、Service、ReplicationController 等。每个控制器负责监控一个或多个资源,并确保它们处于预期状态。 3. scheduler:调度器根据资源的需求和可用性,将 Pod 分配到合适的节点上。当 kube-apiserver 接收到一个新的 Pod 创建请求时,它会将该请求发送到调度器进行处理。 4. kubeletkubelet 运行在每个节点上,负责管理该节点上的所有容器kubelet 监控 etcd 的 Pod 配置信息,并负责在节点上创建、启动和停止容器。 这四个组件之间的交互过程如下: 1. 用户提交配置信息到 kube-apiserver。 2. kube-apiserver 将配置信息存储到 etcd 。 3. kube-controller-manager 监控 etcd 的资源状态,并根据需要更新该状态。 4. scheduler 监听 kube-apiserver 上的新 Pod 创建请求,并为其分配一个节点。 5. kubelet 监听 etcd 的 Pod 配置信息,并负责在节点上创建、启动和停止容器。 这样,Kubernetes 就可以实现高可用、弹性伸缩、自动装箱等特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值