作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
上一小节的标签(lable)属于Pod选Node,并且需要Pod主动增加NodeSelectors配置,如果不增加这个标签对于Pod筛选Node实际上是没有作用的。有没有一种是Node主动来选择Pod呢,类似于Node节点预设了密码,Pod在默认情况下没有密码就无法调度到这个节点,除非它拿到密码的才可能能调度到这个节点上面。Kubenetes给我们提供了一个资源:污点(Taint),就可用满足这个要求。
在 Kubernetes 中,污点(Taints)是一种将节点标记为不适宜运行某些 Pod 的机制。污点可以用来确保 Pod 不会被调度到不合适的节点上。与节点亲和性(Node Affinity)相反,污点是一种排斥机制。
污点由以下三个部分组成:
NoSchedule:Kubernetes 不会将 新Pod 调度到具有该污点的节点上,历史存在pod不受影响(一般使用这个最多)
PreferNoSchedule:Kubernetes 会尽量避免将 Pod 调度到具有该污点的节点上,但不是强制的,也就是就算没有配置容忍(Tolerations)也有可能调度
NoExecute:如果 Pod 已经在具有该污点的节点上运行,它将被驱逐(后面会单独讲驱逐和隔离);同时,Kubernetes 不会将新的 Pod 调度到该节点上,历史存在Pod会受到影响。
查看污点
# 查看所有节点污点
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
Master节点默认自带污点,这个污点的目的是避免业务Pod调度到Master节点,这样预设的目的可以把管控节点和业务节点进行区分,Master节点只承担管理功能,不承担业务功能。这样我们可用在部署集群的时候选择合适的配置避免资源浪费,对于超大集群这个功能可以更好的管理集群于提高服务性能。
添加污点
#没有vlues的污点
kubectl taint nodes node01 node-role.kubernetes.io/master=:NoSchedule
#有vlaue的污点
kubectl taint nodes node02 node-role.kubernetes.io/master=true:NoSchedule
去除污点
#实际上就是后面加个"-"就是移除污点
kubectl taint nodes node01 node-role.kubernetes.io/master=:NoSchedule-
kubectl taint nodes node02 node-role.kubernetes.io/master=true:NoSchedule-
容忍污点
如果所有节点都有污点,那么创建一个新的Pod,则会因为污点原因导致无法调度成功,如果这个时候需要调度成功,则需要在Pod配置里面添加容忍(Tolerations)的配置,才可以调度成功。
所有节点都有污点
总共3个节点可用,3个节点都有污点,导致无法调度。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
tolerations: # 添加污点容忍
- key: "key1" # 污点的键
operator: "Equal" # 操作符
value: "value1" # 污点的值
effect: "NoSchedule" # 污点效果
tolerationSeconds: 3600 # 可选,容忍时间
- key: "key2"
operator: "Exists"
effect: "NoExecute"
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
1.tolerations: 这是一个数组,表示 Pod 可以容忍的污点列表。Pod 可以容忍一个或多个污点。
2.key: 这是污点的键,与节点上设置的污点键相对应。如果 Pod 愿意容忍具有该键的任何污点,则可以省略该字段,或者将其设置为空字符串。
tolerations:
- operator: "Exists" # 忽略所有污点的键和值
3.operator: 这是用于比较污点键和值的操作符。它可以是 “Equal” 或 “Exists”:
4.value: 这是污点的值。只有当操作符为 “Equal” 时,这个字段才是必需的。如果操作符是 “Exists”,则不应该设置此字段。
5.effect: 这是污点的影响,如 “NoSchedule”、“PreferNoSchedule” 或 “NoExecute”。它指定了污点对 Pod 调度的影响:
5.tolerationSeconds: 这是一个可选字段,仅当污点效果为 “NoExecute” 时才有效。它指定了 Pod 在被节点驱逐之前可以在具有相应污点的节点上容忍的时间。在这个例子中,如果节点在 Pod 被调度之后添加了具有 “key1” 和 “value1” 的 “NoExecute” 污点,Pod 将被允许在该节点上运行 3600 秒(1 小时),之后将被驱逐。
注:Pod有这个污点容忍只代表了它可以忽略掉节点上的污点,而不代表它只能调度到有污点的节点。