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,一经查实,立即删除!

相关文章

04-Nacos-服务注册基于spring boot实现

官方参考 在不依赖spring cloud 组件基础上&#xff0c;单独的微服务项目&#xff0c;实现nacos接入 1、依赖文件pom.xml <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><…

RUST笔记: 动态链接库的创建和使用

生成动态链接库 // https://github.com/vvvm23/funny-shapes # 项目元信息 [package] name "funnyshapes" # 项目名称 version "0.1.0" # 版本号 edition "2021" # Rust语言版本# 更多配置信息可查阅&#xff1…

华为机考入门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…

【模板】拓扑排序

Problem: 【模板】拓扑排序 文章目录 思路解题方法复杂度Code 思路 拓扑排序模板 解题方法 初始化一个队列&#xff0c;将所有入度为0的顶点入队。从队列中取出一个顶点&#xff0c;并将其输出。对于该顶点的所有出边&#xff0c;将出边的终点的入度减1。如果某个顶点的入度变为…

269. 火星词典

Problem: 269. 火星词典 文章目录 思路解题方法复杂度Code 思路 首先&#xff0c;我们先将所有单词中出现的字符标记为 0&#xff0c;没有出现的标记为 1。然后&#xff0c;我们开始建图&#xff0c;对于每一个单词对&#xff0c;我们比较它们的前缀&#xff0c;直到找到第一个…

【笔试常见编程题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;分成两个链表。最后将偶数链表放在…

(每日持续更新)jdk api之InterruptedIOException基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真…

Python无人诊断治疗全套系统

Python无人诊断治疗全套系统的研发开发对于医疗行业具有重要性。以下是其重要性的几个方面&#xff1a; 提高诊断精确性&#xff1a;无人诊断系统利用大数据分析和人工智能技术&#xff0c;能够通过对病例的分析和比对&#xff0c;提供更准确的诊断结果。相比于传统的人工诊断&…

LeetCode第500题 - 键盘行

题目 给定一个单词列表&#xff0c;只返回可以使用在键盘同一行的字母打印出来的单词。 示例&#xff1a; 输入: [“Hello”, “Alaska”, “Dad”, “Peace”] 输出: [“Alaska”, “Dad”] 解答 class Solution {public String[] findWords(String[] words) {char[][] keybo…

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

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

【每日一题】最大合金数

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

【Spring Boot 3】【@Scheduled】动态修改定时任务时间

【Spring Boot 3】【@Scheduled】动态修改定时任务时间 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习…

Hadoop-MapReduce-源码跟读-客户端篇

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、从WordCount进入源码 用idea将源码加载进来后&#xff0c;找到org.apache.hadoop.examples.WordCount类&#xff08;快捷方法&…

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

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

Kafka消息流转的挑战与对策:消息丢失与重复消费问题

消息丢失和重复消费时分布式系统重的常见问题&#xff0c;如果处理不好会对业务造成很大的影响。比如用户下单是通过消息队列处理的&#xff0c;对于用户的订单来说&#xff0c;消息丢失会造成用户下单丢失&#xff0c;影响售卖&#xff0c;如果重复消费&#xff0c;可能会生成…

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

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

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

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

JVM篇----第九篇

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