我们有一个大约有 8 个节点的 k8s 集群。有时一个节点被污染了,我们不知道为什么。昨天我在我的一个节点上发现了一个污点:
taints:
- key: node.kubernetes.io/not-ready
effect: NoSchedule
timeAdded: '2023-11-22T23:13:15Z'
- key: node.kubernetes.io/not-ready
effect: NoExecute
timeAdded: '2023-11-22T23:13:17Z'
我如何才能找出导致此污点的原因?我尝试查看 prometheus 指标和 journalctl,但找不到任何可以帮助我了解导致此问题的原因。
答案1
要确定 kubernetes 节点上污染的原因,可以按照以下步骤操作:
1.通过运行以下命令获取集群中所有节点的列表:
kubectl get nodes
2.通过运行以下命令检查节点
kubectl describe node NODE_NAME
3.在返回的输出中,查找Taints字段。
正如官方 kubernetes 中提到的文档:
当某些条件满足时,节点控制器会自动污染节点。内置以下污染:
node.kubernetes.io/not-ready
:节点尚未就绪。这对应于 NodeCondition Ready 为“False”。
如果要排空某个节点,节点控制器或 kubelet 会添加具有 NoExecute 效果的相关污点。默认情况下,会为node.kubernetes.io/not-ready
和增加此效果node.kubernetes.io/unreachable taints
。如果故障情况恢复正常,kubelet 或节点控制器可以删除相关污点。
您还可以参考此链接使用节点污点控制调度 了解更多信息。
答案2
对于找到此答案的人来说非标准污点或想要回答问题超过只是这是什么污点,仅有的几个选项是:
- 启用Kubernetes 审计使用有关动词的自定义规则
taint
。这将确保每次通过kubectl taint ...
审计配置中指定的日志文件执行命令时都会获得事件的详细记录。我发现了一个更好的演示在这篇博文中。 - 以这样的方式编写系统,即每个系统都有一个日志,这样
kubectl taint
你就有了一个用于审计目的的相应日志或历史记录条目。在我们的例子中,我们有一个自动脚本,根据集群的当前状态应用污点,这导致了混乱。在自动命令执行周围添加一些日志语句,确保我们以后可以回过头来验证它是否我们而不是其他一些随机的过程产生了污染。