zoukankan      html  css  js  c++  java
  • 14、kubernetes之资源调度

    一、基本概念

    1、调度器选择节点的三步

    • 预选:先排除所以完全不符合的节点,包括资源需求、端口冲突、污点排除等
    • 优选:计算每个节点的优先级并排序,找出最佳匹配(得分最高)的节点
    • 选定:如果得分最高的节点不是一个,则随机选择一个,调度完成

    2、常用的调度预选策略

    • CheckNodeCondition:检查节点状态是否正常
    • GeneralPredicates:通用预选策略
      • HostName:检查pod.spec.hostname是否定义,并且检查节点中是否有同名的pod而冲突
      • PodFitsHostPorts :检查pod.spec.containers.ports.hostPort属性(绑定节点上的某个端口)是否定义,并且检查节点中的节点端口是否冲突
      • MatchNodeSelector:pods.spec.nodeSelector,检查节点选择器
      • PodFitsResources:检查节点是符合pod的资源需求
    • NoDiskConflict:检查Pod依赖的存储卷是否能满足需求,默认不检查
    • PodToletatesNodeTaints:pods.spec.tolerations可容忍的污点,检查Pod是否能容忍节点上的污点
    • PodToletatesNodeExecuteTaints:后期pod无法容忍节点的污点是否驱离,默认不检查
    • CheckNodelabelPresence:检查节点的标签的存在性
    • CheckServiceAffinity:根据Pod所属的service,将相同所属的service尽可能放在同一个节点,默认不检查
    • CheckVolumeBinging:检查符合的vpc
    • NoVolumeZoneConflict:检查存储卷区域
    • CheckNodeMemoryPressure:检查节点内存是否存在压力
    • CheckNodePODPressure:检查节点PID数量是否存在压力
    • CheckNodeDiskPressure:检查节点磁盘IO是否存在压力
    • MatchInterPodAffinity:检查节点是否能满足Pod的亲和性

    3、优选函数

    • LeastRequested:节点的资源空闲率高的优选

    • MostRequested:与LeastRequested相反,尽可能将一个节点使用完

    • BalanceResourceAllocation:CPU和内存资源被占用相近的优选

    • NodePreferAvoidPods:根据节点注解判断(scheduler.alpha.kubernetes.io/preferAvoidPods),节点倾向性得分高的优选

    • TaintToleration:将Pod对象的spec.tolerations列表项与节点的taints列表项进行匹配度检查,匹配的越多越优先

    • SeletorSpreading:检查标签选择器选择的节点被分布的少的,目的是尽可能将从属于一个标签选择器的节点散开

    • InterPodAffinity:遍历Pod亲和性,匹配亲和性越高越优选

    • NodeAffinity:节点亲和性

    • NodeLabel:根据节点是否拥有特定标签,存在则得分

    • ImageLoclity:根据节点本地拥有Pod所使用的镜像大小来计算得分

    二、调度配置清单示例

    1、nodeSelector:节点选择器

    # kubectl label nodes node01 disktype=ssd
    # kubectl label nodes node02 disktype=harddisk
    # kubectl get nodes --show-labels
    # vim pod-demo-ssd.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo-ssd
      namespace: default
      labels:
        app: myapp
        tier: frontend
      annotations:
        dongfei.tech/created-by: "cluster admin"
    spec:
      containers:
      - name: myapp
        image: dongfeimg/myapp:v1
        imagePullPolicy: IfNotPresent
      nodeSelector:  #节点选择器
        disktype: ssd  #调度到拥有disktype=ssd的标签的node上
    

    2、nodeaffinity:节点亲和性

    # kubectl label nodes master zone=Beijing   
    # kubectl label nodes node01 zone=Shanghai
    # kubectl label nodes node02 zone=Guangzhou
    # cat pod-demo-nodeaffinity.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo-nodeaffinity
      namespace: default
      labels:
        app: myapp
        tier: frontend
      annotations:
        dongfei.tech/created-by: "cluster admin"
    spec:
      containers:
      - name: myapp
        image: dongfeimg/myapp:v1
        imagePullPolicy: IfNotPresent
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:  #硬亲和
            nodeSelectorTerms:
            - matchExpressions:  #选择zone在Beijing或Shanghai
              - key: zone
                operator: In
                values:
                - Beijing
                - Shanghai
    

    3、podaffinity:pod亲和性

    # cat pod-demo-podaffinity.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo-podaffinity-1
      namespace: default
      labels:
        app: myapp
        tier: frontend
      annotations:
        dongfei.tech/created-by: "cluster admin"
    spec:
      containers:
      - name: myapp
        image: dongfeimg/myapp:v1
        imagePullPolicy: IfNotPresent
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo-podaffinity-2
      namespace: default
      labels:
        app: db
        tier: backend
      annotations:
        dongfei.tech/created-by: "cluster admin"
    spec:
      containers:
      - name: busybox
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        command: ["sh","-c","sleep 3600"]
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - {key: app, operator: In, values: ["myapp"]}
            topologyKey: kubernetes.io/hostname
    

    4、taints:节点污点

    • taints
      • effect:容忍度
        • NoSchedule:不能容忍则不能调度过来,只影响调度过程,对现存pod无影响
        • PreferNoSchedule:不能容忍则尽量不要调度过来
        • NoExecute:不能容忍则不能调度过来,既影响调度过程,也影响现存pod
    # kubectl taint node node01 node-type=production:NoSchedule  #打污点
    # kubectl describe node node01 |grep Taints
    
    # cat deploy-damo.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-deploy
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: myapp
          release: canary
      template:
        metadata:
          labels:
            app: myapp
            release: canary
        spec:
          containers:
          - name: myapp-container
            image: dongfeimg/myapp:v2
            ports:
            - name: http
              containerPort: 80
          tolerations:
          - key: "node-type"
            operator: "Equal"  #完全相同
            value: "production"
            effect: "NoSchedule"
    
  • 相关阅读:
    Class类与Java反射《java从入门到精通》第十六章
    maven配置,Java环境变量配置,电脑系统重装之后需要环境配置(大概每年都要一次重装系统)
    Docker部分--尚硅谷2020微服务分布式电商项目《谷粒商城》(没给学习文档,在这做笔记)
    centOS7下载安装(阿里云镜像下载,速度10M/s),(好用免费的工具VirtualBox,FinalShell比xshell更舒服)
    从程序员到项目经理:为什么要当项目经理
    状态图(Statechart Diagram)
    ServiceLoader实现原理
    Java8 lambda表达式10个示例
    Java8函数之旅(四) --四大函数接口
    Java8特性详解 lambda表达式 Stream
  • 原文地址:https://www.cnblogs.com/L-dongf/p/12327401.html
Copyright © 2011-2022 走看看