pod调度

kube-scheduler 是 Kubernetes 集群的默认调度器; 在做调度决定时需要考虑的因素包括: 单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间 的干扰等等

一,指定nodeName

一,指定nodeName:(与containers同级别) 

示例:

spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: node1

1)如果节点没有资源容纳pod,则调度失败 
2)节点不存在,调度失败


二,nodeSelector

二,nodeSelector(与containers同级别) 
示例:

# 给node1打标签
kubectl label nodes node1 disktype=ssd

#指定按照标签选择节点 
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    disktype: ssd 

1) 如果没有匹配到标签会无法运行pod,pending状态
2) 删除node标签不会影响已运行的pod,伸缩或者重新部署会pending



三,亲和/反亲和



(基于上面的nodeSelector扩展,nodeSelector匹配不到标签会调度失败,可以发现规则是“软”/“偏好”,而不是硬性要求,因此,如果调度器无法满足该要求,仍然调度该pod)

节点亲和
• requiredDuringSchedulingIgnoredDuringExecution 必须满足
• preferredDuringSchedulingIgnoredDuringExecution 倾向满足
• IgnoreDuringExecution 表示如果在Pod运行期间Node的标签发生变化,导致 亲和性策略不能满足,则继续运行当前的Pod。


nodeaffinity还支持多种规则匹配条件的配置:
• In: label 的值在列表内
• NotIn: label 的值不在列表内
• Gt: label 的值大于设置的值,不支持Pod亲和性 • Lt:label 的值小于设置的值,不支持pod亲和性 • Exists:设置的label 存在
• DoesNotExist: 设置的 label 不存在


示例1: spec:
  containers:
  - name: nginx
    image: nginx
      spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: disktype
                    operator: In
                    values:
                      - ssd

必须满足,调度到标签为disktype=ssd的节点上





示例2: 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:   
            - preference:
                matchExpressions:
                  - key: disktype
                    operator: In
                    values:
                      - ssd
              weight: 1
          requiredDuringSchedulingIgnoredDuringExecution:     
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/hostnme
                    operator: NotIn
                    values:
                      - cn-shanghai.192.168.50.27

1) 倾向满足调度到,标签为disktype=ssd的节点上
2) 必须满足,不调度在节点cn-shanghai.192.168.50.27上






示例3:

  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: disktype
                      operator: In
                      values:
                        - ssd
                topologyKey: kubernetes.io/hostname
              weight: 100
反亲和
不调度到,标签为disktype=ssd的节点


四,污点

# • Taints(污点)是Node的一个属性,设置了Taints后,所以Kubernetes是不会将 Pod调度到这个Node上的,

于是Kubernetes就给Pod设置了个属性Tolerations(容忍), 只要 Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去


tolerations中定义的key、value、effect,要与node上设置的taint保持一致: 
• 如果 operator 是 Exists ,value可以省略。
• 如果 operator 是 Equal ,则key与value之间的关系必须相等。
• 如果不指定operator属性,则默认值为Equal

还有两个特殊值:
• 当不指定key,再配合Exists 就能匹配所有的key与value ,可以容忍所有污点。 • 当不指定effect ,则匹配所有的effect。
#必须满足

 # 添加污点
kubectl taint node node1 node-role.kubernetes.io/master:NoSchedule

#Toleration(容忍) 
operator可以定义为:
Equal:表示key是否等于value,默认 Exists:表示key是否存在,此时无需定义value
tain 的 effect 定义对 Pod 排斥效果 

NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响; 
NoExecute:既影响调度过程,也影响显著的Pod对象;不容忍的Pod对象将被驱逐
PreferNoSchedule: 表示尽量不调度




#示例1: 

spec:
      containers:
      - name: myapp
        image: myapp:v1
      tolerations:
        - effect: NoExecute
          key: kafka
          operator: Equal
          value: kafkadaptation
#以上的配置容忍kafka=kafkadaptation,则打了污点的标签可以调度(如果没有这个配置的容器,不可以被调度打了污点的节点上)






#示例2: containers:
      - name: myapp
        image: myapp:v1
      tolerations:
      - operator: "Exists"
        effect: "NoSchedule"
tolerationSeconds: 6000(当 pod 需要被驱逐时,可以继续在 node 上 运行的时间)

# 当不指定key,再配合Exists 就能匹配所有的key与value ,可以容忍所有污点。(容忍后有污点的节点都可以调度)

1)如果effect是NoSchedule(如上),则打了污点的NoSchedule节点也会被调度
2)如果effect是NoExecute,则打了污点的NoExecute节点可以被调度
3)如果不指定effect,则忽视所有污点,所有打了污点的标签都可以被调度(如示例3)



#示例3:

      containers:
      - name: myapp
        image: myapp:v1
      tolerations:
      - operator: "Exists"
# • 当不指定effect ,则匹配所有的effect。即所有污点都会忽视





PS1:
如果想让一个deployment不管有多少个pod都在一个节点上,
      tolerations:
        - effect: NoExecute
          key: wd
          operator: Equal
          value: wd

只能NoExecute才可以做到




PS2:
如果10个节点打了一样的污点,有10个deployment需要在这10台机器跑,并且各个服务之间的pod不能再用一个节点上(10个deployment各只有一个pod为例)


# 设置pod反亲和
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: adaptor
                    operator: In
                    values:
                      - adaptor
              topologyKey: kubernetes.io/hostname
      containers:
... ...
          resources:
            requests:
              cpu: 250m
              memory: 64Mi
      terminationGracePeriodSeconds: 30
# 增加容忍度
      tolerations:
        - effect: NoExecute
          key: kafka
          operator: Equal
          value: kafkadaptation
      volumes:
        - hostPath:
            path: /etc/localtime
            type: ''
          name: volume-localtime

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容