Scheduling其实就是给新创建的POD 分配到哪个Node的过程,其实原理就是,当scheduler 决定了哪个Node以后,它会修改Pod 一个隐藏字段 NodeName,设置成具体的Node 的name,这样这个pod就被分配到具体的Node 了, 不过注意,这个NodeName只允许在创建pod的时候修改,例如我们在创建的时候可以手动指定Node name ,但是一旦pod 创建完成了,我们是不允许去修改这个字段了
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Pod metadata: name: nginx labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 8080 nodeName: node02 |
我们再来说一下kubernetes中另外一个选择机制:
Taints and Tolerations
Taint 是可以打在Node上的,和标签类似
toleration是打在pod上的,和selector类似
如果,一个Node上有Taint,不需要管这个Taint具体是什么,所有的pod都无法schedule到这个Node上,除非,我们某个pod我定义tolerate这个 taint
这样,我们就可以保证,我们这个node上,只有我们允许的pod(注意,有taint的pod 不一定会schedule到有taint的node,其他的Node也可能)
我们可以通过如下命令来打taint
1 |
kubectl taint nodes node1 app=blue:NoSchedule |
除了app=blue 这个taint外,我们还指定了 taint的机制: NoSchedule, taint的机制一共有三种:
NoSchedule
PreferNoSchedule
NoExecute
我们一般只用第一种,第二个perfer是尽量,不保证,第三个noExecute就是你打上以后立马把机器上不满足的pod 迁移走
然后如果我们想让我们的Pod tolerate这个taint
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: nginx-container image: nginx tolerations: - key: "app" operator: "Equal" value: "blue" effect: "NoSchedule" |
加入新的字段toleration就可以了,要和node 的taint对应
如何删除一个node上的taint呢?
1 |
kubectl taint nodes node1 app:NoSchedule- |
这样就可以删除了
Node Selectors
node selector 是一种基于Node上的label来为pod选择Node机制
想使用这个,必须先给node打上标签
1 |
$ kubectl label nodes node-1 size=Large |
然后通过如下文件进行创建
1 2 3 4 5 6 7 8 9 10 |
apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: data-processor image: data-processor nodeSelector: size: Large |
这个时候,我们就能保证我们的pod一定会schedule到node1 了
但是nodeselector 还是有一定的局限性,他不能说我允许pod 在所有的的非Node1的node上,所以我们有另外一个解决方案Node Affinity and Anti Affinity
Node Affinity
node affinity 给我了更负责的选择机制,允许我们可以一次选择多个条件的Node
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: data-processor image: data-processor affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: size operator: In values: - Large - Medium |
这个时候,我们的pod 就可以 schedule到 标签是Large 或者Medium的Node上,两个条件满足一个就可以
当然也有Not 的选择:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: data-processor image: data-processor affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: size operator: NotIn values: - Small |
需要注意的有点,
- requiredDuringSchedulingIgnoredDuringExecution
- preferredDuringSchedulingIgnoredDuringExecution
这句话的意思是,在创建的pod的时候,如果你选择第一个,那么,如果,没有符合条件的Node, pod会一直pendding
如果选择第二个:就会在没有符合条件的Node的时候,随便选一个,然后schedule
后边的IgnoredDuringExecurtion 意思是说,如果我们的Pod已经在运行了,然后我们如果把large的标签从Node上删除,那么pod 还会继续运行,因为我们选的是ignore
deployment 例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
apiVersion: apps/v1 kind: Deployment metadata: name: blue spec: replicas: 6 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: color operator: In values: - blue |
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021