其实这道题有点坑,很多同学都会认为daemonset 和 deployment行为一样,如果pod 设置了污点,pod 则会一直处于 pending无法调度的状态。但daemonset 的行为却不一样。
我们首先看一下pod 是否会创建,pod 的创建的逻辑都在 kcm 里面。我们看一下daemonset controller。
nodeShouldRunDaemonPod 决定是否在本节点上面运行daemonset pod。
func (dsc *DaemonSetsController) nodeShouldRunDaemonPod(node *v1.Node, ds *apps.DaemonSet) (bool, bool, error) {
pod := NewPod(ds, node.Name)
//如果deamonset 设置了 nodename,那么只会往对应的node 上面创建
if !(ds.Spec.Template.Spec.NodeName == "" || ds.Spec.Template.Spec.NodeName == node.Name) {
return false, false, nil
}
// 匹配污点,如果设置了污点并且没有添加容忍的话,则不会运行daemonset pod
taints := node.Spec.Taints
fitsNodeName, fitsNodeAffinity, fitsTaints := Predicates(pod, node, taints)
if !fitsNodeName || !fitsNodeAffinity {
return false, false, nil
}
if !fitsTaints {
// 如果匹配污点,但是设置了容忍,已经运行的pod 的则不会杀死
shouldContinueRunning := v1helper.TolerationsTolerateTaintsWithFilter(pod.Spec.Tolerations, taints, func(t *v1.Taint) bool {
return t.Effect == v1.TaintEffectNoExecute
})
return false, shouldContinueRunning, nil
}
return true, true, nil
}
通过上面的注释,可以看到。如果daemonset 不满足污点的情况下,是不会创建pod的,这和 deployment 是不一样的。之所以不一样是因为,daemonset 就是按照节点分配,如果不符合本节点条件就没有必要创建pod,这样只会增加 kube-scheduler的负担。而deployment是没有绑定节点的。
页面更新:2024-04-15
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号