Kubectl未同步Kops删除重建后的节点状态求助
这种kubectl和kops、AWS控制台不同步的情况我碰到过好几次,大概率是集群状态同步或者kubelet节点注册环节出了问题,你可以按下面的步骤逐一排查:
1. 先确认kubectl的集群上下文是否正确
有时候我们会不小心切换到其他集群的上下文,导致看不到目标集群的节点。先检查当前kubectl指向的集群:
kubectl config current-context kubectl config get-contexts
如果发现上下文不对,用下面的命令切换到你的目标集群:
kubectl config use-context kubernetes.xxxxxx.xxx
2. 强制kops同步集群配置
kops偶尔会出现资源状态和kubernetes API不同步的情况,你可以手动触发集群更新和滚动更新,让kops重新核对AWS资源与集群配置:
# 更新集群配置 kops update cluster --name kubernetes.xxxxxx.xxx --state s3://kops-state-xxxxxxxx --yes # 触发滚动更新,确保新节点的配置正确注入 kops rolling-update cluster --name kubernetes.xxxxxx.xxx --state s3://kops-state-xxxxxxxx --yes
这个操作会让kops重新生成节点的kubeconfig和证书,并确保新节点的信息被推送到kube-apiserver。
3. 检查新节点的kubelet注册状态
登录到AWS控制台显示的新节点上,查看kubelet的运行日志,确认它是否成功连接到master节点的API并完成注册:
# 登录节点后执行,实时查看kubelet日志 journalctl -u kubelet -f
如果日志里出现Failed to register node这类错误,大概率是证书问题或者网络不通:
- 检查节点上的
/var/lib/kubelet/kubeconfig文件是否正确,里面的API地址、证书路径是否和集群配置一致; - 测试节点能否ping通master节点的内网IP,确保集群的网络策略没有阻断节点和master的通信。
4. 检查master节点的kube-apiserver日志
如果kubelet那边没问题,就去master节点查看apiserver的日志,看看有没有拒绝节点注册的记录:
# 在master节点执行,实时查看apiserver日志 journalctl -u kube-apiserver -f
如果出现认证相关的错误,可能是kops在创建新节点时没有正确注入集群CA签发的证书,这时候可以尝试用kops重新生成节点的证书并重启kubelet。
5. 强制刷新kubectl的本地缓存
有时候kubectl的本地缓存会有延迟,你可以尝试用新的缓存目录拉取节点信息,或者查看详细日志确认是否从API拉取最新数据:
# 使用临时缓存目录拉取节点 kubectl get nodes --cache-dir=/tmp/kubectl-temp-cache # 查看详细请求日志,确认是否获取到最新数据 kubectl get nodes -v=6
从你的命令输出来看,kops的instance groups显示nodes组有2个实例,但kubectl只列出了1个node和1个master,说明新节点确实没有成功注册到kubernetes集群,重点排查kubelet注册和kops同步这两个环节应该就能解决问题。
内容的提问来源于stack exchange,提问作者Gaudam Thiyagarajan

