k8s经典面试题:Daemonset设置污点的时候,pod状态?

其实这道题有点坑,很多同学都会认为daemonset 和 deployment行为一样,如果pod 设置了污点,pod 则会一直处于 pending无法调度的状态。但daemonset 的行为却不一样。

k8s经典面试题:Daemonset设置污点的时候,pod状态?

我们首先看一下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

标签:污点   状态   都会   节点   绑定   注释   逻辑   负担   分配   条件   同学   经典   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top