污点 taints 是定义在node节点 上的键值型属性数据,用于让节点拒绝将Pod调度运行于其上,除非Pod有接纳节点污点的容忍度。容忍度 tolerations 是定义在Pod 上的键值属性数据,用于配置可容忍的污点,且调度器将Pod调度至其能容忍该节点污点的节点上或没有污点的节点上 。
对于nodeAffinity无论是硬策略(硬亲和)还是软策略(软亲和)方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taints ,除非 pod 也被标识为可以容忍污点节点,否则该Taints 节点不会被调度 pod。
节点亲和性,是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点。Taint 则相反,它使节点 能够 排斥 一类特定的 pod Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于pod上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上
定义污点和容忍度
污点定义于 nodes.spec.taints 属性。容忍度定义于 pods.spec.tolerations 属性。
使用 kubectl taint 命令可以给某个 Node 节点设置污点,Node 被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去 。
语法: key=value:effect
查看node节点名称
kubectl get nodes
查看master节点详细信息:通过观taints察属性,发现master节点默认被打上一个污点。
kubectl describe nodes k8s-master01
effect定义排斥等级
NoSchedule ,不能容忍,但仅影响调度过程,已调度上去的pod不受影响,仅对新增加的pod生效。
解释说明:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上 。 PreferNoSchedule ,柔性约束,节点现存Pod不受影响,如果实在是没有符合的节点,也可以调度上来。 解释说明:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上 。 NoExecute ,不能容忍,当污点变动时,Pod对象会被驱逐。
解释说明:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的Pod 驱逐出去
全部资源文件清档
本案例用于演示创建、删除污点及驱逐pod的过程。
污点语法
创建污点:语法规则
kubectl taint nodes node1 key1=value1:NoSchedule
删除污点:语法规则
kubectl taint nodes node1 key1:NoSchedule-
deploymentdemo控制器
产生10个副本
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploymentdemo
labels:
app: deploymentdemo
spec:
replicas: 10
template:
metadata:
name: deploymentdemo
labels:
app: deploymentdemo
spec:
containers:
- name: deploymentdemo
image: nginx:1.17.10-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
restartPolicy: Always
selector:
matchLabels:
app: deploymentdemo
设置污点
观察每个节点pod运行情况
kubectl get pods -o wide
在某一个节点创建污点并驱逐pod
kubectl taint nodes k8s-node03 offline=testtaint:NoExecute
查看pod被驱逐过程
kubectl get pods -o wide
删除污点
kubectl taint nodes k8s-node03 offline=testtaint:NoExecute-
查看节点污点信息
kubectl describe nodes k8s-node03
在Pod上定义容忍度时:
- 等值比较 容忍度与污点在key、value、effect三者完全匹配
- 存在性判断 key、effect完全匹配,value使用空值
一个节点可配置多个污点,一个Pod也可有多个容忍度
全部资源文件清档
本案例用于演示创建、删除及驱逐pod的过程。
设置污点
在某一个节点创建污点
kubectl taint nodes k8s-node03 offline=testtaint:NoSchedule
查看节点污点信息
kubectl describe nodes k8s-node03
deploymentdemo控制器
产生10个副本
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploymentdemo
labels:
app: deploymentdemo
spec:
replicas: 10
template:
metadata:
name: deploymentdemo
labels:
app: deploymentdemo
spec:
containers:
- name: deploymentdemo
image: nginx:1.17.10-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
restartPolicy: Always
selector:
matchLabels:
app: deploymentdemo
查看部署情况
部署控制器
kubectl apply -f deploymentdemo.yml
查看是否有pod被部署到k8s-node03节点
kubectl get pods -o wide
删除控制器
kubectl delete -f deploymentdemo.yml
设置pod容忍度
Pod.spec.tolerations属性:
...
spec:
tolerations:
- key: "offline"
operator: "Equal"
value: "testtaint"
effect: "NoSchedule"
containers:
...
完整控制器清单
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploymentdemo
labels:
app: deploymentdemo
spec:
replicas: 10
template:
metadata:
name: deploymentdemo
labels:
app: deploymentdemo
spec:
tolerations:
- key: "offline"
operator: "Equal"
value: "testtaint"
effect: "NoSchedule"
containers:
- name: deploymentdemo
image: nginx:1.17.10-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
restartPolicy: Always
selector:
matchLabels:
app: deploymentdemo
部署控制器
部署控制器
kubectl apply -f deploymentdemo.yml
查看pod详细信息
kubectl get pods -o wide
删除控制器
kubectl delete -f deploymentdemo.yml
删除污点
kubectl taint nodes k8s-node03 offline=testtaint:NoSchedule-