关于调度
k8s内pod由scheduler调度,scheduler的任务是把pod分配到合适的node节点上。scheduler调度时会考虑到node节点的资源使用情况、port使用情况、volume使用情况等等...在此基础之上,我们也可以控制pod的调度。
亲和性
亲和性分为节点亲和与pod亲和,亲和策略分类软策略与硬策略。
节点亲和
apiVersion: v1
kind: Pod
metadata:
name: node-affinity
namespace: test
spec:
containers:
- name: nginx-pod
image: nginx:latest
affinity:
# 节点亲和
nodeAffinity:
# 硬策略,条件必须成立
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
# 要调度到node的标签是kubernetes.io/hostname=node01的节点上
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node01
# 软策略,条件尽量要成立
preferredDuringSchedulingIgnoredDuringExecution:
# 多个软策略的权重,范围在1-100内,越大计算的得分越高
- weight: 1
preference:
matchExpressions:
# 要调度到node的标签是area=beijing的节点上
- key: area
operator: In
values:
- beijing
pod亲和常用于避免相同类型的pod调度相同的节点上。
apiVersion: v1
kind: Pod
metadata:
name: pod-affinity
namespace: test
spec:
containers:
- name: nginx-pod
image: nginx:latest
affinity:
# pod亲和 要求与指定的pod在同一个拓扑域
podAffinity:
# 硬策略
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx01
# 拓扑域(node上的标签key)
topologyKey: kubernetes.io/hostname
# pod亲和 要求与指定的pod不在同一个拓扑域
podAntiAffinity:
# 软策略
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx01
# 拓扑域(node上的标签key)
topologyKey: kubernetes.io/hostname
污点
通过kubctl taint
命令可以给某一个node节点设置污点,node上设置了污点之后,可以上node拒绝pod的调度,甚至可以将node上已经存在的pod驱逐出去。
污点可以用于集群节点迁移准备工作,通过打污点来使当前节点上的pod迁移出去。k8s 的master节点自带污点。
污点的组成为key=value:effect
,effect有以下三个选项:
- NoSchedule:k8s不会把pod调度到该节点上
- PreferNoSchedule:k8s尽量不会把pod调度到该节点上
- NoExecute:k8s不会把pod调度到该节点上,同时会把已有节点驱逐出去
#设置污点
kubectl taint nodes node1 key1=value1:NoSchedule
#去除污点
kubectl taint nodes node1 key1:NoSchedule-
容忍
pod可以设置容忍,代表此pod可以容忍某个污点的存在。
pod.spec.tolerations
tolerations:
- key: "key1"
operator: " Equal"
value: "value1"
effect: "NoSchedule"
tolerationSeconds: 3600
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
- key: "key2"
operator: "Exists"
effect: "NoSchedule"
- 其中key,vaule,effect要与Node中设置的taint保持一致
- operator 的值为Exists将会忽略value值
- tolerationSeconds 用于描述当Pod需要被驱逐时可以在Pod上继续保留运行的时间
k8s的namespace可以提供资源的逻辑隔离,但是无法提供物理隔离。物理隔离可以通过污点与容忍来做。
比如想隔离不同产品线的服务,可以提前给node打上不同的污点,不同的产品线的pod容忍对应的污点即可。
网友评论