Kubernetes之pod的调度、抢占、驱逐

文章目录


一、kube-scheduler

就是一个调度pod的一个组件 具体步骤有两个过滤、打分
调度策略 允许你配置过滤所用的 断言(Predicates) 和打分所用的 优先级(Priorities)。
调度配置 允许你配置实现不同调度阶段的插件, 包括:QueueSort、Filter、Score、Bind、Reserve、Permit 等等。 你也可以配置 kube-scheduler 运行不同的配置文件.

二、节点的调度

分析下面例子

apiVersion: v1
kind: Pod
metadata:
  name: pod-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:  #设置强亲和 
        nodeSelectorTerms:
        - matchExpressions:
          - key: giant
            operator: In #operator的选项有 NotIn In Exists DoesNotExsit Gt Lt
            values:
            - fox
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1  #权重 当强亲和没有相对于的标签时 软亲和力就上场了 weight表示pod在此标签下分配的比例,例如weight 1和weight 2 比例就为1:2
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value  #写法类似
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 20
        preference:
          matchExpressions:
          - key: xiao
            operator: In
            values:
            - mei
  containers:
  - name: nignx
    image: nginx:latest
    imagePullPolicy: IfNotPresent

我们也可以采用一个比较直接的方式 nodeselector

nodeSelector 是节点选择约束的最简单推荐形式。你可以将 nodeSelector 字段添加到 Pod 的规约中设置你希望目标节点所具有的节点标签。 Kubernetes 只会将 Pod 调度到拥有你所指定的每个标签的节点上。
亲和性与反亲和性节点亲和性功能类似于 nodeSelector 字段,但它的表达能力更强,并且允许你指定软规则。
Pod 间亲和性/反亲和性允许你根据其他 Pod 的标签来约束 Pod。

apiVersion: v1
kind: Pod
metadata:
  name: pod-sele
spec:
  nodeSelector:
    giant: fox
  containers:
  - name: nginx
    image: nginx:latest

 # 注意 在我们使用nodeselector或者节点亲和性时 确保节点存在对应的标签

kubectl label node name giant=fox

即给XXX打上giant: fox的标签

说明:

如果你同时指定了 nodeSelector 和 nodeAffinity两者 必须都要满足, 才能将 Pod 调度到候选节点上。

如果你指定了多个与 nodeAffinity 类型关联的 nodeSelectorTerms, 只要其中一个 nodeSelectorTerms 满足的话,Pod 就可以被调度到节点上。

如果你指定了多个与同一 nodeSelectorTerms 关联的 matchExpressions, 则只有当所有 matchExpressions 都满足时 Pod 才可以被调度到节点上。

 Pod 间亲和性与反亲和性

同样观察下面实例

piVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          topologyKey: topology.kubernetes.io/zone
  containers:
  - name: with-pod-affinity
    image: registry.k8s.io/pause:2.0

本示例定义了一条 Pod 亲和性规则和一条 Pod 反亲和性规则。Pod 亲和性规则配置为 requiredDuringSchedulingIgnoredDuringExecution,而 Pod 反亲和性配置为 preferredDuringSchedulingIgnoredDuringExecution

亲和性规则表示,仅当节点和至少一个已运行且有 security=S1 的标签的 Pod 处于同一区域时,才可以将该 Pod 调度到节点上。 更确切的说,调度器必须将 Pod 调度到具有 topology.kubernetes.io/zone=V 标签的节点上,并且集群中至少有一个位于该可用区的节点上运行着带有 security=S1 标签的 Pod。

反亲和性规则表示,如果节点处于 Pod 所在的同一可用区且至少一个 Pod 具有 security=S2 标签,则该 Pod 不应被调度到该节点上。 更确切地说, 如果同一可用区中存在其他运行着带有 security=S2 标签的 Pod 节点, 并且节点具有标签 topology.kubernetes.io/zone=R,Pod 不能被调度到该节点上。

 名字空间选择算符

用户也可以使用  namespaceSelector 选择匹配的名字空间, namespaceSelector 是对名字空间集合进行标签查询的机制。 亲和性条件会应用到  namespaceSelector 所选择的名字空间和  namespaces 字段中所列举的名字空间之上。 注意,空的  namespaceSelector{})会匹配所有名字空间,而 null 或者空的  namespaces 列表以及 null 值  namespaceSelector 意味着“当前 Pod 的名字空间”

 节点的污点和容忍度

节点亲和性 是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点 (这可能出于一种偏好,也可能是硬性要求)。 污点(Taint) 则相反——它使节点能够排斥一类特定的 Pod。

容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数

污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod, 是不会被该节点接受的

kubectl taint nodes node1 key1=value1:NoSchedule 给node打上污点

kubectl taint nodes node1 key1=value1:NoSchedule- 移除污点

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
给pod设置tolerations容忍度 只有容忍度与污点相匹配才能调度

 apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "example-key"
    operator: "Exists"
    effect: "NoSchedule"

# 当operator使用exists时 不能写入values 当operator为Equal 则他们的value应该相等

如果一个容忍度的key为空且operator为exists 表示这个容忍度与任意的key value effect都匹配 就是这个容忍度能容忍任何污点

上述例子中 effect 使用的值为 NoSchedule,你也可以使用另外一个值 PreferNoSchedule。 这是“优化”或“软”版本的 NoSchedule —— 系统会 尽量 避免将 Pod 调度到存在其不能容忍污点的节点上, 但这不是强制的。effect 的值还可以设置为 NoExecute

结语:

云计算 kubernetes的学习日志,详细文献可以查阅kubernetes的官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值