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不存在。