所谓的污点,就是给k8s集群中的节点设置的污点,通过设置污点,来规划资源创建时所在的节点;
污点的类型 | 解释说明 |
PreferNoshedule | 节点设置这个五点类型后; 表示,该节点接受调度,但是会降低调度的概率; |
NoShedule | 表示,该节点不接受新的调度,以前有的资源,可以继续存在 |
NoExecute | 表示,不接受新的调度,驱逐以前的资源调度; |
根据节点设置污点;
[root@k8s231 dns]# kubectl describe nodes | grep -i taint
Taints: node-role.kubernetes.io/master:NoSchedule
Taints:
Taints:
取前两行查看
[root@k8s231 dns]# kubectl describe nodes | grep -i taint -A 2
Taints: node-role.kubernetes.io/master:NoSchedule
Unschedulable: false
Lease:
--
Taints:
Unschedulable: false
Lease:
--
Taints:
Unschedulable: false
Lease:
创建污点前,查看pod
创建污点
注意:创建五点有两种方式
第一种:key=value:污点类型
第二种:key:污点类型
[root@k8s231 dns]# kubectl taint node k8s233 k8s=xinjizhiwa:NoExecute
创建污点后,查看pod
查看原因
[root@k8s231 dns]# kubectl describe pods dm01-57ff86798f-4sl9r
[root@k8s231 dns]# kubectl taint node k8s233 k8s=xinjizhiwa:NoExecute-
把五点删除后,pod又恢复了
[root@k8s231 dns]# kubectl taint node k8s233 k8s=xinjizhiwa:NoExecute --overwrite
通过上文,我们谁知道,我们可以通过给k8s集群节点设置不同类型的“污点”,来控制资源创建的节点范围;
那么,k8s也同时提供了,“污点容忍”,就是即便你的节点设置了“污点”,我的资源也可以创建在这个节点上的能力;
可以理解为:在节点上设置了五点之后,你创建资源时,可以无视这个节点上的污点规则,也就可以在有污点的节点上创建资源;
假设:一个节点上有两个污点,但是你创建pod的时候,还想要在这个节点上创建,那么你就需要再资源清单中,写入“容忍这两个污点”,才会创建成功;
[root@k8s231 dns]# kubectl taint node k8s233 k8s=xinjizhiwa:NoSchedule
node/k8s233 tainted
[root@k8s231 dns]# kubectl taint node k8s233 k8s=xinjizhiwa:NoExecute --overwrite
node/k8s233 modified
[root@k8s231 dns]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm01
spec:
replicas: 10
selector:
matchLabels:
k8s: k8s
template:
metadata:
labels:
k8s: k8s
spec:
containers:
- name: c
image: nginx:1.20.1-alpine
ports:
- name: p
containerPort: 80
[root@k8s231 dns]# kubectl apply -f deploy.yaml
此时查看pod都在k8s232中,因为另外两个节点上都有污点,不允许创建
[root@k8s231 dns]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm01
spec:
replicas: 10
selector:
matchLabels:
k8s: k8s
template:
metadata:
labels:
k8s: k8s
spec:
#设置污点容忍
tolerations:
#指定污点的key
- key: node-role.kubernetes.io/master
#value:
#指定污点的类型
effect: NoSchedule
#设置key和value的关系
#--Exists:key匹配所有value
#--Equsl:key和value必须全部匹配到
operator: Exists
- key: k8s
value: xinjizhiwa
effect: NoExecute
operator: Equal
- key: k8s
value: xinjizhiwa
effect: NoSchedule
operator: Equalcontainers:
- name: c
image: nginx:1.20.1-alpine
ports:
- name: p
containerPort: 80
重新创建资源
[root@k8s231 dns]# kubectl apply -f deploy.yaml
发现,即便k8s231和k8s233都有污点,但是也都可以创建pod了;
[root@k8s231 dns]# kubectl get pods -o wide
[root@k8s231 dns]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm01
spec:
replicas: 10
selector:
matchLabels:
k8s: k8s
template:
metadata:
labels:
k8s: k8s
spec:
#设置污点容忍
tolerations:
#不写污点的key的相关属性表示匹配所有key
- operator: Exists
containers:
- name: c
image: nginx:1.20.1-alpine
ports:
- name: p
containerPort: 80
至此,pod调度的污点和污点容忍,学习完毕;