热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何获取k8s拓扑_K8S集群调度

K8S–集群调度调度说明简介schedule是Kubernetes的调度器,主要任务是把定义的Pod分配到集群的节点上.公平:保证每个节点都能被分配资源资源高效利用:集群所有资源最
K8S–集群调度

调度说明

简介

schedule是Kubernetes的调度器, 主要任务是把定义的Pod分配到集群的节点上.

  • 公平: 保证每个节点都能被分配资源

  • 资源高效利用: 集群所有资源最大化被使用

  • 效率: 调度的性能要好, 能够尽快地对大批量的Pod完成调度任务

  • 灵活: 允许用户根据自己的需求控制调度的逻辑

Schedule是作为单独的程序运行的, 启动之后会一直监听API Server, 获取PodSpec.NodeName为空的Pod, 对每个Pod都会创建一个Binding, 表明该Pod应该放到哪个节点上

调度过程

调度分为几个部分: 1. 过滤掉不满足条件的节点, 这个过程为 predicate; 2. 对通过的节点按照优先级排序, 这个是priority; 3. 从中选择优先级最高的节点. 如果中间发生错误, 就直接返回错误

predicate有一系列算法可以使用:

  • PodFitsResources : 节点上剩余的资源是否大于Pod请求的资源

  • PodFitsHost: 如果Pod指定了NodeName, 检查节点名称是否和NodeName匹配

  • PodFitsHostPorts : 节点上已经使用的Port是否和Pod申请的port冲突

  • PodSelectorMatches : 过滤掉和Pod指定的label不匹配的节点

  • NoDiskConflict: 已经mount的Volume和Pod指定的Volume不冲突, 除非都是只读

如果在predicate过程中没有合适的节点, Pod会一直在pending状态, 不断重试调度, 直到有节点满足条件.经过这个步骤,如果有多个节点满足条件, 就继续Priority过程: 按照优先级大小对节点排序.

优先级由一系列键值对组成, 键是该优先级项的名称, 值是他的权重. 优先级选项包括:

  • leastRequestedPriority: 通过计算CPU和Memory的使用率来决定权重, 使用率越低权重越高.这个优先级指标倾向于资源使用比例更低的节点.

  • BalancedResourceAllocation: 节点上CPU和Memory使用率越接近, 权重越高. 这个应该和leastRequestedPriority一起使用, 不应该单独使用

  • ImageLocalityPriority: 倾向于已经有要使用镜像的节点, 镜像总大小值越大, 权重越高

通过算法对所有的优先级项目和权重进行计算, 得出最终的结果

自定义调度器

除了Kubernetes自带的调度器, 也可以编写自己的调度器.通过spec.schedulername参数指定调度器的名字, 可以为Pod选择某个调度器进行调度.比如下面pod选择my-scheduler进行调度,而不是默认的default-scheduler

apiVersion: v1
kind: Pod
metadata:
name: annotation-second-scheduler
labels:
name: multischeduler-example
spec:
schedulername: my-scheduler
containers:
- name: pod-with-second-annotation-container
image: gcr.io/google_containers/pause:2.0

调度亲和性

Node亲和性

pod.spec.nodeAffinity

  • preferredDuringSchedulingIgnoredDuringExecution: 软策略

  • requiredDuringSchedulingIgnoredDuringExecution: 硬策略

requiredDuringSchedulingIgnoredDuringExecution

apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-addinity-pod
spec:
containers:
- name: with-node-affinity
image: busybox
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- xuh04
- k8s-node02

operator: NotIn 表示不会在values节点上创建pod:

dd507237d6c29e5d7eee37fcaf099657.png

将operator: NotIn修改为operator: In values设为04, 每次删除创建,都会创建在values对应节点上

bf889184b2a108eb25700daec4ab42d4.png

preferredDuringSchedulingIgnoredDuringExecution:

apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-addinity-pod
spec:
containers:
- name: with-node-affinity
image: busybox
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 # 权重, 越大越亲和
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- xuh02

结合使用

apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-addinity-pod
spec:
containers:
- name: with-node-affinity
image: busybox
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- xuh04
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 # 权重, 越大越亲和
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- xuh03

键值运算关系

  • In : label的值在某个列表中

  • NotIn: 不在某个列表中

  • Gt: 大于

  • Lt: 小于

  • Exists: 某个label存在

  • DoesNotExist: 某个label不存在

Pod亲和性

pod.spec.affinity.podAffinity/podAntiAffinity

  • preferredDuringSchedulingIgnoredDuringExecution: 软策略

  • requiredDuringSchedulingIgnoredDuringExecution: 硬策略

apiVersion: v1
kind: Pod
metadata:
name: pod-3
labels:
app: pod-3
spec:
containers:
- name: pod-3
image: busybox
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- pod-1
topologyKey: kubernetes.io/hostname
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 # 权重, 越大越亲和
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- pod-1
topologyKey: kubernetes.io/hostname

75a0fd7b79a975d2077eddc32f30d42b.png

亲和性/反亲和性调度策略比较

调度策略匹配标签操作符拓扑域支持调度目标
nodeAffinity主机In, NotIn, Exists, DoesNotExists, Gt, Lt指定主机
podAffinityPodIn, NotIn, Exists, DoesNotExistsPod与指定Pod同一拓扑域
podAntiAffinityPodIn, NotIn, Exists, DoesNotExistsPod与指定Pod同一拓扑域

污点与容忍

Taint和Toleration

节点亲和性, 是Pod的一种属性(偏好或硬性要求), 他使Pod被吸引到一类特定的节点. Taint则相反, 他使节点能够排斥一类特定的Pod

Taint和toleration相互配合, 可以用来避免Pod被分配到不合适的节点上. 每个节点上都可以应用一个或多个taint, 这表示对于那些不能容忍这些Taint的Pod, 是不会被该节点接受的. 如果将toleration应用于Pod上, 表示这些Pod可以(但不要求)被调度到具有匹配taint的节点上

污点(Taint)

  1. 污点(taint)的组成

    使用kubectl taint命令可以给某个Node节点设置污点, Node被设置上污点之后就和Pod之间存在了一种相斥的关系, 可以让Node拒绝Pod的调度执行, 甚至将Node已经存在的Pod驱逐出去

    每个污点的组成如下:

    key=value:effect

    每个污点有一个key和value作为污点的标签, 其中value可以为空, effect描述污点的作用. 当前taint effect支持下列三种选项:

  • NoSchedule k8s将不会将Pod调度到具有该污点的Node上

  • PreferNoSchedule: k8s将尽量避免将pod调度到具有该污点的Node上

  • NoExecute: k8s不会将Pod调度到具有该污点的Node上, 同时会将Node上已经存在的Pod驱逐出去

污点的设置 查看和去除

# 设置污点
kubectl taint nodes xuh01 key1=value1:NoSchedule

# 节点说明中, 查找Taints字段
kubectl describe pod pod-name

# 去除污点
kubectl taint nodes xuh01 key1=NoSchedule-

de0b16b2e0d95d27ca7d27c0f965d0fe.png

容忍(Toleration)

设置了污点的Node将根据Taint的effect: NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系, Pod将在一定程度上不会被调度到Node上. 但我们可以在Pod上设置容忍(toleration), 意思是设置了容忍的Pod将可以容忍污点的存在, 可以被调度到存在污点的Node上

pod.spec.tolerations

tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerationSecond: 3600
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
- key: "key2"
operator: "Exists"
effect: "NoSchedule"

  • 其中key, value, effect要与Node上设置的taint保持一致

  • operator的值为Exists将会忽略value的值

  • tolerationSeconds用于描述当Pod需要被驱逐时可以在Pod上继续保留运行的时间

  1. **当不指定key值时, 表示容忍所有的污点key: **

    toleration:
    - operator: "Exists"

  2. 当不指定effect值时, 表示容忍所有的污点作用

    toleration:
    - key: "key"
    operator: "Exists"

  3. 有多个Master存在时, 防止资源浪费, 可以设置

    kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

固定节点调度

  1. pod.spec.nodeName将Pod直接调度到指定的Node节点上, 会跳过Scheduler的调度策略, 匹配规则是强制匹配

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: myweb
    spec:
    replicas: 7
    template:
    metadata:
    labels:
    app: myweb
    spec:
    nodeName: xuh03
    containers:
    - name: myweb
    image: nginx
    ports:
    - containerPort: 80

    d4b5a4155fad41f7039fc3aad65a65ca.png

  2. pod.spec.nodeSelector: 通过Kubernetes的label-selector机制选择节点, 由调度器策略匹配label, 而后调度pod到目标节点, 该匹配规则属于强制约束

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: myweb1
    spec:
    replicas: 5
    template:
    metadata:
    labels:
    app: myweb1
    spec:
    nodeSelector:
    disk: ssd
    containers:
    - name: myweb
    image: nginx
    ports:
    - containerPort: 80

    没有Node上有disk=ssd的标签, pod找不到调度的节点, 一直处于pending状态

    eaa827eb1eff48f4ced80750eeb7b93a.png

    kubectl label node xuh02 disk=ssd

    2a95ebff663236b389152ed0e08a287c.png




推荐阅读
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
author-avatar
用户r7t3govjq0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有