其他
K8s调度策略
元旦快乐
1
调度
kube-scheduler调度器
kube-scheduler调度流程
过滤 打分
调度策略:允许你配置过滤所用的 断言(Predicates) 和打分所用的 优先级(Priorities)。 调度配置:允许你配置实现不同调度阶段的插件, 包括:QueueSort、Filter、Score、Bind、Reserve、Permit 等等。 你也可以配置 kube-scheduler 运行不同的配置文件。
2
将Pod分配给指定节点
节点标签 亲和性与反亲和性 nodeName字段 Pod拓扑分布约束 污点和容忍度
节点标签
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
给节点添加标签
”
#给指定的节点打标签
kubectl label nodes k8s-node1 key1=value1
#移除标签
kubectl label nodes k8s-node1 key1-
创建一个将被调度到你选择的节点的 Pod
”
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
key1: value1
亲和性和反亲和性
亲和性、反亲和性语言的表达能力更强。nodeSelector 只能选择拥有所有指定标签的节点,而亲和性、反亲和性为你提供对选择逻辑的更强控制能力。 你可以标明某规则是“软需求”或者“偏好”,这样调度器在无法找到匹配节点时仍然调度该 Pod。 你可以使用节点上(或其他拓扑域中)运行的其他 Pod 的标签来实施调度约束, 而不是只能使用节点本身的标签。这个能力让你能够定义规则允许哪些 Pod 可以被放置在一起。
节点亲和性功能类似于 nodeSelector 字段,但它的表达能力更强,并且允许你指定软规则。 Pod 间亲和性、反亲和性允许你根据其他 Pod 的标签来约束 Pod。
节点亲和性
”
requiredDuringSchedulingIgnoredDuringExecution: 调度器只有在规则被满足的时候才能执行调度。此功能类似于 nodeSelector, 但其语法表达能力更强。 preferredDuringSchedulingIgnoredDuringExecution: 调度器会尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod。
Pod 间亲和性与反亲和性
”
用节点亲和性把Pod分配到节点
”
#给指定的节点打标签
kubectl label nodes k8s-node1 key1=value1
apiVersion: v1
kind: Pod
metadata:
name: nginx4
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: key1
operator: In
values:
- value1
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
apiVersion: v1
kind: Pod
metadata:
name: nginx5
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: key1
operator: In
values:
- value1
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeName字段
apiVersion: v1
kind: Pod
metadata:
name: nginx2
spec:
nodeName: k8s-node2
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
Pod 拓扑分布约束
污点(Taint)和容忍度(Toleration)
给Node节点打污点
”
#查看节点信息
kubectl describe node k8s-node1
#添加污点
kubectl taint nodes k8s-node1 key1=value1:NoSchedule
#移除污点
kubectl taint nodes k8s-node1 key1=value1:NoSchedule-
在pod中定义容忍度
”
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
如果 operator 是 Exists (此时容忍度不能指定 value) 如果 operator 是 Equal ,则它们的 value 应该相等。 如果 operator 不指定,则默认为Equal。
如果effect是NoSchedule,则新的不能容忍的pod不能再调度过来,但是之前运行在node节点中的Pod不受影响。 如果effect是NoExecute,则新的不能容忍的pod不能调度过来,老的pod也会被驱逐。 如果effect是PreferNoScheduler,则表示尽量不调度到污点节点中去。
多个污点的匹配规则
”
如果未被过滤的污点中存在至少一个effect值为NoSchedule的污点, 则 Kubernetes 不会将Pod分配到该节点。 如果未被过滤的污点中不存在 effect 值为NoSchedule的污点, 但是存在 effect 值为PreferNoSchedule的污点, 则 Kubernetes 会尝试不将 Pod 分配到该节点。 如果未被过滤的污点中存在至少一个 effect 值为NoExecute 的污点, 则 Kubernetes 不会将 Pod 分配到该节点(如果 Pod 还未在节点上运行), 或者将 Pod 从该节点驱逐(如果 Pod 已经在节点上运行)。
kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:NoSchedule
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
默认情况下,只有master节点会有污点(role.kubernetes.io/master:NoSchedule),Node节点默认没有污点。这也是为什么默认情况下Pod不会被分配到master节点的原因。 当只有一个节点没污点,其他节点都有污点时,创建pod的yml文件的容忍度没匹配上所有的污点时,创建的pod节点在没有污点的节点上。 当只有一个节点没污点,其他节点都有污点时,创建pod的yml文件的容忍度匹配上污点时,创建的pod节点也在没有污点的节点上。 当所有node的节点都有污点,创建pod的yml文件的容忍度能匹配上污点时,创建的pod节点在匹配的污点的节点上。 当所有node节点都有污点,但是创建pod的yml文件的容忍度没匹配上所有的污点时,创建的pod节点的NODE这里为空。
3
给master节点分配pod
#查询k8s-master节点的Taints
kubectl describe node k8s-master | grep Taints
#取消污点
kubectl taint nodes k8s-master role.kubernetes.io/master:NoSchedule-
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
nodeName: k8s-master
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
END
参考:
将 Pod 指派给节点:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity
污点和容忍度:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity
k8s 的污点(Taint)和容忍度(Toleration):https://zhuanlan.zhihu.com/p/405348246