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

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

相关文章

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会