Kubectl排水节点失败:“禁止:节点更新只能更改标签,异味或容量”

时间:2019-09-22 11:39:19

标签: kubernetes kubectl azure-aks

使用以下方法尝试耗尽AKS K8s群集上的节点时:

kubectl drain ${node_name} --ignore-daemonsets

我收到以下错误:

   "The Node \"aks-agentpool-xxxxx-0\" is invalid: []: Forbidden: node updates may only change labels, taints, or capacity (or configSource, if the DynamicKubeletConfig feature gate is enabled)"

在AKS节点上是否需要做一些额外的工作以允许排空?

(上下文:这是自动化脚本的一部分,我正在编写该脚本以耗尽kubernetes节点以进行维护操作而不会造成停机,因此,耗尽绝对是此处的先决条件)

其他故障排除说明:

该命令通过Ansible的“ shell”模块运行,但是当该命令直接在BASH中运行时,它可以正常工作。

此外,ansible正在通过Jenkins管道运行。调试语句似乎显示:

  • 正确形成并执行命令。
  • 上下文似乎正确(因此可以访问kubeconfig)
  • 可以列出Pod(因此kubeconfig处于活动状态且正确)

1 个答案:

答案 0 :(得分:1)

  

该命令正在通过Ansible的“ shell”模块运行,但是当   命令直接在BASH中运行,效果很好。

     

此外,ansible正在通过Jenkins管道运行。

您最好添加此信息,因为它完全改变了我们应该从哪个角度审视您遇到的问题。

出于调试目的,而不是运行命令,请尝试运行:

kubectl auth can-i drain node --all-namespaces

直接在bash shell中以及通过 Ansible的 shell module

如果这不是许可问题,它至少应该给您答案。

在这种情况下,您可以用来调试的其他命令是:

ls -l .kube/config

cat .kube/config

whoami

最后一个,以确保 Ansible 使用相同的user。如果您已经知道它使用了不同的user,请尝试使用与您在 bash shell 中运行脚本时所用的脚本user相同的脚本。

一旦选中此复选框,我们就可以继续调试过程。