zoukankan      html  css  js  c++  java
  • k8s-集群调度

    k8s-集群调度

     

    一 调度器简介

    1.1 介绍

    Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上。听起来非常简单,但有很多要考虑的问题:

     

    公平:如何保证每个节点都能被分配资源资源高效利用:集群所有资源最大化被使用

    效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作

    灵活:允许用户根据自己的需求控制调度的逻辑Sheduler 是作为单独的程序运行的,启动之后会一直坚挺 API Server,获取 PodSpec.NodeName 为空的 pod,对每个 pod 都会创建一个 binding,表明该 pod 应该放到哪个节点上。

    1.2 调度过程

    调度分为几个部分:首先是过滤掉不满足条件的节点,这个过程称为 predicate ;然后对通过的节点按照优先级排序,这个是 priority ;最后从中选择优先级最高的节点。如果中间任何一步骤有错误,就直接返回错误,如果在 predicate 过程中没有合适的节点,pod 会一直在 pending 状态,不断重试调度,直到有节点满足条件。

    经过这个步骤,如果有多个节点满足条件,就继续 priorities 过程: 按照优先级大小对节点排序

    二 节点亲和性

    • pod.spec.nodeAffinity:

    preferredDuringSchedulingIgnoredDuringExecution:软策略

    requiredDuringSchedulingIgnoredDuringExecution:硬策略(必须满足)

     

    • 键值运算关系

    In:label 的值在某个列表中

    NotIn:label 的值不在某个列表中

    Gt:label 的值大于某个值

    Lt:label 的值小于某个值

    Exists:某个 label 存在

    DoesNotExist:某个 label 不存在

     

    2.1 硬策略

    必须在k8s-node2上面运行一个pod

    apiVersion: v1
    kind: Pod
    metadata:
      name: affinity
      labels:
        app: node-affinity-pod
    spec:
      containers:
      - name: with-node-affinity
        image: wangyanglinux/myapp:v1
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - k8s-node2
    

    2.2 软策略

    想在node3上面运行一个pod,没有node3也可以

    apiVersion: v1
    kind: Pod
    metadata:
      name: affinity1
      labels:
        app: node-affinity-pod
    spec:
      containers:
      - name: with-node-affinity
        image: wangyanglinux/myapp:v1
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/hostname 
                operator: In
                values:
                - k8s-node3
    
    

    三 pod亲和性

    pod.spec.affinity.podAffinity/podAntiAffinity:

     

    preferredDuringSchedulingIgnoredDuringExecution:软策略

    requiredDuringSchedulingIgnoredDuringExecution:硬策略

    3.1 硬策略

    pod-3这个pod必须要和value为node-affinity-pod的在同一个node上

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-3
      labels:
        app: pod-3
    spec:
      containers:
      - name: pod-3
        image: wangyanglinux/myapp:v1
      affinity:
        podAffinity: #在
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - node-affinity-pod
            topologyKey: kubernetes.io/hostname
    
    
    
    

    kubectl get pod --show-labels

    3.2 软策略

    pod-4这个pod要和标签为pod-3的不在同一个node节点上

     

    [root@k8s-master01 diaodu]# cat pod4.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-4
      labels:
        app: pod-4
    spec:
      containers:
      - name: pod-4
        image: wangyanglinux/myapp:v1
      affinity:
        podAntiAffinity: #不在
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
             labelSelector:
               matchExpressions:
               - key: app
                 operator: In
                 values:
                 - pod-3
             topologyKey: kubernetes.io/hostname
    
    
    

    一个在node1,一个在node2

    四 污点和容忍

    4.1 介绍

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

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

     

    4.2 污点

    https://blog.frognew.com/2018/05/taint-and-toleration.html#%E5%AE%9E%E8%B7%B5kubernetes-master%E8%8A%82%E7%82%B9%E4%B8%8D%E8%BF%90%E8%A1%8C%E5%B7%A5%E4%BD%9C%E8%B4%9F%E8%BD%BD

    污点 ( Taint ) 的组成

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

     

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

     

    NoSchedule :表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上
    
    PreferNoSchedule :表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上
    
    NoExecute :表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去
    

      

     

    • 查看污点

     

    [root@k8s-master01 diaodu]# kubectl describe nodes k8s-master01|grep Taints
    Taints:             node-role.kubernetes.io/master:NoSchedule
    

      

    
    
    

     

    去除污点 

     

    kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule

    # 如果上面的报错,就用下面的

    kubectl taint nodes k8s-master01 node-role.kubernetes.io/master-

      

     设置污点

    # 主节点设置污点
    
    kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:NoSchedule
    
    kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:PreferNoSchedule
    
    kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:PreferNoSchedule
    
    # 从节点设置污点
    
    kubectl taint nodes k8s-node1 key=hu:NoExecute
    

      

    设置完成之后,发现在node1上面的pod,都消失了

    设置之前:

    设置之后:

     

    • 去除污点

    查看污点:

     

    kubectl taint nodes k8s-node1 key:NoExecute-
    

     

    然后再次查看,发现污点没了

     

    4.3 容忍

    一句话,就是pod设置了容忍,即使node有污点,也可以分配

     

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

     

    例子:

     

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-3
      labels:
        app: pod-3
    spec:
      containers:
      - name: pod-3
        image: wangyanglinux/myapp:v1
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "hu"
        effect: "NoExecute"
        tolerationSeconds: 3600 #表示3600秒之后才被删除
    
    
    

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

    operator 的值为 Exists 将会忽略 value 值

     

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

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

     

    tolerations:
    - operator: "Exists"
    
    

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

     

    tolerations:
    - key: "key"
      operator: "Exists
    

     

    4.3.3 有多个 Master 存在时,防止资源浪费,可以如下设置

    尽可以不分配在master上面,如果node节点不够用,在分配

     

    kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:PreferNoSchedule
    

     

    五 固定节点

    5.1 根据node节点的主机名选择

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

     

    root@k8s-master01 diaodu]# cat pod5.yaml 
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: myweb
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            app: myweb
        spec:
          nodeName: k8s-node1
          containers:
          - name: myweb
            image: wangyanglinux/myapp:v1
            ports:
            - containerPort: 80
    
    
    

    然后去查看效果

     

    5.2 根据node标签去选择

     

    设置标签

    kubectl label node k8s-node2 disk=ssd

     

    查看标签

     

    例子:

     

    [root@k8s-master01 diaodu]# cat label.yaml 
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: myweb
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            app: myweb
        spec:
          nodeSelector:
            disk: ssd #标签
          containers:
          - name: myweb
            image: wangyanglinux/myapp:v1
            ports:
            - containerPort: 80
    
    
    

    查看效果都运行在node2上面

     

  • 相关阅读:
    zbb20181207 springboot @ConfigurationProperties使用
    zbb20181206 logback,lombok 默认日志logback配置解析
    Spring Boot (8) 全局异常处理
    Spring Boot (7) JdbcTemplate访问数据库
    Spring Boot (6) Spring Data JPA
    Spring Boot (4) 静态页面和Thymeleaf模板
    Spring Boot (3) 热部署devtools
    Spring Boot (2) Restful风格接口
    Spring Boot (1) 构建第一个Spring Boot工程
    idea使用maven搭建ssm框架实现登陆商品增删改查
  • 原文地址:https://www.cnblogs.com/huningfei/p/12701425.html
Copyright © 2011-2022 走看看