qq群引流推广网站,网络运维面试题,科技特长生,松江网站开发提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、调度流程二、kuble-scheduler 调度原理1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析2 修改调度器插件默认权重示例2.1 环境准备2.2 调整Inte… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言一、调度流程二、kuble-scheduler 调度原理1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析2 修改调度器插件默认权重示例2.1 环境准备2.2 调整InterPodAffinity权重使工作负载test调度至节点k8s-00022.3 调整NodeAffinity权重使工作负载test调度至节点k8s-0001 前言
kube-scheduler作为 K8s 集群的默认调度器它监听watch机制kube-apiserver查询还未调度的 pod根据调度策略将 pod 调度至集群内最适合的Node。 提示以下是本篇文章正文内容下面案例可供参考
一、调度流程
首先我们通过 API 或者 kubectl 工具创建 podkube-apiserver 收到请求信息存储到 etcd 中调度器通过 watch 机制监听 apiserver 查看到还未被调度的 pod 列表循环遍历的为每个 pod 尝试分配 node这个分配过程如下
kube-scheduler 内 Informer 组件 list-watch apiserver使用spec.nodeName筛选出还未调度的 Pod预选predicate调度器通过 Predicate 算法过滤掉不满足条件的节点优选priorlty对于通过预选的节点通过打分机制筛选出得分最高的node当调度器为 Pod 选择了一个合适的节点后将 Pod 和节点进行绑定将节点名称赋值给 pod 的 spec.nodeName 字段 注意Pod.spec.nodeName 用于强制约束将 Pod 调度到指定的 Node上通过指定 nodeName 可直接绕过调度器并不会做任何的资源过滤和检查。
二、kuble-scheduler 调度原理
Kube-scheduler 的调度框架在 Kubernetes 里面叫作 Scheduler Framework。Pod 在调度过程中都需要依次经过以下的各个阶段每个阶段自带调度算法调度算法由插件提供也可以在指定阶段开发自己的插件。每个插件可以在指定阶段实现具体的调度算法比如 NodeAffinity 插件在 Filter 阶段过滤掉与 Pod 不亲和的节点。
PreFilter预处理 Pod 的相关信息或者检查集群或 Pod 必须满足的某些条件。如果 PreFilter 插件返回错误则调度周期将终止Filter: 过滤出不能运行该 Pod 的节点。对于每个节点调度器将按照其配置顺序调用这些过滤插件。如果任何过滤插件将节点标记为不可行则节点直接排除不会为该节点调用剩下的过滤插件PostFilter: 在 Filter 阶段后调用但仅在该 Pod 没有可行的节点时调用。典型的后筛选实现是抢占试图通过抢占其他 Pod 的资源使该 Pod 可以调度PreScore: 运行评分任务以生成可评分插件的共享状态如果 PreScore 插件返回错误则调度周期将终止Score: 通过调用每个评分插件对可调度节点评分NormalizeScore: 规范每个插件的打分在[0100]之间Reserve: 在绑定周期之前选择保留的节点Permit: 批准或拒绝 pod 调度周期的结果PreBind: 用于执行 Pod 绑定前所需的任何工作。例如一个预绑定插件可能需要提供网络卷并且在允许 Pod 运行在该节点之前 将其挂载到目标节点上Bind: 用于将 Pod 绑定到节点上。直到所有的 PreBind 插件都完成Bind 插件才会被调用PostBind: 这是个信息性的扩展点。绑定后插件在 Pod 成功绑定后被调用。这是绑定周期的结尾可用于清理相关的资源
调度器预选阶段对应filter主要用于过滤不满足 Pod 调度条件的节点优选阶段对应 score主要用于为每个节点打分节点分数插件打分*插件权重然后排序选出分数最高的节点。 1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析 2 修改调度器插件默认权重示例
2.1 环境准备
环境集群中有两个节点k8s-0001和 k8s-0002已有工作负载 nginx调度至节点 k8s-0002工作负载 testyaml 文件如下
apiVersion: apps/v1
kind: Deployment
metadata:name: test
spec:selector:matchLabels:app: testtemplate:metadata:labels:app: testspec:containers:- name: container-1image: nginx:latestdnsPolicy: ClusterFirstaffinity:nodeAffinity: #利用节点亲和使其调度至k8s-0001preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-0001podAffinity: #利用负载亲和使其调度至k8s-0002preferredDuringSchedulingIgnoredDuringExecution:- weight: 1podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- nginxnamespaces:- defaulttopologyKey: kubernetes.io/hostnam2.2 调整InterPodAffinity权重使工作负载test调度至节点k8s-0002
apiVersion: v1
kind: ConfigMap
metadata:name: scheduler-confignamespace: kube-system
data:scheduler-config.yaml: |apiVersion: kubescheduler.config.k8s.io/v1beta3 #1.23以上版本集群可用v1beta3kind: KubeSchedulerConfigurationprofiles:- schedulerName: default-scheduler plugins:score:disabled:- name: InterPodAffinity- name: NodeAffinityenabled:- name: InterPodAffinity #提高负载亲和权重weight: 100- name: NodeAffinityweight: 1查看 kube-scheduler 调度日志k8s-002 score得分为打分100 * 权重 100共得10000分调度到 k8s-002 节点上。 2.3 调整NodeAffinity权重使工作负载test调度至节点k8s-0001
apiVersion: v1
kind: ConfigMap
metadata:name: scheduler-confignamespace: kube-system
data:scheduler-config.yaml: |apiVersion: kubescheduler.config.k8s.io/v1beta3kind: KubeSchedulerConfigurationprofiles:- schedulerName: default-scheduler plugins:score:disabled:- name: InterPodAffinity- name: NodeAffinityenabled:- name: InterPodAffinityweight: 1- name: NodeAffinity #提高节点亲和权重weight: 100