首页 > 其他分享 >【 云原生 | kubernetes】- 资源调度

【 云原生 | kubernetes】- 资源调度

时间:2022-10-10 10:33:41浏览次数:75  
标签:原生 Node kubernetes 调度 io Pod 节点

kubernetes.png 调度 是指将 Pod 放置到合适的 Node 上,然后对应 Node 上的 Kubelet 才能够运行这些 pod。

调度概览

调度器通过 kubernetes 的监测(Watch)机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。 调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 调度器会依据下文的调度原则来做出调度选择。

kube-scheduler调度流程

kube-scheduler 给一个 pod 做调度选择包含两个步骤:

  1. 过滤
  2. 打分

过滤阶段会将所有满足 Pod 调度需求的 Node 选出来。

打分阶段,调度器会为 Pod 从所有可调度节点打分选取一个最合适的 Node。

NodeSelector定向调度

NodeSelector:是一个供用户将 Pod 与 Node 进行绑定的字段.

apiVersion: v1
kind: Pod
...
spec:
 nodeSelector:
   disktype: ssd

指明Pod永远只能运行在携带“disktype: ssd”标签的节点上;否则会调度失败

Kubernetes内置的节点标签

除了你给Node(节点)添加标签外,Kubernetes也会给Node预设义一些标签,包括:

Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    edgenode=true
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=ycloud
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/control-plane=
                    node-role.kubernetes.io/master=
                    node.kubernetes.io/exclude-from-external-load-balancers=

注意:这些标签的值是特定于云提供商的,不保证是可靠的。例如,kubernetes.io/hostname的值可能与某些环境中的节点名称相同,而在其他环境中就不同了。

nodeName调度

nodeName是最简单的节点选择约束方式,我常常用它来将pod直接指定到某台节点上,进行测试。

<!--注意:如果它不为空,则调度程序不会在调度这个pod了,并且在命名节点上运行的kubelet尝试运行该pod。因此,如果在PodSpec中提供nodeName,则它将优先于其他的约束。-->

apiVersion: v1
kind: Pod
...
spec:
 nodeName: ycloud

该pod将运行在名为ycloud的节点上了

Node Affinity

用节点亲和性把 Pods 分配到节点

依据强制的节点亲和性调度 Pod

下面清单描述了一个 Pod,它有一个节点亲和性配置 requiredDuringSchedulingIgnoredDuringExecutiondisktype=ssd。 这意味着 pod 只会被调度到具有 disktype=ssd 标签的节点上。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd            
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

使用首选的节点亲和性调度 Pod

本清单描述了一个Pod,它有一个节点亲和性设置 preferredDuringSchedulingIgnoredDuringExecutiondisktype: ssd。 这意味着 pod 将首选具有 disktype=ssd 标签的节点。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd          
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

Taint和Toleration(污点和容忍)

节点亲和性是pod的一种属性(优先选择或硬性要求),它使 pod 被优先分配到一类特定的节点上。而Taint则相反,它使节点能够排斥一类特定的 pod。

使用kubectl taint给节点增加一个污点

[root@ycloud ~]# kubectl taint nodes ycloud app=test:NoSchedule
node/ycloud tainted
若要移除这个污点
[root@ycloud ~]# kubectl taint nodes ycloud app=test:NoSchedule-
node/ycloud untainted

你可以在 Pod 规约中为 Pod 设置容忍度。 下面两个容忍度均与上面例子中使用 kubectl taint 命令创建的污点相匹配, 因此如果一个 Pod 拥有其中的任何一个容忍度,都能够被调度到 node

tolerations:
- key: "app"
  operator: "Equal"
  value: "test"
  effect: "NoSchedule"
tolerations:
- key: "app"
  operator: "Exists"
  effect: "NoSchedule"

例子:

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

operator 的默认值是 Equal

一个容忍度和一个污点相“匹配”是指它们有一样的键名和效果,并且:

  • 如果 operatorExists (此时容忍度不能指定 value),或者
  • 如果 operatorEqual ,则它们的 value 应该相等

参考文献

https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/kube-scheduler/

https://kuboard.cn/learning/k8s-advanced/schedule/#filtering

标签:原生,Node,kubernetes,调度,io,Pod,节点
From: https://blog.51cto.com/ycloud/5740929

相关文章

  • linux进程管理和调度(一)
    内核和处理器建立了多任务的错觉,即可以并行做几种操作,这是通过以很短的间隔在系统运行的应用程序之间不停切换而做到的。由于切换间隔如此之短,使得用户无法注意到短时间内......
  • 云原生数字化转型与金融信创建设,鱼和熊掌可兼得
    2022年9月17日上午,2022第五届双态IT乌镇用户大会顺利召开。本次峰会由ITSS分会、银保信科技(北京)有限公司、 证券基金行业信息技术应用创新联盟指导,ITSS数据中心......
  • 乘风破浪,遇见云原生(Cloud Native)之Docker安装运行Nacos,更易于构建云原生应用的动态
    什么是Nacoshttps://nacos.iohttps://github.com/alibaba/nacosNacos通过提供简单易用的动态服务发现、服务配置、服务共享与管理等服务基础设施,帮助用户在云原生......
  • 分布式定时任务调度框架实践
    分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种......
  • jpa 原生SQL写法
    jpa原生SQL写法当你的抽象类继承了JpaRepository类时,就会拥有一些基本的增删改查操作。但是,很多时候只有这些简单的功能是不够的的,jpa也支持原生SQL和实体类SQL进行自定......
  • kubernetes Tcp流量可视化
    kubernetesTcp流量可视化使用k8spacket和grafana的nodegraph插件可以查看kubernetespod的TCP相关信息,如connection、bytes、和duration。下面是接收和响应的字节数信息......
  • java原生发送http请求
    根据技术选型总结常见的三种方式发送http请求,本问介绍jdk原生方式,其他两种如下链接​​httpclient和okhttp​​​​Springboot整合RestTemplate发送http请求​​使用JDK原生......
  • Kubernetes14-Helm:Kubernetes应用包管理
    1、Helm概述1.1、Helm介绍随着容器技术逐渐被企业接受,在Kubernetes上已经能便捷地部署简单的应用了。但对于复杂的应用中间件,在Kubernetes上进行容器化部署并非易事,通常......
  • Docker Desktop 可以直接启用Kubernetes 1.25 了
    作为目前事实上的容器编排系统标准,K8s无疑是现代云原生应用的基石,很多同学入门可能直接就被卡到第一关,从哪去弄个K8s的环境,DockerDesktop自带了Kubernetes服务,但是在......
  • leetcode-621. 任务调度器
    621.任务调度器假设有任务["A","A","A","B","B","B"],n=2,可以画图表示CPU的时间分配MT表示maxTime,这个任务列表中出现次数最大的任务数量,这里就是MT=3MC表示maxCou......