我有一个AWS EKS集群,它运行Istio、Karpenter、AWS EBS CSI驱动程序、AWS节点终止处理程序和我们的服务。
我们不断地让pod陷入Terminating状态,节点被污染为node.kubernetes.io/unreachable:NoSchedule
和node.kubernetes.io/unreachable:NoExecute
。
我一直无法解决这些问题,需要一些指导。
一旦pod进入终止状态,我似乎无法检索任何容器日志。如果我跑步:
$ kubectl get pods -n status-ns
NAME READY STATUS RESTARTS AGE
status-api-69cdd64fbf-gc5cz 2/2 Running 0 177m
status-api-69cdd64fbf-tdt8q 2/2 Terminating 0 3h38m
字符串
但是如果我尝试以格式化输出的形式运行它,无论是json还是yaml,那么两个容器都被标记为'Running':
$ kubectl get pods -n status-ns -o json | jq '.items[].status.phase'
"Running"
"Running"
型
所有停留在“终止”状态的pod似乎都连接到了受污染的节点,但如上所述,我无法获得这些节点的任何日志。
这些pod保持这种状态,节点不会终止,除非我手动强制删除所有pod
kubectl delete pod status-api-69cdd64fbf-tdt8q --grace-period=0 --force -n status-ns
型
1.为什么节点会被赋予这些污染,为什么pod没有被排空并成功终止?
1.我在哪里可以找到一些有用的日志来调试这种情况?
1条答案
按热度按时间mlmc2os51#
当kubelet出现问题并且无法与apiserver通信时,就会出现您所描述的问题。
正如您指出的,所有受影响的pod都在同一个节点上。该节点有一些问题,kubelet失败或至少无法与apiserver对话。pod的最后已知状态是它们处于Terminating状态,并且由于apiserver没有获得关于pod的任何新状态更新,因此pod保持在该状态(实际上pod可能已经被驱逐)。原木也是如此。
因此,可能发生的情况是,节点有问题,变得不可达,它被污染并被耗尽。但是由于kubelet没有响应,drain无法成功,使pod保持在Terminating状态,并阻止节点从集群中删除。强制删除所有pod可解决该锁定。