Kubernetes 节点标签和定向调度
2020-06-15 by dongnan
开始之前
默认情况下Pod
调度到k8s
集群那个节点上我们是无法知道的,这一过程由Master
上的kube-Scheduler
服务负责,
但是某些场景下我们需要将Pod
调度到指定的节点上,例如这些节点带有GPU
硬件、或者这些节点有高速IOPS
磁盘、或者这些节点拥有专用的网络等等。
这时我们可以通过为这些特殊节点赋予一些标签(Label
),然后通过 NodeSelector
或者 NodeAffinity
标签选择器为Pod
进行定向的调度。
环境
测试的k8s
集群由一个Master
管理节点、两个Worker
计算节点组成,详细请参考这里。
标签
查看标签
kubectl get node --show-labels
创建标签
kubectl label nodes host1 failure-domain.k8s.io/zone=zoneA
修改标签
修改一个Label
的值,需要加上--overwrite
参数:
kubectl label --overwrite nodes host1 failure-domain.k8s.io/zone=zoneA
删除标签
只需在命令行最后指定Label
的key
名并与一个-
减号相连:
# 注意 - 减号
kubectl label nodes host1 failure-domain.k8s.io/zone-
举个栗子
例如某个项目需要使用VPN
网络完成业务数据同步,出于安全性的需要只为部分节点设置了IPSec
路由信息,
所以希望该项目的Pod
调度到带有tunnel=ipsec
标签的节点之上。
准备标签
以host5
节点为例:
kubectl label nodes host5 tunnel=ipsec
调度Pod
这里的Pod
使用 Deployment
创建和管理:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: affinity-demo
labels:
app: affinity-demo
spec:
replicas: 1
selector:
matchLabels:
app: affinity-demo
template:
metadata:
labels:
app: affinity-demo
spec:
affinity: # 开始
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: tunnel # 这里
operator: In
values:
- ipsec # 这里
containers:
- name: affinity-demo
image: hub.xyc.com/online/affinity-demo:0.0.1
ports:
- containerPort: 80
env: # environment
- name: logtail
value: 'true'
这里的 NodeAffinity 规则表示,Pod
必须在带有tunnel=ipsec
标签的节点上运行。
NodeAffinity
两种方式
NodeAffinity 目前有两种节点亲和性表达:
RequiredDuringSchedulinglgnoredDuringExecution
:
- 必须满足指定的规则才可以调度
Pod
到Node
上,相当于硬限制。
PreferredDuringSchedulinglgnoredDuringExecution
:
- 强调优先满足指定规则,调度器会尝试调度
Pod
到Node
上但并不强求,相当于软限制。 - 多个优先级规则还可以设置权重(weight)值,以定义执行的先后顺序。
其中的 IgnoredDuringExecution
字段表示:
- 如果
Pod
所在的节点标签在运行期间发生了变更,不再符合该Pod
的节点亲和性需求。 - 则系统将忽略节点上
Label
的变化,该Pod
能继续在该节点运行。
nodeSelectorTerm
nodeSelectorTerm
用于定义节点选择器条目:
- 其值为对象列表。
- 它由一个或多个
matchExpressions
对象定义的匹配规则组成。 - 多个规则彼此之间为逻辑与的关系,
matchExmpressions
matchExmpressions
由一到多个标签选择器组成,多个标签选择器彼此间为逻辑与的关系。
操作符
标签选择器表达式中支持使用操作符如下:
In
:label的值在某个列表中。NotIn
:label的值不在某个列表中。Gt
:label的值大于某个值。Lt
:label的值小于某个值。Exists
:某个label存在。DoesNotExist
:某个label不存在。