K8s-持久化(持久卷,卷申明,StorageClass,StatefulSet持久化)

POD 卷挂载

apiVersion: v1
kind: Pod
metadata:name: random-number
spec:containers:- image: alpinename: alpinecommand: ["/bin/sh","-c"]args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]volumeMounts:- mountPath: /optname: data-volumevolumes: #这里声明了卷- name: data-volumehostPath:path: /data #这个卷对应的主机路径type: Directory #这个路径的类型为文件类型

上面这个POD创建以后会生成一些随机数写到容器的/opt/number.out,由于我们将/opt路径映射到了主机目录/data所以我们在这个路径也能看到它。
在这里插入图片描述
特别注意:这里我们定义的POD声明的是主机路径,它只在单节点能够正常工作,因为可能只有这个节点才存在data目录。又比如我们部署了三个POD,被分配到了不同的Worker节点,这个POD的工作依赖了一个底层环境,这个环境是一些库函数需要安装到指定目录下,这个时候不可能去每个工作节点都安装一遍,因此这里就需要配置一些集群存储方案,主要目的是完成文件同步
Kubernetes支持多种不同类型的存储解决方案:

  • NFS
  • ClusterFS
  • Flocker
  • Ceph FS
  • AWS EBS
  • Azure
  • GCP
    比如是aws 存储,对应的yml可以向下面这样定义:
volumes:
- name: data-volumeawsElasticBlockStore:volumeID: <VOLUME-ID>fsType: ext4

不同的云厂商会提供一个yml标准供我们使用。

那如果没有云厂商,我们也可以自己建一个分布式文件共享系统NFS。nfs集群搭建

#前置条件你的这些节点能够相互通信
#选择一个节点作为Master 安装工具
yum install -y nfs-utils rpcbind
#创建一个目录将这个目录暴露共享
mkdir -p /usr/local/data
#修改这个配置
vim /etc/exports
##填入下面的值 (rw,sync)表示这个文件可读可写,sync同步
#ip为master的ip,24为掩码
/usr/local/data ip/24 (rw,sync) 
#在Master节点启动
systemctl start nfs.service
systemctl start rpcbind.service
systemclt enable nfs.service 
systemclt enable rpcbind.service 
#从节点上安装nfs-utils即可
yum install -y nfs-utils
#可以查看这个节点有哪些共享目录
showmount -e 192.168.163.132
#从节点将远程目录挂载到本地 /usr/local/data 本地路径推荐和远程路径一致
mount 192.168.163.132:/usr/local/data /usr/local/data

对应的配置其实和主机路径是一样的,只是配置共享路径:

spec:volumes:- name : web-apphostPath:path:/usr/local/data#共享目录,这个目录的修改会被NFS同步到其它节点

持久卷 Persistent Volume

通过POD指定Volume 的时候我们需要配置每个POD的主机路径,那如果我们后面需要修改主机的路径就会修改每个POD的yml。并且我们还要知道主机路径的具体细节,持久卷就是为了屏蔽这些事情。持久卷是由管理员配置的群集范围的存储卷池,供在群集上部署应用程序的用户使用。用户可以使用持久卷声明从此池中选择存储。
1 先定义一个持久卷

apiVersion: v1
kind: PersistentVolume
metadata:name: pv-vol1
spec: accessModes:- ReadWriteOncecapacity:storage: 1GihostPath:path: /tmp/datapersistentVolumeReclaimPolicy: Retain

accessModes:定义了存储设备的访问模式有下面这些取值

  • ReadWriteOnce:存储卷可读可写,但只能被一个节点上的 Pod 挂载
  • ReadOnlyMany:存储卷只读不可写,可以被任意节点上的 Pod 多次挂载
  • ReadWriteMany:存储卷可读可写,也可以被任意节点上的 Pod 多次挂载。
kubectl create –f pv-definition.yaml
#查看持久卷
kubectl get persistentvolume

生产环境中可能会使用云存储例如:

apiVersion: v1
kind: PersistentVolume
metadata:name: pv-vol1
spec: accessModes:- ReadWriteOncecapacity:storage: 1GiawsElasticBlockStore:volumeID: <VOLUME-ID>fsType: ext4

2 定义好了持久卷,我们还需要创建持久卷申明
创建持久卷声明后, Kubernetes将根据请求和卷上设置的属性将持久卷绑定到声明。每个持久卷声明都绑定到一个持久卷。在绑定的过程中会根据是否有足够的容量,访问模式是否匹配,卷模式这些条件匹配到对应的持久卷。
单个声明有多个可能得匹配项,但如果希望专门使用特定得卷, 可以使用标签与选择器绑定。如果所有其他条件都匹配,并且没有更好的选项, 则较小的声明可能绑定到较大的卷。

如果没有可用的卷,则永久卷声明将保持Pending挂起状态, 直到有更新的卷可供群集使用。一旦有更新的卷可用,声明将自动绑定到新的可用卷。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 500Mi
kubectl create –f pvc-definition.yaml
#查看申明
kubectl get persistentvolumeclaim
kubectl get pvc
#删除申明
kubectl delete persistentvolumeclaim mypvc

删除声明, 可以选择要对卷执行的操作,持久卷persistentVolumeReclaimPolicy: Retain进行了指定

  • 默认情况下, 它设置为保留Retain。持久卷将一直保留,直到管理员手动将其删除。但它不能被任何其他声明重复使用。
  • 可以被自动删除Delete。一旦删除了声明,卷也将被删除。从而释放终端存储设备上的存储空间。
  • 第三种是Recycle。在这种情况下, 数据卷中的数据将在可用于其他声明之前被擦除。
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: myfrontendimage: nginxvolumeMounts:- mountPath: "/var/www/html"name: mypdvolumes:- name: mypdpersistentVolumeClaim:claimName: mypvc

如果系统里的存储资源非常多,PVC去遍历查找合适的PV会比较麻烦,可以通过给PV和PVC添加storageClassName进行匹配。
示例如下:

apiVersion: v1
kind: PersistentVolume
metadata:name: task-pv-volumelabels:type: local
spec:storageClassName: manualcapacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: task-pv-claim
spec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 3Gi

存储类 Storage Class

假设生产环境完全上云,每次创建PV之前, 用户都必须在云上先申请存储空间。
每次应用程序需要存储时,要先在云平台购买存储空间,然后手动创建对应的持久卷定义文件。这Storage Class就是为了解决这一问题,StorageClass, 可以定义一个配置器provisioner,用来自动在云平台上配置存储卷,并在pvc创建时将存储附加到Pod,其实也就是将手动创建PV的过程自动化了。
1 创建StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: gce-pd
provisioner: kubernetes.io/gce-pd

provisioner取决于所使用的平台,

  • 公有云平台如谷歌云使用kubernetes.io/gce-pd
  • 自建nfs平台使用k8s-sigs.io/nfs-subdir-external-provisioner
    2 使用StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc
spec:accessModes:- ReadWriteOncestorageClassName: gce-pdresources:requests:storage: 500Mi

StatefulSet 有状态集

StatefulSet类似于ReplicaSet, 基于模板创建, 可以扩容和缩小,执行滚动更新和回滚。它主要是为了解决依赖关系的问题。使用StatefulSet将按顺序创建Pod。在部署第一个Pod后, 等待直到处于运行和就绪状态,才部署下一个Pod。
比如我们需要部署一个高可用reids, 一个主节点,一个从节点,从节点也有自己的备份

apiVersion: apps/v1
kind: StatefulSet
metadata:name: redislabels: app: redis
spec:serviceName: redis-hselector: matchLabels:app: redisreplicas: 3template:metadata:labels: app: redisspec:containers:- name: redisimage: redis

在这里插入图片描述

kubectl create -f statefulset-def.ymlkubectl get pod -w
#查看StatefulSet 
kubectl get sts
#删除
kubectl delete sts redis

StatefulSet 持久化

假设我们希望数据库拥有主从备份和读写分离。那么StatefulSet下的每一个Pod都应该有自己单独的卷。Pod不希望共享数据, 每个Pod都需要自己的本地存储。则可以定义一个持久化的模板,来进行工作。

apiVersion: apps/v1
kind: StatefulSet
metadata:name: redislabels: app: redis
spec:serviceName: redis-hselector: matchLabels:app: redisreplicas: 3template:metadata:labels: app: redisspec:containers:- name: redisimage: redisvolumeMounts: - mountPath: /dataname: data-volumevolumeClaimTemplates: #重点在于这里的定义- metadata: name: data-volume spec: storageClassName: gce-pdaccessModes: - ReadWriteManyresources: requests: storage: 100Mi

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

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

相关文章

华为机考入门python3--(3)牛客3-明明的随机数

分类&#xff1a;集合、排序 知识点&#xff1a; 集合添加元素 set.add(element) 集合转列表 list(set) 列表排序 list.sort() 题目来自【牛客】 N int(input().strip()) nums set()for i in range(N):nums.add(int(input().strip()))# 集合转列表 nums_list l…

眼底增强型疾病感知蒸馏模型 FDDM:无需配对,fundus 指导 OCT 分类

眼底增强型疾病感知蒸馏模型 FDDM&#xff1a;fundus 指导 OCT 分类 核心思想设计思路训练和推理 效果总结子问题: 疾病特定特征的提取与蒸馏子问题: 类间关系的理解与建模 核心思想 论文&#xff1a;https://arxiv.org/pdf/2308.00291.pdf 代码&#xff1a;https://github.c…

【笔试常见编程题02】字符串中找出连续最长的数字串、数组中出现次数超过一半的数字、计算糖果、进制转换

1. 字符串中找出连续最长的数字串 读入一个字符串str&#xff0c;输出字符串str中的连续最长的数字串 输入描述 个测试输入包含1个测试用例&#xff0c;一个字符串str&#xff0c;长度不超过255。 输出描述 在一行内输出str中里连续最长的数字串。 示例 1 输入 abcd12345ed125s…

java数据结构与算法刷题-----LeetCode328. 奇偶链表

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 将链表按奇偶顺序&#xff0c;分成两个链表。最后将偶数链表放在…

计算机网络-编制与调制(基带信号 基带传输 宽度信号 宽度传输 编码 调制 )

文章目录 基带信号与宽带信号编码与调制数字数据编码为数字信号数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号小结 基带信号与宽带信号 信道上传输的信号除了可以分为数字信号和模拟信号&#xff0c;也可以分为基带信号和宽带信号&#xff0c;只是分类…

【每日一题】最大合金数

文章目录 Tag题目来源解题思路方法一&#xff1a;二分枚举答案 写在最后 Tag 【二分枚举答案】【数组】【2024-01-27】 题目来源 2861. 最大合金数 解题思路 方法一&#xff1a;二分枚举答案 思路 如果我们可以制造 x 块合金&#xff0c;那么一定也可以制造 x-1 块合金。于…

支持下一代网络IpV6的串口服务器,IpV6串口485接口转网口

和IPv4比较&#xff0c;IPv6有两个极具吸引力的特点&#xff1a;一个是IPv6采用的128位地址格式&#xff0c;而IPv4采用32位的地址格式&#xff0c;因此IPv6使地址空间增大了296&#xff1b;另一个是IPv6物联网数据业务具有更强的支持能力&#xff0c;成为未来物联网的重要协议…

Ps:创建基于饱和度的蒙版

能够区分图像上哪些区域的饱和度高&#xff0c;哪些区域的饱和度低&#xff0c;在调色过程中是相当有用的。 比如&#xff0c;使得饱和度高的区域更加饱和&#xff0c;可增加图像色彩反差&#xff0c;让画面更引人注目。 或者&#xff0c;使得饱和度区域趋于饱和&#xff0c;让…

技术书评和笔记【01】脑机接口-电路与系统 【2020版】

前言: 荷兰作者,Amir Zjajo博士,毕业于荷兰代尔夫特理工大学,方向 面向移动健康的低功耗混合型号电路与系统,以及,面向认知的神经形态电路。 ,脑机接口 - 电路与系统一书,系统介绍了,脑机接口电路与系统的实现技术,尤其,提到了量产和设计的问题,难能可贵,摘录如…

JVM篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、分代收集算法二、新生代与复制算法三、老年代与标记复制算法前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、分代…

MySQL-删除重复数据

在实际应用中&#xff0c;遇到一个这样的问题&#xff0c;MySQL中存储的数据为资讯类数据&#xff0c;在页面展示时会出现多个平台的新闻报导相同的内容&#xff0c;导致页面会出现重复数据。因为数据是每天定期更新&#xff0c;所以最快捷有效的方式是在更新完数据后增加一个去…

YOLOv8融合改进 更换检测头同时改进C2f模块

一、Detect_DyHead检测头和C2f-EMSC,C2f-EMSCP模块 详细介绍和代码在往期的博客里: Detect_DyHead: (YOLOv8改进检测头Detect为Detect_Dyhead-CSDN博客) C2f-EMSC和C2f-EMSCP: (YOLOv8改进之多尺度转换模块C2f-EMSC和C2f-EMSCP-CSDN博客) 二、算法实现 1、将检测…

QT之 QDebug 调试(一)

在QT中&#xff0c;进行调试&#xff0c;则需要在头文件地方加上 #include <QDebug> 加上之后&#xff0c;在编译之后则其输出的信息则在应用程序输出那里显示信息。 其QDebug 信息调试则如&#xff1a; qDebug() << " 需要插入的信息 "…

RPC教程 7.服务发现与注册中心

0.前言 这一节的内容只能解决只有一个服务的情况。要是有多个服务(即是多个结构体&#xff09;这种就解决不了&#xff0c;也即是没有服务ip地址和服务实例的映射关系。 1.为什么需要注册中心 在上一节中&#xff0c;客户端想要找到服务实例的ip,需要硬编码把ip写到代码中。…

猿媛员的专属春联来咯

我们“因程序汇聚&#xff0c;因猿份相识”&#xff0c;今天来给辛苦了一年的“猿媛员”们送上几幅恶搞对联&#xff0c;为图一笑 &#x1f604; 闲言少叙&#xff0c;上对联 龙行多福 上联&#xff1a;龙龙龙龙龙龙龙 下联&#xff1a;福福福福福福福 形象版 上联&#…

centos 7安装MySQl

本文参考借鉴&#xff1a;https://cloud.tencent.com/developer/article/2353312&#xff0c;非常赞&#xff01; 为了避免权限不足的问题&#xff0c;建议切换至root用户进行安装 1.MySQL的清理与安装 查看是否存在MySQL服务 安装mysql之前&#xff0c;需要先看看要安装系…

【极数系列】Flink搭建入门项目Demo 秒懂Flink开发运行原理(05)

文章目录 引言1.创建mavenx项目2.包结构3.引入pom依赖4.增加log4j2.properties配置5.创建主启动类6.构建打jar包7.flinkUI页面部署 引言 gitee地址&#xff1a;https://gitee.com/shawsongyue/aurora.git 源码直接下载可运行&#xff0c;模块&#xff1a;aurora_flink Flink 版…

phar反序列化漏洞

基础&#xff1a; Phar是一种PHP文件归档格式&#xff0c;它类似于ZIP或JAR文件格式&#xff0c;可以将多个PHP文件打包成一个单独的文件&#xff08;即Phar文件&#xff09;。 打包后的Phar文件可以像普通的PHP文件一样执行&#xff0c;可以包含PHP代码、文本文件、图像等各…

Python爬虫---Scrapy框架---CrawlSpider

CrawlSpider 1. CrawlSpider继承自scrapy.Spider 2. CrawlSpider可以定义规则&#xff0c;再解析html内容的时候&#xff0c;可以根据链接规则提取出指定的链接&#xff0c;然后再向这些链接发送请求&#xff0c;所以&#xff0c;如果有需要跟进链接的需求&#xff0c;意思就是…

Redis实现多种限流算法

一 常见限流算法 1 固定窗口限流 每一个时间段计数器&#xff0c;当计数器达到阈值后拒绝&#xff0c;每过完这个时间段&#xff0c;计数器重置0&#xff0c;重新计数。 优点&#xff1a;实现简单&#xff0c;性能高&#xff1b; 缺点&#xff1a;明显的临界问题&#xff0c…