K8S之Pod资源调度

文章目录

  • Pod资源调度总览
  • Label
  • Annotation
  • Taint和Toleration
    • 污点(Taints)
    • 容忍(Tolerations)
  • 亲和性
    • 节点亲和性(Node Affinity)
    • Pod 亲和性(Pod Affinity)
    • Pod 反亲和性(Pod Anti-Affinity)

Pod资源调度总览

  • API Server在接受客户端提交Pod对象创建请求后,然后是通过调度器(kube-schedule)从集群中选择一个可用的最佳节点来创建并运行Pod。

  • 而这一个创建Pod对象,在调度的过程当中有3个阶段:节点预选、节点优选、节点选定,从而筛选出最佳的节点。

    • 节点预选:基于一系列的预选规则对每个节点进行检查,将那些不符合条件的节点过滤,从而完成节点的预选
    • 节点优选:对预选出的节点进行优先级排序,以便选出最合适运行Pod对象的节点
    • 节点选定:从优先级排序结果中挑选出优先级最高的节点运行Pod,当这类节点多于1个时,则进行随机选择
  • 预选策略实际上就是节点过滤器,例如节点标签必须能够匹配到Pod资源的标签选择器(MatchNodeSelector实现的规则),以及Pod容器的资源请求量不能大于节点上剩余的可分配资源(PodFitsResource规则)等等。执行预选操作,调度器会逐一根据规则进行筛选,如果预选没能选定一个合适的节点,此时Pod会一直处于Pending状态,直到有一个可用节点完成调度。

  • 预选策略筛选出一个节点列表就会进入优选阶段,在这个过程调度器会向每个通过预选的节点传递一系列的优选函数来计算其优先级分值,优先级分值介于0-10之间,其中0表示不适用,10表示最适合托管该Pod对象。 另外,调度器还支持给每个优选函数指定一个简单的值,表示权重,进行节点优先级分值计算时,它首先将每个优选函数的计算得分乘以权重,然后再将所有优选函数的得分相加,从而得出节点的最终优先级分值。

Label

  • 标签(Label)是附加在 Kubernetes 对象上的一组键值对,其意图是按照对用户有意义的方式来标识 Kubernetes ,同时,又不对 Kubernetes 的核心逻辑产生影响。标签可以用来组织和选择一组 Kubernetes 对象。
  • 通常来讲,会有多个 Kubernetes 对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象。标签选择器是 Kubernetes 中最主要的分类和筛选手段。
  • 目的:用于标识和选择资源,它们是资源的标识符。Kubernetes 用户和系统都使用标签来组织和选择集合中的资源(例如,使用 -l 参数与 kubectl 命令一起使用)。
  • 限制:必须符合以下要求:
    • 键和值只能包含字母数字字符、连字符(-)、下划线(_)和点(.)。
    • 键必须以字母或数字开头。
    • 键的最大长度为 63 个字符,值的最大长度为 253 个字符。
  • 用途:
    • 用于资源的逻辑分组。
    • 用于资源的选择和过滤,如通过selector字段在 Pod 和 Service 之间建立连接。
    • 用于标识资源的属性,如版本、环境(开发、测试、生产)等。
# 增
kubectl label pod nginx-pod hello=world
# 删
kubectl label pod nginx-pod hello-
# 改
kubectl label pod nginx-pod hello=java --overwrite
# 查
# 选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象
kubectl get pods -l environment=production,tier=frontend

Annotation

  • 标签(Labels)主要用于识别和选择资源,它们是资源的标识符,通常用于逻辑分组和选择。

  • 注解(Annotations)主要用于存储额外的非标识性信息,这些信息不会影响资源的行为,通常用于工具集成和存储元数据。

  • 目的:用于存储非标识性的辅助信息,这些信息不会影响资源的行为。注解通常用于存储工具或系统使用的信息,如构建信息、创建时间、特殊说明等。

  • 限制:没有严格的格式要求,可以包含任何字符。

  • 用途:

    • 声明配置层管理的字段。使用 annotation 关联这类字段可以用于区分以下几种配置来源:客户端或服务器设置的默认值,自动生成的字段或自动生成的 auto-scaling 和 auto-sizing 系统配置的字段。
    • 创建信息、版本信息或镜像信息。例如时间戳、版本号、git 分支、PR 序号、镜像哈希值以及仓库地址。
    • 记录日志、监控、分析或审计存储仓库的指针
    • 可以用于 debug 的客户端(库或工具)信息,例如名称、版本和创建信息。
    • 用户信息,以及工具或系统来源信息、例如来自非 Kubernetes 生态的相关对象的 URL 信息。
    • 轻量级部署工具元数据,例如配置或检查点。
    • 负责人的电话或联系方式,或能找到相关信息的目录条目信息,例如团队网站。

Taint和Toleration

污点(Taints)

污点是定义在节点(Node)上的标记,用于让节点拒绝将 Pod 调度运行于其上,除非 Pod 有接纳节点污点的容忍度。

  • NoSchedule:带有此效应的节点不会调度新的不容忍此污点的 Pod,但不影响已经存在的 Pod。
  • PreferNoSchedule:带有此效应的节点会尽量避免调度新的不容忍此污点的 Pod,但如果没有其他选择,这些 Pod 仍然可以被调度到这些节点上。
  • NoExecute:带有此效应的节点不仅会阻止新的不容忍此污点的 Pod 调度,如果 Pod 不能容忍已存在的污点,还会将这些 Pod 从节点上驱逐出去。

容忍(Tolerations)

容忍是定义在 Pod 上的属性,用于配置 Pod 可以容忍哪些污点。只有当 Pod 具有对节点污点的容忍度时,它才有可能被调度到该节点上。每个容忍由以下几部分组成:

  • Key:污点的键,如果指定为空,则表示匹配所有污点键。
  • Operator:用于指定与污点值的比较方式,默认为 Equal。可以是 Equal 或 Exists。
  • Value:与污点的值进行匹配。
  • Effect:指定容忍的污点效果,必须与污点的效应匹配。
  • TolerationSeconds:可选字段,指定在 Pod 被驱逐前,容忍可以持续多长时间。

亲和性

节点亲和性(Node Affinity)

  • 节点亲和性用于定义 Pod 可以调度到哪些节点上。
  • 它分为两种类型:
    • 硬性规则(requiredDuringSchedulingIgnoredDuringExecution):这些规则在 Pod 调度时必须满足,如果没有任何节点满足这些条件,Pod 将不会被调度。硬性规则确保 Pod 只会被调度到满足特定标签选择器的节点上。
    • 软性规则(preferredDuringSchedulingIgnoredDuringExecution):这些规则是优选的,但不是必须的。即使没有节点满足这些条件,Pod 仍然可以被调度到其他节点上。软性规则通过权重(weight)来表达偏好的强度。

Pod 亲和性(Pod Affinity)

  • Pod 亲和性定义了 Pod 与其他 Pod 之间的关系,允许你指定 Pod 应该或不应该与具有特定标签的其他 Pod 调度在一起。
    • Pod 硬亲和性(requiredDuringSchedulingIgnoredDuringExecution):Pod 必须被调度到与选定的 Pod 在同一拓扑域(如节点、区域或区域)内的节点上。
    • Pod 软亲和性(preferredDuringSchedulingIgnoredDuringExecution):Pod 倾向于被调度到与选定的 Pod 在同一拓扑域内的节点上,但如果无法满足,Pod 仍然可以被调度到其他节点上。

Pod 反亲和性(Pod Anti-Affinity)

  • Pod 反亲和性是 Pod 亲和性的相反,它确保 Pod 不会被调度到与具有特定标签的其他 Pod 相同的拓扑域内。
    • Pod 硬反亲和性(requiredDuringSchedulingIgnoredDuringExecution):Pod 必须被调度到与选定的 Pod 不在同一拓扑域内的节点上。
    • Pod 软反亲和性(preferredDuringSchedulingIgnoredDuringExecution):Pod 倾向于被调度到与选定的 Pod 不在同一拓扑域内的节点上,但如果无法满足,Pod 仍然可以被调度到其他节点上。

你可能感兴趣的:(K8S之Pod资源调度)