Open llhuii opened 3 years ago
功能:根据node状态/spec.Unschedulable对node增加或删除对应污点 从nodeUpdateQueue队列取nodeName(当有node Add或者Update事件入队 ):
node.kubernetes.io/{memory,disk,pid}-pressure
// map {NodeConditionType: {ConditionStatus: TaintKey}}
// represents which NodeConditionType under which ConditionStatus should be
// tainted with which TaintKey
// for certain NodeConditionType, there are multiple {ConditionStatus,TaintKey} pairs
nodeConditionToTaintKeyStatusMap = map[v1.NodeConditionType]map[v1.ConditionStatus]string{
v1.NodeReady: {
v1.ConditionFalse: v1.TaintNodeNotReady,
v1.ConditionUnknown: v1.TaintNodeUnreachable,
},
v1.NodeMemoryPressure: {
v1.ConditionTrue: v1.TaintNodeMemoryPressure,
},
v1.NodeDiskPressure: {
v1.ConditionTrue: v1.TaintNodeDiskPressure,
},
v1.NodeNetworkUnavailable: {
v1.ConditionTrue: v1.TaintNodeNetworkUnavailable,
},
v1.NodePIDPressure: {
v1.ConditionTrue: v1.TaintNodePIDPressure,
},
node.kubernetes.io/unschedulable
的taint// First we try getting node from the API server cache, as it's cheaper. If it fails
// we get it from etcd to be sure to have fresh data.
if firstTry {
node, err = kubeClient.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{ResourceVersion: "0"})
firstTry = false
} else {
node, err = kubeClient.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
}
beta.kubernetes.io/os
和beta.kubernetes.io/arch
label与kubernetes.io/arch
等不一致的场景那nodeUpdateQueue(fifo类型)是怎么入队的?
功能:将pod的状态置为not ready, 如果对应节点not ready的话。 从podUpdateQueue队列取出pod, 调用processPod:
那podUpdateQueue(RateLimitingQueue类型)是什么时候入队的?
当node 网络不可达时, 超过podEvictionTimeout(默认5分钟), 会将该node上所有pod驱逐, 具体动作是:
问题: 注意到Pod是被优雅删除了, 那Pod什么时候被真正删除?
节点控制官方文档见https://kubernetes.io/zh/docs/concepts/architecture/nodes/#node-controller code.k8s.io/pkg/controller/nodelifecycle/node_lifecycle_controller.go 主流程主要启动以下协程: