云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度(二)

简介: 云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度

关于污点的小结


污点存在的意义:

使用 kubectl taint 命令可以给某个 node节点设置污点,Node 被设置上污点之后就和 Pod 之间存在

了一种互斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去:

key=value:effect

通过给节点设置不同的污点,可以制定一个总的策略,例如,新节点使用effect NoExecute,那么,想在此节点运行pod就必须是有设置tolerations(容忍策略)的特定pod了,无疑安全性会大大提高,一般master节点是不建议运行非核心服务的pod的,因此,也可以给master打上NoSchedule污点,以保护master。

稍作总结,三种污点effect里,NoSchedule和PreferNoSchedule是比较温和的,NoExecute是最为严厉的,即使pod设置了nodeSelector或者nodeSelectorTerm,设置了此effect的节点也是不可使用的,也可以算是真正的节点禁用,因此,NoExecute是慎用的。

NoSchedule等于是节点维护状态,PreferNoSchedule等于是无所谓,你非要调度到这个节点也行。

以上都是面向某个节点内的所有pod调度,未免对于pod的调度不够精细,例如,NoExecute直接将节点内的pod全部清空,太暴力了(虽然这么做,整个节点的安全性非常高,和iptables防火墙一样的策略嘛,先禁止所有,然后在放开部分,相当于tolerations,其实这也是容忍存在的意义嘛)。那么,下面的调度策略将针对的是单个pod。

污点的effect可以设置多个

三,容忍策略---tolerations


容忍是相对于污点来说的,容忍是在pod内设置的。光说不练假把式对吧,直接看kube-flannel的部署清单文件内的相关内容吧:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule

此段容忍表示,默认的容忍污点的effec 是NoSchedule的节点,也就是说即使此node节点设置了NoSchedule,该pod仍然可以部署,为什么是这样设置呢?其实此清单文件是可以使用在kubeadmin部署的集群内,默认的kubeadmin部署的集群会对master节点设置NoSchedule的污点。

查看node2的污点(假设我已经提前设置好了污点):

[root@master coredns]# k describe node k8s-node2 |grep Taints
Taints:             key=values:NoExecute

此pod将不会被创建: 

[root@master coredns]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeaffinity-preferred
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.18
  affinity:  #亲和性设置
    nodeAffinity: #设置node亲和性
      preferredDuringSchedulingIgnoredDuringExecution: # 软限制
      - weight: 1
        preference:
          matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签(当前环境没有)
          - key: nodeweb
            operator: In
            values: ["dsfsd","web"]
  nodeName: k8s-node2

修改成如下的pod才可以被创建(容忍三行):

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.18
  tolerations:
  - operator: Exists
    effect: NoExecute
  affinity:  #亲和性设置
    nodeAffinity: #设置node亲和性
      preferredDuringSchedulingIgnoredDuringExecution: # 软限制
      - weight: 1
        preference:
          matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签(当前环境没有)
          - key: nodeweb
            operator: In
            values: ["dsfsd","web"]
  nodeName: k8s-node2

容忍定义小结:

  • 污点和容忍是相呼应的关系,也就是说有污点才有容忍,光有容忍是没有意义的。
  • operator的值只有两个Equal和Exists两个,从字面翻译看,Equal表示必须相等,Exists表示默认情况。
  • operator 的值为 Exists 时将会忽略 value 值,也可以直接省略values定义。
  • operator 的值为 Exists 时可以省略key值,此时表示表示容忍所有的污点 key,例如:
1. tolerations:
2. - operator: “Exists”
  • effect可以省略,省略effect 值时,表示容忍所有的污点作用,例如:
1. tolerations:
2. - key: “key”
3. operator: “Exists”

下面是一个比较完整的示例:

tolerations:
- key: “key1”
  operator: “Equal”
  value: “value1”
  effect: “NoSchedule”
tolerationSeconds: 3600
- key: “key1”
  operator: “Equal”
  value: “value1”
  effect: “NoExecute”
- key: “key2”
  operator: “Exists”
  effect: “NoSchedule”

三,pod调度策略


这些策略都是写在资源清单文件内的,针对单独的pod

默认情况下,一个pod被调度到哪个node节点是由scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的,但是在实际使用中,这并不能满足所以要求,很多时候我们想控制某些pod到达某些节点,所以kubernetes就为我们提供了4种pod的调度策略来解决该问题。

(1)定向调度


主要是指定pod定向调度到哪个node节点上

a)nodeName策略


注:kubectl集群节点名nodeName称可以通过kubectl get nodes查看,例如本例:

[root@master coredns]# k get no

NAME         STATUS   ROLES    AGE   VERSION

k8s-master   Ready       25d   v1.18.3

k8s-node1    Ready       25d   v1.18.3

k8s-node2    Ready       25d   v1.18.3

资源清单文件内使用:

[root@master coredns]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.18
  nodeName: k8s-node1 # 指定调度到node1节点上,注意此字段是pod属性,所以和containers在同一列

毫无疑问,此pod必定会在node2节点运行,即使有drain或者train设置了NoScheduler

b)NodeSelector策略

NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。简单的说就是给kubectl集群的node节点打上标签,然后调度器将pod调度到指定标签的node上。

例如给node2节点设置标签,并查询标签:

kubectl label nodes k8s-node2 node=LAMP
[root@master coredns]# k get nodes --show-labels
NAME         STATUS   ROLES    AGE   VERSION   LABELS
k8s-master   Ready    <none>   25d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux
k8s-node1    Ready    <none>   25d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
k8s-node2    Ready    <none>   25d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,node=LAMP

截取资源清单文件相关部分:

  volumes:
    - name: mysql-persistent-storage
      persistentVolumeClaim:
        claimName: mysql-pvc #对应到pvc的名字
  nodeSelector:
    node: LAMP

这里说明一哈,比如kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,这个是kubernetes.io/arch架构相关的,因此,这个是没法使用的。而我们新建的标签是kubernetes.io/os级别,操作系统类的,因此可以使用。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
1
0
0
43
分享
相关文章
云原生之负载均衡策略
ai必学之负载均衡 @[TOC]轮询处理;weight权重;ip_hash
突破地域限制,实现算力无限供给 —阿里云ACK One注册集群开启多地域Serverless算力调度
本文介绍了阿里云ACK One注册集群多地域Serverless算力调度解决方案,解决传统数据中心在AI时代面临的算力不足问题。方案通过分钟级接入、100%兼容Kubernetes操作及云上Serverless弹性,实现跨地域弹性算力供给,支持高并发请求与模型快速迭代。文中详细描述了快速接入步骤、指定地域调度及动态调度方法,并提供了相关代码示例。该方案助力企业实现AI推理服务的规模化部署,提升商业落地效率。
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
130 25
突破地域限制,实现算力无限供给 -- 阿里云ACK One注册集群开启多地域Serverless算力调度
传统单地域算力难以支撑AI推理场景的高并发实时响应、突发高流量的要求,阿里云容器服务ACK One注册集群推出多地域Serverless算力调度方案完美解决此问题。
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
141 12
云原生架构下的微服务优化策略####
本文深入探讨了云原生环境下微服务架构的优化路径,针对服务拆分、通信效率、资源管理及自动化运维等核心环节提出了具体的优化策略。通过案例分析与最佳实践分享,旨在为开发者提供一套系统性的解决方案,以应对日益复杂的业务需求和快速变化的技术挑战,助力企业在云端实现更高效、更稳定的服务部署与运营。 ####
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
131 0
极氪汽车云原生架构落地实践
随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问