k8s的策略

集群调度:

Scheduler的调度算法:

预算策略

过滤出合适的节点

优先策略

选择部署的节点

NodeName:硬策略,不走调度策略,node1

nodeSelector:根据节点的标签选择,会走一个调度算法

只要是走调度算法,在不满足预算策略的情况下,所有的pod都是pending

Node节点的亲和性:

硬策略:必须满足的条件。匹配原则根据节点的标签

软策略:尽量满足,而不是一定满足

以上说的都是node节点

接下来我们来说pod的

亲和性和反亲和性:

调度策略: 匹配标签 操作符 拓扑域 调度目标

Node的亲和性: 主机标签 in¬in exists doesNotExist Gt Lt 不支持 指定主机

Pod 的亲和性 pod的标签 in notin exists doesnotexist 支持 pod和指定标签的pod部署在同一拓扑图

Pod的反亲和性 pod的标签 in notin exists doesnotexist 支持

拓扑域:

k8s集群节点当中的一个组织结构,可以根据节点的物理关系或者逻辑关系进行划分,可以用来表示节点之间的空间关系,网络关系或者其他类型的关系

标签,主机标签

Pod

注意点:

Pod的亲和性和策略,在配置时,必须加上拓扑域的关键字topologykey,指向节点标签

Pod亲和性的策略分为硬策略和软策略

Pod亲和性的notin可以替代反亲和性

Pod亲和性主要是为了把相关联的pod部署在同一节点

你在进行部署的时候怎么考虑node节点:

污点和容忍可以配合node节点一块使用

演示:

演示:

解析:

添加标签

另外一种方式:

硬策略:

软策略写法:

反亲和性:

软策略:

硬策略:

污点

是node的调度机制,不是pod

被设为污点的节点,不会部署pod

污点和亲和性相反,亲和性是尽量选择和一定选择

污点的节点一定不被选择吗?

Taint三种:

  1. NoSchedule:k8s不会把pod调度到这个节点上
  2. preferNoSchedule:如果污点类型是他,只是尽量避免把pod部署在该节点上,而不是一定
  3. NoExecute:如果污点类型是它的话,k8s将会把该节点pod驱逐出去,而且也不会调度到这个节点,基于控制器创建的pod,虽然被驱逐,会在其他节点部署,自主pod会被直接杀死

注意点:节点服务器需要维护时,服务器关机,节点上的pod将会失效,在工作中我们主要部署pod的方式控制控制器部署,deployment最多的,一旦节点设置被驱逐,控制器创建的pod会在其他节点继续部署

所有的pod都会被驱逐,更命名空间无关,所有的一切都会被驱逐,不论你的创建方式是什么,都会被驱逐,系统集群组件不会被驱逐

查看污点命令:

kubectl describe nodes node01 | grep -i taints

清缓存命令

echo 1 > /proc/sys/vm/drop_caches

污点演示三种情况:

第一种:

设置污点

删除污点

第二种:

尽量不调度

第三种:

如果污点类型是它的话,k8s将会把该节点pod驱逐出去,而且也不会调度到这个节点

容忍:

即使集群节点上设置了污点,有了容忍机制,依然可以在设置为污点的节点上部署pod

特殊情况,NoExecute依然可以部署pod,但是是有生命周期,时间一到,pod被销毁然后重新拉起。生命周期结束之后,会驱逐一部分pod到其他节点上,有点节点还是会保留在污点节点上。

该节点维护完毕,测试一下节点的工作是否正常

删除所有污点:

设置污点:

kubectl taint node master01 key=1:NoSchedule

配置容忍:

设置为驱逐类型

kubectl describe nodes node01 | grep -i taints

kubectl taint node master01 key=1:NoExecute

kubectl taint node node02 key=1:NoSchedule-

设置容忍时间

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: nginx2

name: nginx2

spec:

replicas: 3

selector:

matchLabels:

app: nginx2

template:

metadata:

labels:

app: nginx2

spec:

containers:

  • image: nginx:1.22

name: nginx2

tolerations:

  • key: key

operator: Equal

value: "1"

effect: NoExecute

tolerationSeconds: 36

36秒之后,被驱逐之后,也会出现

演示污点容忍机制

kubectl describe nodes node01 | grep -i taints

kubectl taint node node02 key=1:NoExecute-

kubectl taint node node01 key=1:NoSchedule

第二种情况

解析:

指定key的值,指标节点的标签,但是不指定污点的类型,那么所有节点上只要包含了这个指定的标签,可以容忍所有的污点

没有key,不匹配节点标签,容忍所有污点,但是类型是指定的类型

总结:

Node的亲和性

Pod的亲和性和反亲和性

污点和容忍

总结起来就是如何选择节点部署pod,选择一个期望的节点部署pod

举例:

我有多个master节点:

Kubectl taint node master节点名称

尽量不往master节点上部署pod,但是不是一定的,防止资源浪费,自定义一个标签

业务维护:

Node02需要维护两个小时,但是这个节点上还有业务pod在运行

就需要把这个节点的污点设置为驱逐

我们部署pod,一般都是使用deployment部署的pod,会在其他节点重新部署,并不是被杀死,自主试的pod会被杀死

一旦节点恢复,一定要把污点去除

Cordon和drain

****Cordon:****可以直接把节点标记为不可用状态

Drain: 排水,把该节点下的pod全部转移到其他的node节点上云霄

一旦执行了drain,被执行的节点就会变成不可调度状态

会驱逐该节点上的所有pod

清空污点

kubectl taint node node02 key=1:NoExecute-

kubectl describe nodes master01 | grep -i taints

演示Drain

解析:

kubectl drain node02 --ignore-daemonsets --delete-emptydir-data --force

Drain:排水,标记node节点为不可调度,然后驱逐pod

--ignore-daemonsets:忽视daemonset部署的pod,daemonset部署的pod还在节点

--delete-local-data:有本地挂载卷的pod会被强制杀死

--force:强制释放,不是控制器管理的pod

如何改回来

重点:

node亲和性

Pod亲和性

污点:NoExeccute(驱逐)

Cordon和drain

--ignore-daemonset daemonset部署的一般是重要后台运行的,系统pod,所以不动

总结:

Node亲和性

Pod亲和性

Pod反亲和性

污点:NoExecute

容忍

Cordon

Drain

如何部署pod时比较重要的集群调度机制,合理的配置pod的调度机制可以是资源最大化应用

相关推荐
李匠20248 小时前
C++GO语言微服务之Dockerfile && docker-compose②
c++·容器
斤斤计较9 小时前
Docker 环境安装(2025最新版)
运维·docker·容器
小锋学长生活大爆炸9 小时前
【教程】Docker方式本地部署Overleaf
运维·docker·容器
Hfc.9 小时前
ubuntu20.04系统搭建k8s1.28集群-docker作为容器运行时
ubuntu·kubernetes
欧先生^_^9 小时前
Docker 的各种网络模式
网络·docker·容器
开源架构师9 小时前
JVM 与云原生的完美融合:引领技术潮流
jvm·微服务·云原生·性能优化·serverless·内存管理·容器化
掘金者说9 小时前
docker系列-DockerDesktop报错信息(Windows Hypervisor is not present)
运维·docker·容器
金刚猿13 小时前
openfeign 拦截器实现微服务上下文打通
微服务·云原生·架构
lcw_lance13 小时前
技术中台-核心技术介绍(微服务、云原生、DevOps等)
微服务·云原生·devops
alden_ygq16 小时前
Kubernetes Horizontal Pod Autosscaler(HPA)核心机制解析
云原生·容器·kubernetes