Kubernetes高级调度方式

1.节点选择器

(1)nodeSelector

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      containers:                 #列表所以下面会有-
      - name: nginx-deployment    #镜像
        image: nginx:1.15
      nodeSelector:
        app: en

(2)nodeName

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      nodeName: k8s-node1               #指定分配节点
      containers:                 #列表所以下面会有-
      - name: nginx-deployment    #镜像
        image: nginx:1.15

2.节点亲和调度

(1)nodeAffinity 硬亲和

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution: #硬亲和
            nodeSelectorTerms:
            - matchExpressions:
              - key: app               #表示有标签是app值为en或者bar
                operator: In
                values:
                - en
                - bar  
      containers:                 #列表所以下面会有-
      - name: nginx
        image: nginx:1.15

(2)nodeAffinity 软亲和

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:  #软亲和,没有匹配也可以创建
          - preference:
              matchExpressions:
              - key: app 
                operator: In
                values:
                - haha
                - bar  
            weight: 60
      containers:                 #列表所以下面会有-
      - name: nginx
        image: nginx:1.15

3.Pod亲和调度

(1)目的
就是为了让一组pod运行或者不运行在一起
(2)标准
①以第一个pod所在的节点或者现在很多pod所在的节点为评判,后续pod能否到他这个节点的方式就叫Pod亲和性
②判断pod亲和性需要有个标准,就是说比如服务器A B C D,如果按照名字分类那么A B C D分别为4种类型,那么我们判断Pod亲和性的话就是说,当所有pod在A上某一个单个的节点的时候,我们可以认为是亲和的,当然如果说A B 有相同标签app:nginx,那么如果按照标签来判断Pod亲和性,我们就可以认为在A 和B 上的同一组pod是由亲和性的,要有一个区分的标准
(3)亲和的区别
①硬亲和
必须在同一个区域内

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      containers:                 #列表所以下面会有-
      - name: nginx-deployment    #镜像
        image: nginx:1.15
        imagePullPolicy: IfNotPresent
      affinity:
        podAffinity:                        #这个pod找在它本身命名空间下的有以下标签的pod按照判断标准划分在同一区域内
          requiredDuringSchedulingIgnoredDuringExecution:  
          - labelSelector:
              matchExpressions:
              - key: app                        #有标签app=nginx-01
                operator: In
                values:
                - nginx-01      
            topologyKey: kubernetes.io/hostname  #判断标准为hostname相同

②软亲和
尽量在同一个区域内

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 1                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      containers:                 #列表所以下面会有-
      - name: nginx-deployment    #镜像
        image: nginx:1.15
        imagePullPolicy: IfNotPresent
      affinity:
        podAntiAffinity:                        #这个pod找在它本身命名空间下的有以下标签的pod按照判断标准尽量的划分在同一区域内
          requiredDuringSchedulingIgnoredDuringExecution:  
          - labelSelector:
              matchExpressions:
              - key: app                        #有标签app=nginx-01
                operator: In
                values:
                - nginx-01      
            topologyKey: kubernetes.io/hostname  #判断标准为hostname相同

注意:有可能因为节点少所以无法测试效果

4.污点调度

官网文档:https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
(1)含义
给了节点能选择让拿一些pod调度到上面,污点就是定义在节点上面的键值属性数据
键值属性数据分为三类:
①标签
②注解
③污点
污点一般用在节点之上,而标签和注解所有资源对象都可以使用

taint的effect定义对Pod排斥效果:
NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响;
NoExecute:既影响调度过程,也影响现在的Pod对象;不容忍的Pod对象将被驱逐;
PreferNoSchedule:柔性版本,不能容忍就没办法调度过来,但是如果其他资源不够,也可以过来

在Pod定义容忍度的时候
等值比较:容忍度和污点必须在key和value相同
存在性判断:key和
一个节点可以有多个污点,一个Pod可以有多个容忍
节点的每一个污点都要被容忍,如果有一个不能容忍,那么就得看五点的效果是什么

(2)定义node污点
kubectl taint node k8s-node1 node_type=production:NoSchedule

Node 资源类型
k8s-node1 资源对象
node_type
key Production
value NoSchedule 污点的类型

(3)定义Pod容忍度
例①

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default               #指定命名空间
  labels:
    app: nginx                    #控制器的标签
spec:                             #控制器期望的状态
  replicas: 3                       #指定副本个数
  selector:                        #标签选择器
    matchLabels:                  #逻辑域(可以写多个标签)
      app: nginx
  template:                      #pod模板定义
    metadata:                   #pod的元数据
      labels:             #pod标签一定符合标签选择器,至少符合标签选择器的一个
        app: nginx
    spec:                        #pod的期望的状态
      containers:                 #列表所以下面会有-
      - name: nginx-deployment    #镜像
        image: nginx:1.15
        imagePullPolicy: IfNotPresent
      tolerations:
      - key: "node_type"
        operator: "Equal"          #可以写Exists或者Equal,Exists表示只要有key就可以,值一样不一样无关紧要,而Equal表示精准匹配,不光得有key而且value必须是相同的才可以
        value: "production"
        effect: "NoSchedule"   #如果这里选择NoExecute那么就可以定义被驱逐的时候等多久在被驱逐
     #  tolerationSeconds: 30   #如果污点类型发生变化以后要被驱逐,那么等30s以后被驱逐

例②
tolerations:
- key: “node_type”
operator: “Exists” #可以写Exists或者Equal,Exists表示只要有key就可以,值一样不一样无关紧要,而Equal表示精准匹配,不光
得有key而且value必须是相同的才可以
value: “”
effect: “NoSchedule”
# tolerationSeconds: 30

#使用Exists的时候如果effect有值的话那么就表示key必须相同,value可以忽略,effect必须相同
#如果effect没值的话,那么就是说key必须相同,value和effect可以模糊匹配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来自万古的忧伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值