污点、容忍、不可调度、排水、数据卷

2024-09-04 21:44

本文主要是介绍污点、容忍、不可调度、排水、数据卷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

污点taint

污点的格式

1. key:effect    键名:污点类型

2. key=value:effect   键名=数值:污点类型

污点的类型

1.  NoSchedule

2.  PreferNoSchedule

3. NoExecute(驱逐)

设置污点(主节点操作)

查看污点

删除污点

修改污点

容忍tolerations

Equal类型

NoExecute

Exists类型

没有key 只有effect

​编辑

只有key 没有effect

不可调度cordon

排水drain

数据卷

emptyDir 存储卷

容器内部挂载

hostPath 数据卷

容器和节点挂载

NFS共享存储卷


污点taint

污点:一旦节点上有污点的标签,那么调度器在部署pod的时候会避开这些有污点标签的节点进行部署。

node-role.kubernetes.io/master:NoSchedule    键名:污点类型

污点的格式

1. key:effect    键名:污点类型

effect 指的是污点的类型

2. key=value:effect   键名=数值:污点类型

污点的类型

1.  NoSchedule

表示节点上一旦有这个污点,调度器是不会把pod部署在该节点上的。

2.  PreferNoSchedule

表示尽量避免把pod部署在该节点

3. NoExecute(驱逐)

表示调度器不仅不会把pod部署到该节点,而且会把该节点上的pod驱逐到其他节点上。

注:不是基于deployment创建的pod驱逐之后会被销毁

设置污点(主节点操作)

方式一:kubectl taint node node01 test1=1:NoSchedule

方式二:kubectl taint node node01 test1:NoSchedule

查看污点

kubectl describe nodes master01 查看污点

删除污点

kubectl taint node master01 node-role.kubernetes.io/master:NoSchedule-   删除污点

修改污点

kubectl taint node node01 test1=1:PreferNoSchedule --overwrite   修改污点 

对master节点总结:

1. master节点一般情况下作为集群的调度者,尽量不部署pod。但是为了资源最大化,master也可以部署pod,这个时候可以把master节点设置污点类型 PreferNoSchedule。

2. 如果集群规模很小,也可以直接用来当节点进行pod部署,就是取消污点。

容忍tolerations

容忍:即使节点上有污点,调度器依然可以把pod部署在有污点的节点上。

语法:tolerations

类型:Equal 等于和 Exists 包含

Equal类型

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginximage: nginx:1.22tolerations:
#容忍的语法- key: "test1"
#指定键的名称operator: "Equal"
#容忍里匹配的算法只有两个:Equal 等于;Exists 包含
#Equal匹配的污点格式必须是 test1=1:NoSchedule value: "2"effect: "NoSchedule"
#匹配污点的类型
NoExecute

      tolerations:
#容忍的语法- key: "test1"
#指定键的名称operator: "Equal"
#容忍里匹配的算法只有两个:Equal 等于;Exists 包含
#Equal匹配的污点格式必须是 test1=1:NoSchedule value: "2"effect: "NoExecute"
#匹配污点的类型tolerationSeconds: 10
#指定pod在这个节点上部署成功之后运行多久被驱逐
# tolerationSeconds: 10 使用这个字段必须是NoExecute

Exists类型

没有key 只有effect

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginximage: nginx:1.22tolerations:
#容忍的语法- operator: "Exists"
#使用Exists时,可以不指定key的时候,表示所有的节点只要是NoSchedule的标签都可以部署effect: "NoSchedule"
只有key 没有effect

      tolerations:
#容忍的语法- key: "test1"operator: "Exists"

不可调度cordon

cordon:直接标记节点为不可用的状态,调度器不会把pod部署到该节点

设置不可调度命令:kubectl cordon node02

查看是否是不可调度:kubectl get node

取消不可调度命令:kubectl uncordon node02

排水drain

drain:标记节点为不可调度,而且会把节点上的pod驱逐到其他节点。

设置排水命令:kubectl drain node02 --ignore-daemonsets --delete-local-data --force

--ignore-daemonsets:无视daemonsets部署的pod

--delete-local-data:如果被排水的节点上有本地的挂载点,它也会强制杀死该pod

--force:不是控制器创建的pod会被强制释放

恢复:kubectl uncordon node02

注:排水就排一次,排水跟驱逐类似。

问题:当排水或者驱逐之后,怎么样能让pod重新回到节点?

步骤:1. 污点类型驱逐必须要取消掉

           2. 恢复排水的节点:kubectl uncordon node02

           3. 重启:kubectl delete pod

数据卷

因为容器、pod的生命周期是有限的,一旦重启或者崩溃,数据会丢失,所以我们为了保证数据的完整,我们要实现pod内的容器和节点的挂载

k8s的数据卷:volume

emptyDir 存储卷

pod分配给节点之前,首先创建emptyDir存储卷,只要运行在节点,数据卷会一直存在。但是这个emptyDir是空的。原因:这个数据卷不能和宿主机共享,一般用于pod内的容器之间共享。一旦pod重启,emptyDir存储卷的数据也会一起删除。

emptyDir存储卷使用场景:主要用于容器内部组件通信,不涉及敏感数据。

容器内部挂载

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginx1image: nginx:1.22volumeMounts:- name: htmlmountPath: /usr/share/nginx/html
#容器内的路径- name : nginx2image: nginx:1.22volumeMounts:- name: html
#这里的名称要和上面保持一致mountPath: /data/command: ["/bin/bash","-c","while true; do echo $(date) >> /data/index.html; sleep 2; done"]volumes:- name: htmlemptyDir: {}
#容器1的/usr/share/nginx/html和容器2/data/做挂载,数据卷是emptyDir,一旦重启pod数据会丢失。

kubectl logs -f pod名 -c 容器名    指定查看pod里容器的日志

kubectl exec -it pod名 -c 容器名     指定进入pod里的容器

hostPath 数据卷

hostPath:它是和节点进行挂载。就是当pod部署到节点时,就会和节点的指定目录进行挂载

它的数据可以持久化,但是node节点如果格式化,数据也会消失。

使用场景:因为每个pod运行的服务不同,保留的数据要做区分,所以这个时候需要用hostPath,比如redis缓存数据库、kafka等等。

容器和节点挂载

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginx1image: nginx:1.22volumeMounts:- name: htmlmountPath: /usr/share/nginx/html
#pod的容器内的目录- name : nginx2image: nginx:1.22volumeMounts:- name: html
#这里的名称要和上面保持一致mountPath: /data/command: ["/bin/bash","-c","while true; do echo $(date) >> /data/index.html; sleep 2; done"]volumes:- name: htmlhostPath:path: /opt/xy102
#节点的目录type: DirectoryOrCreate
#此时容器1的/usr/share/nginx/html和容器2的/data/都会和节点的/opt/xy102进行挂载。因为pod会有pause底层容器,pause容器提供共享网络和共享挂载卷

此时,三个节点主机都会生成/opt/xy102/index.html文件,所以它们都共享到/opt/xy102/index.html。

注:挂载的时候如果节点目录为空,那么对应的容器目录也为空。

问题:如果pod里有多个容器,但是我只声明了一个挂载点,它们是否共享?

答:共享,因为pod会有pause底层容器,pause容器提供共享网络和共享挂载卷,也就是pod里面的所有容器共用一个ip地址,共用一个挂载点。

NFS共享存储卷

它使用的是NFS共享存储。也就是集群里的pod相当于客户端,另外一台服务器提供NFS共享。 

此时,三个节点它们共享一个挂载点,所有的数据都在这一个挂载点。

应用场景:nginx的服务 或者 pod的数据是一致的。

首先需要再另外一台客户机提供NFS共享

在另外一台主机上操作

mkdir /opt/data1

chmod 777 /opt/data1

vim /etc/exports

/opt/data1 192.168.233.0/24(rw,no_root_squash)

systemctl restart rpcbind

systemctl restart nfs

showmount -e   检查一下

然后回到master01主机上 showmount -e 192.168.233.23(另一个客户机)

在master01主机上

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- name: nginx1image: nginx:1.22volumeMounts:- name: htmlmountPath: /usr/share/nginx/html
#pod的容器内的目录- name : nginx2image: nginx:1.22volumeMounts:- name: html
#这里的名称要和上面保持一致mountPath: /data/command: ["/bin/bash","-c","while true; do echo $(date) >> /data/index.html; sleep 2; done"]volumes:- name: htmlnfs:path: /opt/data1
#节点的目录server: 192.168.233.23
#server可以使用ip地址,也可以使用主机名,但是主机名需要做映射

此时三个节点共享另一个客户机的data1目录

如果在这个data1目录创建一个文件,此时容器里面的目录也会有文件

这篇关于污点、容忍、不可调度、排水、数据卷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137114

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名