当前位置: 首页 > news >正文

K8s存储对象的使用

背景和概念

  容器中的文件在磁盘上是临时存放的,这给在容器中运行较重要的应用带来一些问题: 当容器崩溃或停止时,此时容器状态未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。另外 在崩溃期间,kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时, 跨所有容器设置和访问共享文件系统也有一定的挑战性;
  有docker使用经历的人应该知道,docker内有一个数据卷的概念,可以持久化容器内的文件数据;同样,在k8s体系内,使用的也是卷的概念;
  Kubernetes 支持很多类型的卷。 Pod 可以同时使用任意数目的卷类型。 临时卷类型的生命周期与 Pod 相同, 但持久卷可以比 Pod 的存活期长。 当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁持久卷。 对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。
  卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。
  使用卷时, 在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers.volumeMounts 字段中声明卷在容器中的挂载位置。 容器中的进程看到的文件系统视图是由它们容器镜像的初始内容以及挂载在容器中的卷所组成的。 其中根文件系统同容器镜像的内容相吻合。 任何在该文件系统下的写入操作,如果被允许的话,都会影响接下来容器中进程访问文件系统时所看到的内容。
  卷挂载在镜像中的指定路径下。 Pod 配置中的每个容器必须独立指定各个卷的挂载位置;

常见的卷类型

常见的卷有如下几种类型:

  • configMap :configMap 卷提供了向 Pod 注入配置数据的方法。 ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被 Pod 中运行的容器化应用使用(注意环境变量也可以使用configMap)。
  • hostPath:将主机节点文件系统上的文件或目录挂载到你的 Pod 中,但是官网现在不推荐使用这个了;
  • nfs:将 NFS (网络文件系统) 挂载到你的 Pod 中。nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载;使用nfs可以可以在 Pod 之间做到数据共享。
  • persistentVolumeClaim: 简称PVC,是用户在不知道特定云环境细节的情况下申领持久存储(例如 iSCSI 卷)的一种方法。
  • secret:用来给 Pod 传递敏感信息,例如密码。你可以将 Secret 存储在 Kubernetes API 服务器上,然后以文件的形式挂载到 Pod 中,无需直接与 Kubernetes 耦合
    当然也有其他类型的卷,详细的可查阅k8s官网;

案例

一、nfs原生方式挂载卷

企业级生产环境一般会由基础设施部门提供一个nfs地址和目录。受限于我本地测试环境的资源,我只能在虚拟机上随意找一台节点,来模拟nfs文件系统;这里我使用了k8s集群的master节点模拟搭建一个nfs;
(这里解释一下nfs,他的全称就是网络共享文件系统,他可以挂载到任何机器的磁盘目录下,做到几台机器间的文件数据同步共享;)
步骤
1、在所有机器上安装nfs工具

#所有机器安装
yum install -y nfs-utils

2、master主节点模拟配置为nfs服务端

#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exportsmkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r

3、worker节点查询nfs服务

showmount -e nfs服务ip

在这里插入图片描述
可以看到我上一个步骤创建的目录可以查到了
4、挂载到worker节点指定的目录下

# 创建/nfs/data目录,执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /nfs/data
mkdir -p /nfs/datamount -t nfs 192.168.xxx.xxx:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test2.txt

查看同步的test2.txt文件
在这里插入图片描述
5、pod挂载nfs

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-pv-demoname: nginx-pv-demo
spec:replicas: 2selector:matchLabels:app: nginx-pv-demotemplate:metadata:labels:app: nginx-pv-demospec:containers:- image: nginxname: nginxvolumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlnfs:server: 192.168.xxx.xxxpath: /nfs/data/nginx-pv

这里的意思就是将nfs的/nfs/data/nginx-pv目录挂载到容器内的/usr/share/nginx/html目录,这样两边的目录文件就可以做到实时同步了;无论任何一个地方的文件有变动,对方的目录也会跟着一起变动,并且数据始终一致;
在这里插入图片描述
在这里插入图片描述
可以看到上边两个图片中,两边目录中的文件已经同步了;

二、PV&PVC的使用

  持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统;
  持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存)。同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以挂载为 ReadWriteOnce、ReadOnlyMany、ReadWriteMany 或 ReadWriteOncePod)
  PV 卷的制备有两种方式:静态制备或动态制备。静态制备是事先已经创建好的pv,动态制备则是基于 StorageClass 来实现,为 PVC 申领动态制备一个存储卷;
  本案例使用静态制备的方式

1、在模拟的nfs服务端,创建几个静态的资源空间

#主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

2、创建PV,分别使用上述的几个目录;

apiVersion: v1
kind: PersistentVolume
metadata:name: pv01-10m
spec:capacity:storage: 10MaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/01server: 192.168.xxx.xxx
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv02-1gi
spec:capacity:storage: 1GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/02server: 192.168.xxx.xxx
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv03-3gi
spec:capacity:storage: 3GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/03server: 192.168.xxx.xxx

在这里插入图片描述

3、创建PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: nginx-pvc1
spec:accessModes:- ReadWriteManyresources:requests:storage: 200MistorageClassName: nfs

pvc会找到和所需容量相符的PV资源进行绑定,并且这种绑定也是一对一的关系;
在这里插入图片描述
可以看到,我们申领的是200M的存储,那最接近这个要求的就是pv02-1gi这个资源,那此次申领就使用了这个pv卷;
4、pod绑定pvc

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-deploy-pvcname: nginx-deploy-pvc
spec:replicas: 2selector:matchLabels:app: nginx-deploy-pvctemplate:metadata:labels:app: nginx-deploy-pvcspec:containers:- image: nginxname: nginxvolumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: nginx-pvc

这里pod是将容器内的/usr/share/nginx/html目录挂载到name=html的卷内,html卷使用的是我创建的nginx-pvc;也就是/usr/share/nginx/html目录内的文件会同步到/nfs/data/02目录;
在这里插入图片描述
在这里插入图片描述
从上述截图中可以看到,容器内的目录下的文件在nfs中也有了;

三、ConfigMap

  ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
  ConfigMap 可以将你的环境配置信息和容器镜像解耦,便于应用配置的修改。
  ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性;
  ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可考虑挂载存储卷或者使用独立的数据库或者文件服务。
  本案例使用configMap抽离容器的配置信息;
1、创建一个配置文件,名称为edis.conf;查看该配置文件内的信息:
在这里插入图片描述
2、基于此文件创建CM;

kubectl create cm redis-conf --from-file=redis.conf

3、创建pod,使用上述已经建好的configMap

apiVersion: v1
kind: Pod
metadata:name: redis
spec:containers:- name: redisimage: rediscommand:- redis-server- "/redis-master/redis.conf"  #指的是redis容器内部的位置ports:- containerPort: 6379volumeMounts:- mountPath: /dataname: data- mountPath: /redis-mastername: configvolumes:- name: dataemptyDir: {}- name: configconfigMap:name: redis-confitems:- key: redis.confpath: redis.conf

4、查看配置信息
在这里插入图片描述
在这里插入图片描述

# 登录redis,查看配置同步信息
kubectl exec -it redis -- redis-cli -a yes

登录redis,查看配置项

可以看到我CM中的配置已同步到了redis容器内;并且登录redis也能看到配置的信息;

四、secret

  Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
  由于创建的Secret 可以独立于使用它们的Pod,因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施,例如避免将敏感数据写入非易失性存储。
  Secret类似于ConfigMap,但是前者专门用于保存机密数据;
本案例使用阿里云作为镜像仓库,来通过设置的secret登录阿里云,并拉取镜像仓库的私有镜像;
1、首先在阿里云服务中要先上传镜像文件,并确保镜像文件是私有状态;
在这里插入图片描述
2、拉取镜像时,需要docker login命令登录阿里云服务,涉及到账号和密码,这里将登录账号信息存储在secret中;

kubectl create secret docker-registry my-secret ----docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=aliyun88000000 --docker-password=123456

这里我创建了一个my-secret的对象,在管理端查看效果如下:
在这里插入图片描述
在这里插入图片描述
3、创建pod应用


apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: registry.cn-hangzhou.aliyuncs.com/wtl-test/test-nginx:1.0imagePullPolicy: AlwaysimagePullSecrets:- name: my-secret  #登录密码从my-secret获取

pod创建时指定了镜像的仓库地址和密码;
4、检查pod启动情况
在这里插入图片描述
可以看到镜像已成功获取,并启动了pod应用;

相关文章:

K8s存储对象的使用

背景和概念 容器中的文件在磁盘上是临时存放的,这给在容器中运行较重要的应用带来一些问题: 当容器崩溃或停止时,此时容器状态未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。另外 在崩溃期间,kubelet 会…...

构建自动化API数据抓取系统

构建一个自动化API数据抓取系统是一个涉及多个技术领域的复杂任务。这样的系统不仅要求高效的数据获取能力,还需要有稳定的数据处理、存储和错误处理机制。 1. 需求分析 在开始构建之前,明确你的需求至关重要。你需要确定要抓取的API、数据的频率、数据的…...

【Qt知识】部分QWidget属性表格

QWidget是Qt库中所有图形用户界面组件的基类,它提供了大量属性以供自定义和配置控件的行为和外观。下面列出了一些主要的QWidget属性及其作用。 属性 作用 accessibleName 控件的辅助技术名称,用于无障碍访问。 accessibleDescription 控件的辅助技…...

【ARM64 常见汇编指令学习 19.1 -- ARM64 跳转指令 b.pl 详细介绍】

文章目录 ARM64 跳转指令 b.pl使用场景语法示例总结 ARM64 跳转指令 b.pl 在 ARMv8 架构中,b.pl 是一条条件分支(Branch)指令,它根据当前的状态寄存器中的条件标志执行跳转。b.pl 的全称是 Branch if Plus,即如果条件…...

WWDC24即将到来,ios18放大招

苹果公司即将在下周开全球开发者大会(WWDC),大会上将展示其人工智能技术整合到设备和软件中的重大进展,包括与OpenAI的历史性合作。随着大会的临近,有关iOS 18及其据称采用AI技术支持的应用程序和功能的各种泄露信息已经浮出水面。 据报道,苹果将利用其自主研发的大…...

C#中的空合并运算符与空合并赋值运算符:简化空值处理

在C#编程中,处理可能为null的值是一项常见的任务,尤其是在涉及数据库查询、Web服务调用或任何可能返回缺失数据的场景中。为了简化这类操作并提高代码的可读性,C# 8 引入了两个非常实用的运算符:空合并运算符 (??) 和 空合并赋值…...

数据结构:哈夫曼树及其哈夫曼编码

目录 1.哈夫曼树是什么? 2.哈夫曼编码是什么? 3.哈夫曼编码的应用 4.包含头文件 5.结点设计 6.接口函数定义 7.接口函数实现 8.哈夫曼编码测试案列 哈夫曼树是什么? 哈夫曼树(Huffman Tree)是一种特殊的二叉树&#xf…...

微信如何防止被对方拉黑删除?一招教你解决!文末附软件!

你一定不知道,微信可以防止被对方拉黑删除,秒变无敌。只需一招就能解决!赶快来学!文末有惊喜! 惹到某些重要人物(比如女朋友),被删除拉黑一条龙,那真的是太令人沮丧了&a…...

jar增量打包

jar增量打包 Linux环境下: 1.解压缩 jar -xvf jarname.jar(解压)2.打包 这时可以把要替换的lib包的内容粘帖进去,然后重新打jar包 jar -cvf0M jarname.jar .(重新压缩,-0是主要的)jar命令: …...

智慧医院物联网建设-统一管理物联网终端及应用

近年来,国家卫健委相继出台的政策和评估标准体系中,都涵盖了强化物联网建设的内容。物联网建设已成为智慧医院建设的核心议题之一。 作为医院高质量发展的关键驱动力,物联网的顶层设计与网络架构设计规划,既需要结合现代信息技术的…...

Debian的常用命令

Debian作为一个稳定、安全且高效的Linux发行版,被广泛应用于服务器和桌面操作系统中。对于系统管理员和开发者来说,熟练掌握Debian的常用命令能够大大提升工作的效率和系统的管理水平。本文将详细介绍一些常见且实用的Debian命令,帮助新手更好地管理和操作Debian系统。 系统…...

矩阵1-范数与二重求和的求和可交换

矩阵1-范数与二重求和的求和可交换 1、矩阵1-范数 A [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] A \begin{bmatrix} a_{11} &a_{12} &\cdots &a_{1n} \\ a_{21} &a_{22} &\cdots &a_{2n} \\ \vdots &\vdots …...

Python笔记 - *args和**kwargs

探索Python的*args和**kwargs 在Python中,函数可以接受任意数量的参数,而这要归功于*args和**kwargs的强大功能。这两个特性使得函数在处理不同数量的输入时变得更加灵活和高效。在这篇博客中,我们将详细介绍*args和**kwargs,并展…...

微信小程序实现图片转base64

在微信小程序中,图片转base63可以引入第三方插件; 也可以通过下边的方法转base64。 转换方法: imgToBase64(filePath) {return new Promise((resolve, reject) > {let baseFormat data:image/png;base64,let base64 wx.getFileSystem…...

os和os.path模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 目录也称文件夹,用于分层保存文件。通过目录可以分门别类地存放文件。我们也可以通过目录快速找到想要的文件。在Python中,并…...

链表题目练习----重排链表

这道题会联系到前面写的一篇文章----快慢指针相关经典问题。 重排链表 指针法 这道题乍一看,好像有点难处理,但如果仔细观察就会发现,这道题是查找中间节点反转链表链表的合并问题,具体细节有些不同,这个在反装中间链…...

【杂记-浅谈XSS跨站脚本攻击】

一、什么是XSS? XSS,Cross-site Scripting,跨站脚本攻击,是一种典型的Web程序漏洞利用攻击,攻击者利用Web程序对用户输入检查不足的漏洞将可执行恶意脚本注入网站或Web应用,当用户访问网页时触发恶意脚本的…...

VMware虚拟机与MobaXterm建立远程连接失败

VMware虚拟机与MobaXterm建立远程连接失败 首先可以检查一下是不是虚拟机的ssh服务并不存在 解决方法: 1.更新镜像源 yum -y update 这个过程会有点久,请耐心等待 2.安装ssh yum install openssh-server 3.启动ssh systemctl restart sshd 4.查…...

mysql undolog管理

在MySQL中,Undo Log(撤销日志)用于支持事务的回滚和MVCC(多版本并发控制)。为了避免Undo Log不断增长,影响系统性能,需要进行合理的清理。MySQL的Undo Log清理策略主要依赖于系统的配置参数和后…...

【Linux】进程2——管理概念,进程概念

1.什么是管理? 那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢? 很简单,先把进程描述起来,再把进程组织起来! 我们拿大学为例子 最典型的管理者——校长最典型的被管理…...

【C++】植物大战僵尸杂交版自动存档——防闪退存档消失

植物大战僵尸杂交版现已更新到v2.0.88,闪退问题还是偶有发生,参考网上现有的方案,简单实现了一个。 原理就是监控存档目录的文件变化,一旦有新的存档,则将其备份。如发生闪退,则还原备份即可。 原目录&…...

通过Excel,生成sql,将A表数据插入B表

文章目录 投机取巧的方式,进行表数据初始化通过navicat搜索A表数据,然后复制进excel中通过excel的函数方式,将该批量数据自动生成插入B表的sql语句然后一次性拷贝生成的sql语句,放进navicat中一次执行,直接完成数据初始化...

如何在MySQL中实现upsert:如果不存在则插入?

目录 1 使用 REPLACE 2 使用 INSERT ... ON DUPLICATE KEY UPDATE 使用 INSERT IGNORE 有效会导致 MySQL 在尝试执行语句时忽略执行错误 INSERT 。这意味着 包含 索引或 字段 INSERT IGNORE 中重复值的语句 不会 产生错误,而只是完全忽略该特定 命令。其明显目的是…...

MyBatis中 set标签

1、set标签特点: set标签用于更新语句中set标签解析为set关键字set可以去除跟新语句中无用的逗号通常是和if标签一起使用 2、set标签的使用 编写接口方法编写sql语句 注意 当set标签中有条件成立时就会附加set关键字,字段为null时该列不会被更新。se…...

mysql自带分页

select 查询列表 from 表 limit offset,pagesize; offset代表的是起始的条目索引,默认从0开始size代表的是显示的条目数offset(n-1)*pagesize -- 第-页 limit 0 5 -- 第二页 limit 5,5 -- 第三页 limit 10,5 -- 第n页limit(n-1)*pagesize,pagesize -- pages…...

小学一年级数学上册,我终于学完了

目录 一、背景二、过程1.我对课程中的一些知识的思考2.我对于产品的思考3.我对自己儿子与知识产品结合的思考4.产品反馈的那些有意思的数据 三、总结 一、背景 简约而不简单,即是曾经的再现,也是未来的延伸,未来已来,就在脚下。 …...

使用wireshark分析tcp握手过程

开启抓包 tcpdump -i any host 127.0.0.1 and port 123 -w tcp_capture.pcap 使用telnet模拟tcp连接 telnet 127.0.0.1 123 如果地址无法连接,则会一直重试SYN包,各个平台SYN重试间隔并不一致,如下: 异常站点抓包展示&#xff…...

在ArcGIS中,矢量数据有.shp,.mdb和.gdb,为啥建议使用gdb?

在ArcGIS中,矢量数据可以存储在多种格式中,如 .shp (Shapefile)、.mdb (Microsoft Access Database) 和 .gdb (Geodatabase)。每种格式都有其特定的用途和优缺点,但通常推荐使用 Geodatabase(.gdb)格式,原因如下: 1. 更高的数据容量和性能 容量: Shapefiles 和 MDB 文…...

C++STL---stack queue模拟实现

前言 对于这两个容器适配器的模拟实现非常简单,因为stack和queue只是对其他容器的接口进行了包装,在STL中,若我们不指明用哪种容器作为底层实现,栈和队列都默认是又deque作为底层实现的。 也就是说,stack和queue不管是…...

Spring Cloud系列——使用Sentinel进行微服务保护

文章目录 一、引言1. 雪崩问题的产生原因2. 解决雪崩问题的思路 二、微服务保护1. 服务保护方案1.1 请求限流1.2 线程隔离1.3 服务熔断 2. Sentinel2.1 安装2.2 微服务整合2.2.1 请求限流2.2.2 线程隔离①OpenFeign整合Sentinel②配置线程隔离 2.2.3 服务熔断①编写降级逻辑②配…...