kubernetes集群中,master机器,分配任务给worker node机器时,会根据任务的不同要求,比如对内存的要求等,分配给不同符合需求的worker node。所以就有了toleration和taint的这种偏好设置。
1. Toleration 和Taint 概念
Toleration是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。比如一个节点内存比较大,会吸引需要大内存的pod。
Taint 则相反,它使节点能够排斥一类特定的 pod。
Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上
2. taint一个worker node
kubectl taint node node1 node-type=prod:NoSchedule (这里的node1根据你真实的node名字来写)
3.schedule一个pod到指定环境
(1)新建一个devpod.yaml的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: devpod
labels:
app: busybox
spec:
containers:
- name: dev
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
(2)根据步骤(1)中的yaml文件,创建pod
kubectl create -f devpod.yaml
4. 允许一个pod被schedule到一个pod环境
(1)创建一个deploypod.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: prod
spec:
replicas: 1
selector:
matchLabels:
app: prod
template:
metadata:
labels:
app: prod
spec:
containers:
- args:
- sleep
- "3600"
image: busybox
name: main
tolerations:
- key: node-type
operator: Equal
value: prod
effect: NoSchedule
(2)以下命令,新建一个deployment(yaml文件里面的kind是pod,那么以下命令创建的就是pod;kind如果是deployment,那么以下命令新建的就是deployment)
kubectl create -f deploypod.yaml
5. 检查每个pod是否被schedule了
kubectl get pods -o wide
6. 检查production pod的toleraion属性
kubectl get pods <pod_name> -o yaml