k8s pod数据存储Volumes

一、说在前面的话

在 Kubernetes 的 Deployment 中,您可以使用多种类型的 Volumes 来管理 Pod 中的数据。
作用是用来共享目录及配置,不用在每个pod里进行配置。

本文主要概述怎么使用HostPath、PersistentVolumeClaim、ConfigMap。

二、k8s有哪些Volumes

来自chatgpt

以下是一些常见的 Volume 类型:1. **EmptyDir**: 这是一个临时目录,在 Pod 被调度到 Node 上时创建,Pod 终止时被删除。可以用于容器之间共享临时数据。2. **HostPath**: 将宿主机的文件或目录挂载到 Pod 中。在一些特定场景中可能会用到,但要注意宿主机文件的权限和共享问题。3. **PersistentVolumeClaim (PVC)**: PVC 是与持久卷 (Persistent Volume, PV) 绑定的声明,它表示 Pod 对持久卷的需求。通过 PVC,Pod 可以请求特定的持久存储。4. **ConfigMap**: ConfigMap 可以用于将配置文件或配置数据注入到 Pod 中。可以用于配置容器的环境变量、配置文件等。5. **Secret**: Secret 类型的 Volume 用于将敏感信息(如密码、凭据等)安全地注入到 Pod 中。6. **NFS**: 允许将 NFS (Network File System) 挂载到 Pod 中,用于实现持久化存储。7. **Azure Disk/Azure File**: Azure Cloud 提供的磁盘和文件存储,在 Azure Kubernetes Service (AKS) 中常用。8. **GCE Persistent Disk**: Google Cloud 提供的持久磁盘,在 Google Kubernetes Engine (GKE) 中常用。9. **AWS Elastic Block Store (EBS)**: Amazon Web Services (AWS) 提供的块存储,在 Amazon Elastic Kubernetes Service (EKS) 中常用。10. **Ceph RBD**: Ceph 是一个分布式存储系统,RBD (Rados Block Device) 可以用于在 Pod 中挂载 Ceph 存储。这些是 Kubernetes 中常见的 Volume 类型,您可以根据应用的需求选择合适的 Volume 类型来管理 Pod 的数据。

下面,我将选几种volumes进行详细说明。

三、PersistentVolumeClaim (PVC)

1、deployment.yaml

  • {{.Values.appName}} 为项目名称,这里都以xx-job为例。
  • 注意,这里有一个subPath,值是xx-job
    containers:       volumeMounts:- mountPath: /opt/xxx/{{ .Values.appName }}/resourcesname: volume-resourcessubPath: {{ .Values.appName }}volumes:- name: volume-resourcespersistentVolumeClaim:claimName: application-resources

2、创建pvc

在这里插入图片描述

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
# pvc的名称,对应上文的claimNamename: application-resources
# 命名空间,必须填写,和Pod的namespace在一起namespace: java-service
spec:accessModes:- ReadWriteManyresources:requests:storage: 10Gi# 需要先创建存储类:Storage Class,或者指定已创建好的volumeNamestorageClassName: managed-nfs-storagevolumeMode: Filesystem# 如果没有像下面这样指定volumeName,则需要指定存储类storageClassName# volumeName: nfs-mvn-repo

在这里插入图片描述
创建成功,见下图:
在这里插入图片描述

如此,它会自动创建pv:pvc-25c8493c-d820-49c4-b523-111c86ceaa6d
在这里插入图片描述
在这里插入图片描述

验证是否已创建了持久化卷。

在这里插入图片描述

  • 可以看到,目录下已创建了子目录xx-job。

# 挂载nfs
mount -t nfs 192.168.80.170:/srv/nfs/disk /mnt/nfs/# 各个pod之间共享目录xx-job下的内容
root@dev-vm-k8s-master:/mnt/nfs/java-service-application-resources-pvc-25c8493c-d820-49c4-b523-111c86ceaa6d# ll
total 8
drwxrwxrwx  3 root root   28 Aug  2 09:30 ./
drwxr-xr-x 33 root root 4096 Aug  3 00:35 ../
drwxrwxrwx  2 root root   10 Aug  2 09:30 xx-job/

四、HostPath

使用示例:

    containers:volumeMounts:- mountPath: /etc/localtimename: volume-localtimevolumes:- hostPath:path: /etc/localtimetype: ''name: volume-localtime

五、ConfigMap

可以用于将配置文件或配置数据注入到 Pod 中。可以用于配置容器的环境变量、配置文件等

deployment.yaml引用ConfigMap有好几种方式:

  • 使用ConfigMap中的配置
     containers:envFrom:- configMapRef:name: {{ .Values.appName }}
  • 使用特定的配置项
     containers:env:- name: ENV_VAR_NAMEvalueFrom:configMapKeyRef:name: {{ .Values.appName }}key: key-in-configmap
  • 挂载的方式
     containers:volumeMounts:- mountPath: /opt/xxx/{{ .Values.appName }}/configname: config-volumereadOnly: truevolumes:- configMap:name: {{ .Values.appName }}name: config-volume

创建ConfigMap

在这里插入图片描述

kind: ConfigMap
apiVersion: v1
metadata:name: xx-jobnamespace: java-servicelabels:app: xx-job
data:spring.profiles.active: devapplication.yml: |-spring:datasource:url: jdbc:log4jdbc:mysql://192.168.8.19:3306/xxl_job_k8s?zeroDateTimeBehavior=CONVERT_TO_NULL&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456driver-class-name: net.sf.log4jdbc.DriverSpy

Pod节点可以读取到环境变量spring.profiles.active,其值为dev。

另外,你在目录/opt/xxx/xx-job/config已挂载了application.yml和spring.profiles.active。

  • 进入pod容器里验证,可以看到已经把ConfigMap(xx-job)内的key、file挂载上来。
/opt/xxx/xx-job/config # ls
spring.profiles.active application.yml

六、总结

不同的Volumes,适用于不同的数据或文件的共享。
在我们的开发过程中,会遇到各种各样的情景:

  • 环境变量
  • 第三方jar包所依赖的文件,比如Hanlp的data数据
  • 支付所需的证书文件
  • 字节码技术的java agent jar包,用于数据透传、灰度发布、apm等场景,比如pinpoint/skywalking、transmittable-thread-local等等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/22872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OC实现GZIP压缩及解压缩

这恍恍的天日晒的大地嗞嗞的作响。这湉湉的阴雨下的祖国母亲到处洪水泛滥。人本不该有三六九等,可这丑陋的阴雨竟然选择性的泄洪到无辜的县区以示人却有三六九等。谁的财产不是财产,谁的生命不是生命?谁特妈的不是母亲养大的? 一首…

C#核心知识回顾——21.归并排序

理解递归逻辑 一开始不会执行sort函数的 要先找到最小容量数组时 才会回头递归调用Sort进行排序 基本原理 归并 递归 合并 数组分左右 左右元素相比较 一侧用完放对面 不停放入新数组 递归不停分 分…

《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 1.1 角色 AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。ConcreteFactory(具体工厂&#xf…

Python学习笔记:If、While

1.if if的基本结构: if xxxxx:xxxxxxx elif xxxx:xxxxxxx else:xxxxxxx 通过boolean判断的实例 is_hot True is_cold True if is_hot:print("its a hot day\nDrink plenty of water") elif is_cold:print("its a cold day\nWear warm clothes&…

【网络|TCP】三次握手、四次握手

TCP是一种面向连接的可靠的传输协议,建立和断开TCP连接时需要进行握手的过程。其中,TCP的连接建立需要进行三次握手,而连接断开则需要进行四次握手。 解释 三次握手 第一次握手:客户端发送一个SYN(同步)报…

vue el-input 使用 回车键会刷新页面的问题

场景: vue项目中 在输入框输入字符并按下回车键搜索时,不会进行搜索, 而是会刷新页面 原因: 当form表单中只有一个input时,按下回车建会自动触发页面的提交功能, 产生刷新页面的行为 解决: 在…

问题聚集度Hive SQL

问题聚集度:最小的分母占比,贡献最多的分子占比,即小规模贡献大问题。 selectcity_name,user_id,rf_type,deal_ord_cnt,sale_amt,rf_ord_cnt,rf_amt,rf_ra,rf_amt_ra,rf_all,ord_cnt_all,rf_gx,ord_cnt_gx,del_gx,row_number() over(partiti…

Spring 事务详解(注解方式)

目 录 序言 1、编程式事务 2、配置声明式事务 2.1 基于TransactionProxyFactoryBean的方式(不常用,因为要为每一个类配置TransactionProxyFactoryBean) 2.2 基于AspectJ的XML方式(常用,可配置在某些类下的所有子…

docker: CMD和ENTRYPOINT的区别

ENTRYPOINT: 容器的执行命令(属于正统命令) 可以使用--build-arg ENVIROMENTintegration参数覆盖 ocker build --build-arg ENVIROMENTintegration 两者同时存在时 CMD作为ENTRYPOINT的默认参数使用外部提供参数会覆盖CMD提供的参数。 CMD单…

无涯教程-Perl - unless...else 语句函数

Perl 除非语句后可以跟可选的 else 语句,该语句在布尔表达式为true时执行。 unless...else - 语法 Perl编程语言中的unless... else 语句的语法为- unless(boolean_expression) {# statement(s) will execute if the given condition is false } else {# stateme…

编程导航算法村第八关 | 树的深度优先遍历

编程导航算法村第八关 | 树的深度优先遍历 判断两棵树是否相同 LeetCode100:给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。思路&…

Go重写Redis中间件 - Go实现Redis持久化

GO实现Redis持久化 项目开发到这里,我们的下一步就是实现Redis的持久化落盘功能,Redis是一个内存型的数据库,在之前我们实现的单机版Redis如果把进程杀掉,我们通过GET、SET指令存储的数据都将不复存在,数据只存在内存的map里面,重启之后什么都没有了 我们现在的目标就是…

Net Core Webapi 使用Redis实现连续登录失败N次 锁定账号N分钟

由于最近项目发现有尝试密码登录的操作,需要设置密码复杂度及账号多次登录失败,将账号锁定N分钟后,才可以继续登录操作。 开始思路是使用登录记录数据处理连续登录失败的问题,如果频繁请求可能会导致数据库查询变慢,影…

322. 零钱兑换

322. 零钱兑换 原题链接:完成情况:一开始错误原因 解题思路:参考代码:__322 零钱兑换__错误思路还得是dp去做 原题链接: 零钱兑换 完成情况: 一开始错误 原因 /*解题思路:1.先sort一下coins…

python列表处理方法

原始文件: id start end a1 10 19 a1 25 34 a2 89 124 a2 149 167 a2 188 221目的文件: a1 1 10 a1 16 25 a2 1 36 a2 61 79 a2 100 133解释说明: 原始文件是gff3文件的一部分,第一列id是基因的名字,第二列和第三列分…

chatGPT在软件测试中应用方式有哪些?

ChatGPT可以在软件测试中以以下方式应用: 1. 自动化对话测试:ChatGPT可以用于自动化对话测试,模拟用户与软件系统进行实时对话。它可以扮演用户的角色,向系统发送各种类型的指令和请求,并验证系统的响应是否符合预期。…

react ant icon的简单使用

refer: 快速上手 - Ant Design 1.引入ant npm install antd --save 2.在页面引用: import { StarOutlined } from ant-design/icons; 如果想要引入多个icon,可以这样书写: import { UserOutlined, MailOutlined, PieChartOutlined } fr…

2023年第三届工业自动化、机器人与控制工程国际会议 | IET独立出版 | EI检索

会议简介 Brief Introduction 2023年第三届工业自动化、机器人与控制工程国际会议(IARCE 2023) 会议时间:2023年10月27 -30日 召开地点:中国成都 大会官网:www.iarce.org 2023年第三届工业自动化、机器人与控制工程国际…

SocialFi 的开发中如何利用 NFTScan API 获取 NFT 数据

SocialFi 作为社交媒体与 Web3 的创新融合,致力于构建更加开放去中心化的社交平台。它赋能用户拥有数据控制权、实现内容价值,并通过代币经济建立起激励与治理机制,这正是 Web3 社交的独特魅力所在。SocialFi 为我们描绘了一个更加用户驱动、…

数据安全能力框架模型-详细解读(三)

数据安全能力框架内涵 “奇安信数据安全能力框架”体现了数据安全治理从组织机构安全治理,到数字化环境具体管控、分析能力分层逐步落实的工程方法。 它以企业数据安全的战略目标和风险容忍度为输入,明确数据安全治理的组织;以合规与治理需…