Node异常时Pod状态分析

场景一:停止kubelet并恢复

操作和现象

操作

节点上运行Pod后把kubelet进程停掉。

现象 

node状态变为NotReady,不同类型的Pod情况不同。

Deployment

Pod在5分钟之后开始一直处于Terminating,创建新Pod。

StatefulSet

Pod在5分钟之后开始一直处于Terminating

DaemonSet

Pod一直处于Running状态。

 

操作

10分钟后,启动kubelet进程。

现象

node状态变为Ready,不同类型的Pod情况不同。

Deployment

旧Pod被删除,新Pod处于Running状态。

StatefulSet

Pod被删除后重建。

DaemonSet

Pod不会被删除,Pod里面的容器会重新创建。

为什么StatefulSet Pod在node异常时没有重建?

在node controller中,除了daemonset pods外,都会调用delete pod api删除pod。
kubelet异常导致Pod Object一直无法从etcd中删除。
statefulset只会针对isFailed Pod(但现在Pod是Unkown状态)才会去重建Pod。

pkg/controller/statefulset/stateful_set_control.go

// delete and recreate failed pods
if isFailed(replicas[I]) {
	ssc.recorder.Eventf(set, v1.EventTypeWarning, "RecreatingFailedPod",
		"StatefulSetPlus %s/%s is recreating failed Pod %s",
		set.Namespace,
		set.Name,
		replicas[I].Name)
	if err := ssc.podControl.DeleteStatefulPlusPod(set, replicas[I]); err != nil {
		return &status, err
	}
	if getPodRevision(replicas[I]) == currentRevision.Name {
		status.CurrentReplicas—
	}
	if getPodRevision(replicas[I]) == updateRevision.Name {
		status.UpdatedReplicas—
	}
	status.Replicas—
	replicas[I] = newVersionedStatefulSetPlusPod(
		currentSet,
		updateSet,
		currentRevision.Name,
		updateRevision.Name,
		i)
}

sts和deploy pod进入Terminating原因

从停止kubelet到Pod变成Terminating,间隔了345s。

Pod开始删除时间都在09:43:32

kcm中TaintManager在09:43:32开始删除这2个Pod

NodeLifecycleController在09:38:32即NodeNotReady之后增加NoExecute污点

当节点上出现NoExecute污点后,TaintManager获取所有跑在这个节点上的Pod并在5分钟后开始删除不可容忍的Pod

pkg/controller/nodelifecycle/scheduler/taint_manager.go
handleNodeUpdate函数

场景二:节点产生磁盘压力

kubelet默认硬驱逐条件

imagefs.available:镜像分区磁盘可使用率,默认在/var/lib/docker
memory.available:节点可用内存
nodefs.available:kubelet参数--root-dir分区磁盘可使用率

nodefs.inodesFree:nodefs inode可使用率

磁盘压力是nodefs.available

操作

拷贝大文件后产生磁盘压力。

现象 

不同类型的Pod情况不同。

Deployment

旧Pod处于Evicted状态,新Pod处于Pending。

StatefulSet

新Pod处于Pending状态。

DaemonSet

新Pod处于Evicted状态。

节点因磁盘压力而被打上了不可调度污点,但是node状态还是Ready。

针对磁盘压力,kubelet会回收临时卷、删除没有使用的容器和镜像,驱逐Pod。

操作

删除大文件后释放磁盘压力,重启kubelet(快点上报状态)。

现象 

Pod恢复Running。

posted on 2023-01-25 11:07  王景迁  阅读(235)  评论(0编辑  收藏  举报

导航