kubernetes 高级调度策略

1、选择节点(nodeSelector)

nodeSelector是目前最为简单的一种pod运行时调度限制,目前在Kubernetes1.7.x及以下版本可用。Pod.spec.nodeSelector通过kubernetes的label-selector机制选择节点,由调度器调度策略匹配label,而后调度pod到目标节点,该匹配规则属于强制约束。

kubectl label node node1 disktype=ssd

apiVersion: v1

kind: Pod

metadata:

name: nginx

labels:

env: test

spec:

containers:- name: nginx

image: nginx

imagePullPolicy: IfNotPresent

nodeSelector:

disktype: ssd

给node节点设置label,然后在pod 启动yaml文件中通过nodeSelector选择标签选择对应label即可。

2、亲和性(Affinity)与非亲和性(anti-affinity)

前面提及的nodeSelector,其仅以一种非常简单的方式、即label强制限制pod调度到指定节点。而亲和性(Affinity)与非亲和性(anti-affinity)则更加灵活的指定pod调度到预期节点上,相比nodeSelector,Affinity与anti-affinity优势体现在:

(1)、表述语法更加多样化,不再仅受限于强制约束与匹配。

(2)、调度规则不再是强制约束(hard),取而代之的是软限(soft)或偏好(preference)。

(3)、指定pod可以和哪些pod部署在同一个/不同拓扑结构下。

亲和性主要分为3种类型:node affinity与inter-pod affinity/anti-affinity,下文会进行详细说明。

节点亲和性(Node affinity)

Node affinity在Kubernetes 1.2做为alpha引入,其涵盖了nodeSelector功能,主要分为requiredDuringSchedulingIgnoredDuringExecution 与 preferredDuringSchedulingIgnoredDuringExecution2种类型。前者可认为一种强制限制,如果 Node 的标签发生了变化导致其没有符合 Pod 的调度要求节点,那么pod调度就会失败。而后者可认为理解为软限或偏好,同样如果 Node 的标签发生了变化导致其不再符合 pod 的调度要求,pod 依然会调度运行。

$ kubectl label nodes node1 cpu=high

node "node1" labeled

$  kubectl label nodes node1 cpu=mid

node "node1" labeled

$  kubectl label nodes node1 cpu=low

node "node1" labeled

apiVersion: v1

kind: Pod

metadata:

name: nginx

labels:

env: test

spec:

affinity:

nodeAffinity:

  requiredDuringSchedulingIgnoredDuringExecution:

    nodeSelectorTerms:

    - matchExpressions:

      - key: role

        operator: NotIn

        values:

        - master

  preferredDuringSchedulingIgnoredDuringExecution:

  - weight: 1

    preference:

      matchExpressions:

      - key: cpu

        operator: In

        values:

        - high

containers:- name: nginx

image: nginx

imagePullPolicy: IfNotPresent

pod亲和性(Inter-pod affinity)与反亲和性(anti-affinity)

inter-pod affinity与anti-affinity由Kubernetes 1.4引入,当前处于beta阶段,其中podAffinity用于调度pod可以和哪些pod部署在同一拓扑结构之下。而podAntiAffinity相反,其用于规定pod不可以和哪些pod部署在同一拓扑结构下。通过pod affinity与anti-affinity来解决pod和pod之间的关系。

与Node affinity类似,pod affinity与anti-affinity同样分为requiredDuringSchedulingIgnoredDuringExecution and preferredDuringSchedulingIgnoredDuringExecution等2种类型,前者被认为是强制约束,而后者后者可认为理解软限(soft)或偏好(preference)。

spec:

replicas: 1template:

metadata:

  labels:

    app: is

spec:

  affinity:

    podAffinity:

      requiredDuringSchedulingIgnoredDuringExecution:

      - labelSelector:

          matchExpressions:

          - key: app

            operator: NotIn

            values:

            - solr                                --不亲和pod  solr,不处于同一台机器

        topologyKey: kubernetes.io/hostname

    podAntiAffinity:

      preferredDuringSchedulingIgnoredDuringExecution:

      - weight: 1

        podAffinityTerm:

          labelSelector:

            matchExpressions:

            - key: app

              operator: In

              values:

              - oltp                            --亲和pod oltp,会处于同一台机器

         topologyKey: beta.kubernetes.io/os

3、污点(Taints)与容忍(tolerations)

对于Node affinity,无论是强制约束(hard)或偏好(preference)方式,都是调度pod到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taints ,除非 Pod也被标识为可以耐受污点节点,否则该Taints节点不会被调度pod。Taints与tolerations当前处于beta阶段。

Taints节点应用场景比如用户希望把Kubernetes Master节点保留给 Kubernetes 系统组件使用,或者把一组具有特殊资源预留给某些 pod。pod不会再被调度到taint标记过的节点。

#应用场景:

(1)、针对拥有特定资源的节点,允许对资源有特殊要求的pod在上面运行

(2)、针对不同环境进行区分,比如,将node1、node2分配给部分1或者项目1。将node3、node4分配给其他部门或者其他项目

#给node1节点设置污点

kubectl taint node node1 node-type=production:NoSchedule

node/node1 tainted

#去除污点

kubectl taint nodes node_name key:[effect]-    #(这里的key不用指定value)

kubectl taint node node1 node-type:NoSchedule-

#describe node1节点可以发现如下配置

tolerations:

- key: "key"

operator: "Equal"

value: "value"

effect: "NoSchedule"

#创建污点之后,对于已经处于运行中的pod是没有任何影响的,但是对与新创建的pod如果没有设置容忍则无法在对应节点上创建pod

#修改部署yaml,添加容忍相关配置(在containers同级部分添加如下标红配置),只有配置容忍的pod才能被成功调度到设置污点的节点

    spec:

      tolerations:

      - key: node-type

        operator: Equal

        value: production

        effect: NoSchedule

      containers:

        - name: nginx

          image: nginx:latest

          imagePullPolicy: Never

          ports:

            - containerPort: 80

#有污点无容忍不可以创建pod,有容忍无污点可以创建pod,两种情况对已经创建的pod都无影响。

effect 共有三个可选项,可按实际需求进行设置:

(1)、NoSchedule:pod不会被调度到标记为taints节点。

(2)、PreferNoSchedule:NoSchedule的“preference”或“soft”版本。

(3)、NoExecute:该选项意味着一旦Taint 生效,如该节点内正在运行的 Pod 没有对应 Tolerate 设置,会直接被逐出。

更多内容请关注我的知乎账号:https://www.zhihu.com/people/dengjiabo/activities

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Kubernetes Scheduling Kubernetes作为一个容器编排调度引擎,资源调度是它的最基本也是...
    SetZero阅读 2,302评论 0 1
  • Label Label是附着到object上(例如Pod)的键值对。可以在创建object的时候指定,也可以在ob...
    陈靖_7314阅读 3,893评论 0 3
  • 1、基础架构 1.1 Master Master节点上面主要由四个模块组成:APIServer、scheduler...
    阿斯蒂芬2阅读 10,845评论 0 44
  • Assigning Pods to Nodes 可以限制Pods在特定节点上运行,也可以优先调度到特定节点。有几种...
    iCaptain阅读 11,666评论 0 11
  • 短信风波 刘家云 大年初一,拜年微信响爆了手机。来而无往非礼也。人家给你拜年,是看得起你,你就得回复。即便人家是群...
    劝人为仁阅读 188评论 0 0