k8s 学习记录 (六)_Pod 污点和容忍性详解
一、前言
在 Kubernetes 集群中,我们已经了解了节点亲和性和 Pod 亲和性,它们在 Pod 调度方面提供了很大的灵活性。今天,我们来探讨另外两个重要的概念 ——Pod 污点(Taints)和容忍性(Tolerations),它们同样在 Pod 的调度和节点资源分配中扮演着关键角色。二、Pod 污点(Taints)
污点是应用在节点上的一种标记,它的作用是让节点拒绝接受某些 Pod 的调度,除非这些 Pod 明确表示可以容忍这些污点。可以将污点看作是节点对 Pod 的一种 “排斥规则”。使用kubectl taint`命令来给节点添加污点。命令格式如下:
kubectl taint nodes <node-name> <taint-key>=<taint-value>:<taint-effect>
其中:
- node-name:要添加污点的节点名称。
- taint-key:污点的键,用于标识污点的类型。
- taint-value:污点的值,与键一起构成污点的具体标识。
- taint-effect:污点的效果,常见的有以下三种:
- NoSchedule:表示 Pod 不能被调度到带有该污点的节点上,即使 Pod 已经在该节点上运行,也不会被重新调度到其他节点。
- PreferNoSchedule:这是一种软限制,尽量避免将 Pod 调度到带有该污点的节点上,但如果没有其他合适的节点,还是会调度过去。
- NoExecute:不仅 Pod 不能被调度到带有该污点的节点上,而且如果 Pod 正在该节点上运行,当污点被添加时,Pod 会根据其容忍性决定是否被驱逐。
例如,我们给名为node1的节点添加一个污点,使其不允许普通 Pod 调度:
kubectl taint nodes node1 dedicated=special-user:NoSchedule
这个命令表示node1节点被标记为仅供特定用户使用,普通 Pod 如果没有相应的容忍性,将无法被调度到该节点。
三、Pod 容忍性(Tolerations)
容忍性是 Pod 的一种属性,它允许 Pod 调度到带有特定污点的节点上。也就是说,容忍性是 Pod 对节点污点的一种 “免疫能力”。在 Pod 的配置文件中定义容忍性,示例如下:
yaml
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:tolerations:- key: "dedicated"operator: "Equal"value: "special-user"effect: "NoSchedule"containers:- name: my-containerimage: nginx:1.14.2ports:- containerPort: 80
在上述配置中:
- key:对应节点污点的键。
- operator:用于指定匹配操作符,有Equal(表示值必须完全匹配)和Exists(表示只要存在该键的污点就匹配,忽略值)两种。
- value:对应节点污点的值,当opera为Equal时需要指定。
- effect:对应节点污点的效果,只有当 Pod 的容忍性中effect与节点污点的effect相匹配时,才会考虑容忍该污点。
如果一个 Pod 需要容忍多种污点,可以在=spec.tolerations字段中定义多个容忍项。
四、深入理解容忍性的应用场景
1. 独占节点资源:在集群中,某些节点可能配置了特殊的硬件资源,如 GPU。为了确保这些节点仅被特定的任务使用,可以给这些节点添加污点,然后让需要使用这些资源的 Pod 设置相应的容忍性,这样就实现了资源的独占。2. 维护和升级节点:当需要对某个节点进行维护或升级时,可以给该节点添加` NoExecute` 类型的污点。此时,具有相应容忍性的 Pod 可以继续在该节点上运行,而没有容忍性的 Pod 会被驱逐,避免了服务中断。