恢复etcd数据并修改节点标签后,StatefulSet下Loki Pod无法重新调度
恢复etcd数据并修改节点标签后,StatefulSet下Loki Pod无法重新调度
我来帮你梳理下问题并给出排查方向——先对齐下你目前的操作流程和遇到的状况:
你的操作流程
- 测试环境:2个控制平面节点(A、B,初始A带有节点选择标签
cur=true),1个二进制部署的etcd节点 - 第一步:恢复etcd最新备份
systemctl stop etcd # /data/paas/etcd 是etcd的数据目录 rm -rf /data/paas/etcd/* latest_backup=$(ls -t /data/paas/bak/etcd/*db | head -n 1) etcdutl snapshot restore $latest_backup --data-dir /data/paas/etcd systemctl start etcd - 第二步:修改节点标签,把
cur=true从A移到Bkubectl label node A cur- kubectl label node B cur=true - 第三步:手动删除Pod触发重调度,结果发现
loki-0(loki命名空间下的StatefulSet Pod)出现调度异常
可能的原因及排查解决方法
1. 先看调度失败的具体原因
最直接的是查看Pod的事件日志,这能快速定位问题:
kubectl describe pod loki-0 -n loki
重点看Events部分,比如会不会是节点资源不足、亲和性/反亲和性不匹配、PVC绑定限制这些明确的提示。
2. 检查StatefulSet的调度配置是否正确
etcd恢复后,StatefulSet的配置可能存在未同步的情况,先确认它的节点选择器是不是正确指向cur=true:
kubectl get statefulset loki -n loki -o yaml | grep -A5 -B5 nodeSelector
如果配置没问题,再看看有没有节点亲和性、容忍度的配置,会不会和节点B的属性冲突。
3. 排查etcd恢复后的元数据一致性
恢复etcd后,Kubernetes组件(比如kube-scheduler、kube-controller-manager)可能还缓存着旧的节点标签或Pod信息,试试重启这些组件让它们重新同步数据:
- 二进制部署的话:
systemctl restart kube-controller-manager systemctl restart kube-scheduler - 容器化部署的话,找到对应的Pod删除重启即可。
4. 检查PVC绑定限制(StatefulSet常见问题)
Loki的StatefulSet通常会使用PVC存储数据,如果用的是本地存储卷,PVC会和原节点A绑定,导致无法调度到B。你可以查看PVC的状态和绑定信息:
kubectl get pvc -n loki kubectl describe pvc loki-data-loki-0 -n loki
如果是本地存储的问题,你需要重新创建PVC(或者修改存储类配置),让Loki支持跨节点调度。
5. 检查节点B的污点配置
看看节点B有没有设置污点,而Loki的Pod没有对应的容忍度:
kubectl describe node B | grep -A5 Taints kubectl get statefulset loki -n loki -o yaml | grep -A5 -B5 tolerations
如果有污点,给Loki的StatefulSet添加对应的容忍度配置即可。
快速验证尝试
可以先强制删除Pod,再观察调度情况:
kubectl delete pod loki-0 -n loki --force --grace-period=0
同时查看kube-scheduler的日志,能获取更详细的调度决策细节。
备注:内容来源于stack exchange,提问作者HuaJFrame
相关产品推荐
相关产品推荐

