跳转至

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

删除标签

只需在命令行最后指定Labelkey名并与一个-减号相连:

# 注意 - 减号
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

  • 必须满足指定的规则才可以调度PodNode上,相当于硬限制

PreferredDuringSchedulinglgnoredDuringExecution

  • 强调优先满足指定规则,调度器会尝试调度PodNode上但并不强求,相当于软限制
  • 多个优先级规则还可以设置权重(weight)值,以定义执行的先后顺序。

其中的 IgnoredDuringExecution 字段表示:

  • 如果Pod所在的节点标签在运行期间发生了变更,不再符合该Pod的节点亲和性需求。
  • 则系统将忽略节点上Label的变化,该Pod能继续在该节点运行。

nodeSelectorTerm

nodeSelectorTerm用于定义节点选择器条目:

  • 其值为对象列表。
  • 它由一个或多个matchExpressions对象定义的匹配规则组成。
  • 多个规则彼此之间为逻辑与的关系,

matchExmpressions

matchExmpressions 由一到多个标签选择器组成,多个标签选择器彼此间为逻辑与的关系。

操作符

标签选择器表达式中支持使用操作符如下:

  • In:label的值在某个列表中。
  • NotIn:label的值不在某个列表中。
  • Gt:label的值大于某个值。
  • Lt:label的值小于某个值。
  • Exists:某个label存在。
  • DoesNotExist:某个label不存在。

参考

回到页面顶部