Kubernetes从零到精通(14-Storage)

存储简介

        在Kubernetes中,存储是一个关键的部分,用于持久化应用程序的数据。Kubernetes的存储模型支持多种存储类型,并且能根据应用程序的需求动态地提供存储资源。以下是Kubernetes存储的基本概念和机制。

        Kubernetes支持很多类型的卷。Pod可以同时使用任意数目的卷类型。临时卷类型的生命周期与Pod相同,但持久卷可以比Pod的存活期长。当Pod不再存在时,Kubernetes也会销毁临时卷不过Kubernetes不会销毁持久卷。对于给定Pod中任何类型的卷,在容器重启期间数据都不会丢失。

存储类型

        Kubernetes支持的主要存储类型包括:

临时存储(EphemeralStorage):

如Pod的EmptyDir卷,随着Pod的生命周期结束而丢失。

应用场景:缓存数据或临时文件,不需要持久化的场景。

持久化存储(PersistentStorage):

通过持久卷(PersistentVolume,PV)和持久卷声明(PersistentVolumeClaim,PVC)来管理。

应用场景:数据库、文件存储等需要持久化数据的场景。

临时卷

downwardAPI

        downwardAPI的用法可以回顾 Kubernetes从零到精通(05-Pod)中的Downward API卷。在这类卷中,所公开的数据以纯文本格式的只读文件形式存在。

configMap、secret

        用于挂载配置文件或敏感信息,如密码、令牌等。配置文件以键值对的方式存储,并且可以通过卷挂载到Pod中。用法可以回顾 Kubernetes从零到精通(13-Configmap、Secret)中的挂载文件。

emptyDir

        每次Pod启动时创建一个新的空目录。Pod删除时,数据也会被删除。用于存储Pod运行时的临时数据。配置示例如下:

apiVersion: v1
kind: Pod
metadata:name: shared-pod
spec:containers:- name: container1image: busyboxcommand: ['sh', '-c', 'echo Hello from container1 > /usr/share/message && sleep 3600']volumeMounts:- mountPath: /usr/sharename: shared-volume- name: container2image: busyboxcommand: ['sh', '-c', 'cat /usr/share/message && sleep 3600']volumeMounts:- mountPath: /usr/sharename: shared-volumevolumes:- name: shared-volumeemptyDir: {}             ##定义emptyDir类型

持久卷 

        存储的管理是一个与计算实例的管理完全不同的问题。 PersistentVolume子系统为用户和管理员提供了一组 API,将存储如何制备的细节从其如何被使用中抽象出来。 为了实现这点,引入了两个新的 API 资源:PersistentVolume和PersistentVolumeClaim。

PersistentVolume(PV,持久卷)       

        PV是集群中的持久存储资源,管理员预先创建并提供给集群中的应用使用。

        PV是集群级别的资源,与Pod的生命周期无关,它独立存在,能够在Pod之间共享数据。

        PV有两种方式创建:管理员手动创建、使用存储类(Storage Class)来动态制备。

PersistentVolumeClaim(PVC,持久卷声明)    

        PVC是用户请求存储的方式。用户通过声明一个PVC,向Kubernetes请求一块符合指定大小和访问模式的存储。

        PVC绑定到一个PV时,Pod可以通过该PVC来访问持久化存储。

持久卷的类型

        PV持久卷是用插件的形式来实现的。Kubernetes目前主要支持以下插件:

csi - 容器存储接口(CSI)
fc - Fibre Channel(FC)存储
hostPath - HostPath卷(仅供单节点测试使用;不建议在生产环境使用,涉及到安全等问题)
iscsi - iSCSI(IP上的 SCSI)存储
local - 节点上挂载的本地存储设备
nfs - 网络文件系统(NFS)存储

持久卷的访问模式

        Kubernetes支持多种存储访问模式,允许用户根据具体需求选择存储的使用方式:

ReadWriteOnce (RWO):卷可以被单个节点以读写模式挂载。仍然可以被在同一节点上运行的多个Pod访问。

ReadOnlyMany (ROX):卷可以被多个节点以只读模式挂载。

ReadWriteMany (RWX):卷可以被多个节点以读写模式挂载。

ReadWriteOncePod (RWOP):卷可以被单个 Pod 以读写方式挂载。整个集群中只有一个Pod可以读取或写入。

        不同的插件所能提供的访问模式有所不同,具体要看官方的更新说明。

持久卷的回收策略

        目前的回收策略有:

Retain -- 手动回收。当删除pvc的时候,pv仍然存在,处于released状态,但是它不能被其他pvc绑定使用,里面的数据还是存在的。

Delete -- 删除存储卷。当删除pvc的时候,pv不存在。

持久卷的阶段Phase

        每个持久卷会处于以下阶段(Phase)之一:

Available:卷是一个空闲资源,尚未绑定到任何pvc

Bound:该卷已经绑定到某pvc

Released:所绑定的pvc已被删除,但是关联存储资源尚未被集群回收

Failed:卷的自动回收操作失败

存储类(Storage Class)

        StorageClass用于动态创建PV。它定义了存储提供者的类型和配置,如Amazon EBS、Google Persistent Disks、NFS等。
        动态存储分配时,Kubernetes根据PVC和关联的StorageClass自动创建PV。不需要管理员提前手动创建PV。

持久卷配置示例

        以下提供两个示例,一个不使用StorageClass,一个使用StorageClass。通用做法是使用StorageClass动态制备。

1.不使用StorageClass的静态制备

        1.1 创建PV:

apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv
spec:capacity:            #PV的容量,设定为1Gistorage: 1GiaccessModes:         #持久卷的访问模式- ReadWriteOncepersistentVolumeReclaimPolicy: Retain   #持久卷的回收策略hostPath:                #持久卷的类型path: "/mnt/data"      

        1.2 创建PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:          #PVC请求与PV相同的访问模式- ReadWriteOnceresources:requests:            #请求1Gi的存储容量storage: 1Gi

        1.3 在Pod中使用PVC:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:         #PVC被挂载到容器中- mountPath: "/usr/share/nginx/html"name: my-volumevolumes:- name: my-volumepersistentVolumeClaim:    #使用之前创建的PVCclaimName: my-pvc

2.使用StorageClass的动态制备

         2.1 创建StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: my-storage-class
provisioner: kubernetes.io/nfs  #指定了存储供应器为NFS
parameters:                     #NFS服务器和路径等参数server: nfs-server.example.compath: /exported/path

       2.2 创建PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-dynamic-pvc
spec:accessModes:         #持久卷的访问模式- ReadWriteManyresources:requests:storage: 5Gi       #请求5Gi的存储容量storageClassName: my-storage-class  #使用上面的StorageClass来动态创建PV

        2.3 在Pod中使用PVC:

apiVersion: v1
kind: Pod
metadata:name: dynamic-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:           #PVC被挂载到容器中- mountPath: "/usr/share/nginx/html"name: dynamic-volumevolumes:- name: dynamic-volumepersistentVolumeClaim:    #使用通过StorageClass动态创建的PVCclaimName: my-dynamic-pvc

 卷快照

        VolumeSnapshotContent、VolumeSnapshot是Kubernetes中用于管理和操作存储卷快照的关键CRD对象资源。快照是一种用于捕获持久卷(Persistent Volume,PV)特定时间点状态的技术,常用于备份和恢复数据的场景。卷快照仅支持树外CSI卷插件,树内卷插件已被弃用。

VolumeSnapshotContent

        VolumeSnapshotContent是Kubernetes中用于存储快照实际内容的对象。它是快照的实际后端表示,通常由存储提供商创建并管理。它类似于持久卷(PV)。

        同样的,快照可以通过两种方式进行制备:管理员手动创建的预制备、使用卷快照类VolumeSnapshotClass)的动态制备,PVC中动态获取快照,而不用使用已经存在的快照

VolumeSnapshot

        VolumeSnapshot是用户发起的存储卷快照的对象。它代表了用户对特定持久卷(PV)的快照请求。VolumeSnapshot本身并不包含数据,它只是一个指向快照数据的抽象对象。它类似于持久卷声明(PVC)。

卷快照类(VolumeSnapshotClass)

        VolumeSnapshotClass是定义快照特性和存储系统之间的配置类,也是CRD对象资源。它类似于StorageClass,用于定义如何管理存储系统中的快照。不同的存储系统可能支持不同的快照操作,如retain(保留快照)、delete(删除快照),以及其他特性。

卷快照配置示例

1.不使用VolumeSnapshotClass的静态制备

        1.1 创建VolumeSnapshotContent:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:name: test-snapshot-content
spec:deletionPolicy: Delete    driver: csi-hostpath      source:snapshotHandle: xxxxxxxx  #底层外部卷快照的唯一标识符,引用实际的存储快照volumeSnapshotRef:name: test-snapshotnamespace: default

        1.2 创建VolumeSnapshot:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:name: test-snapshotnamespace: default
spec:source:volumeSnapshotContentName: test-snapshot-content    #引用上面创建的资源

    2.使用VolumeSnapshotClass的动态制备

        2.1 创建VolumeSnapshotClass:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:name: csi-hostpath-snapclass
driver: csi-hostpath
deletionPolicy: Delete

        2.2 创建VolumeSnapshot:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:name: new-snapshotnamespace: default
spec:volumeSnapshotClassName: csi-hostpath-snapclass #引用上面的class来动态创建VolumeSnapshotContentsource:persistentVolumeClaimName: pvc-test  #pvc的名称

卷快照恢复

        基于快照VolumeSnapshot恢复PVC,这对于备份和恢复场景非常有用,以下是示例:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-test-v2    #从快照创建的新PVC的名称
spec:storageClassName: csi-hostpath-snapclass  #创建快照的VolumeSnapshotClassdataSource:name: new-snapshot       #VolumeSnapshot的名称kind: VolumeSnapshotapiGroup: snapshot.storage.k8s.ioaccessModes:- ReadWriteOnceresources:requests:storage: 10Gi

 卷克隆

        卷克隆是指创建一个现有卷的副本,不使用快照技术。这个副本可以像任何其他标准卷一样使用。同样,仅适用于CSI卷插件。以下是如何基于现有的PVC创建一个克隆卷的步骤:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: clone-of-pvc-1       #新创建的克隆卷的名称namespace: myns            #源PVC和目标PVC必须在相同的命名空间中
spec:accessModes:- ReadWriteOncestorageClassName: cloning     #存储类名称resources:requests:storage: 5Gi      #新卷的存储请求大小,必须大于或等于源卷的大小dataSource:kind: PersistentVolumeClaimname: pvc-1      #源PVC必须处于Bound状态且可用(不在使用中)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Java面向对象高级一08】继承_使用继承的好处

前言 一、继承是什么? 二、使用继承的好处 总结 前言 继承的学习 一、继承是什么? Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。extends(中文意思就是继承)。 继承的意思是&#xf…

Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式

Redis作为一个高性能的key-value数据库,广泛应用于缓存、消息队列、排行榜等场景。然而,Redis是基于内存的数据库,这意味着一旦服务器宕机,内存中的数据就会丢失。为了解决这个问题,Redis提供了数据持久化的机制&#…

C语言 | Leetcode C语言题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; int countSegments(char * s){int count 0; //count用来记录单词个数for(int i0; i < strlen(s); i){ //遍历字符串 if((i 0 || s[i-1] ) && s[i] ! ) //一个…

Python | Leetcode Python题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; class Solution:def countSegments(self, s):segment_count 0for i in range(len(s)):if (i 0 or s[i - 1] ) and s[i] ! :segment_count 1return segment_count

【计网】从零开始掌握序列化 --- 实现网络计算器项目

​​​请各位保持头脑清醒&#xff0c; ​​​读些好书&#xff0c;做点有用的事&#xff0c; ​​​快快乐乐地生活。 ​​​ --- 斯蒂芬金 《肖申克的救赎》--- 从零开始掌握序列化 1 知识回顾2 服务器框架3 客户端框架4 运行测试 1 知识回顾 前面两篇文章学习中基础知识…

ROS第六梯:ROS+VSCode+C++消息发布和订阅

第一步&#xff1a;创建ROS工作空间&#xff0c;并在工作空间下创建名为srr_pkg的功能包&#xff0c;具体步骤参考第二章。 第二步&#xff1a;在src下创建publisher.cpp作为发布节点代码文件&#xff0c;创建subscriber.cpp作为订阅节点代码文件&#xff1a; 主要步骤是&#…

数字通云平台智慧政务 login 存在登录绕过

0x01 漏洞描述&#xff1a; 数字通云平台智慧政务OA产品是基于云计算、大数据、人工智能等先进技术&#xff0c;为政府部门量身定制的智能化办公系统。该系统旨在提高政府部门的办公效率、协同能力和信息资源共享水平&#xff0c;推动电子政务向更高层次发展。 数字通云平台 智…

【高分系列卫星简介——高分五号卫星(GF-5)】

高分五号卫星&#xff08;GF-5&#xff09; 高分五号&#xff08;GF-5&#xff09;卫星是中国高分辨率对地观测系统重大专项系列中的一颗重要卫星&#xff0c;主要承担着遥感、测绘等任务。以下是对高分五号卫星的详细介绍&#xff1a; 一、基本信息 国籍&#xff1a;中国研…

Android JNI 调用流程

为啥要用JNI&#xff0c;我个人理解是&#xff0c;Java 代码效率不够高&#xff0c;代码调用底层逻辑隔着一层Java 虚拟机&#xff0c;不能直接操控底层硬件&#xff0c;而C/C 可以直接操控硬件设备&#xff0c;对于需要效率更高的操作&#xff0c;就需要通过C/C 完成。。 比如…

GNU链接器(LD):存储命令(MEMORY)用法及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

最小花费爬楼梯(动态规划)问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; 最小花费爬楼梯_牛客题霸_牛客网 二思路&#xff1a; 思路&#xff1a;动态规划找前后规律化简题意&#xff1a;此题想要的结果其实就是能上到顶楼也就是&#xff1a; 分为&#xff1…

【华为】用策略路由解决双出口运营商问题

需求描述 不同网段访问互联网资源时&#xff0c;走不同的出口&#xff0c;即PC1走电信出口&#xff0c;PC2走移动出口。 客户在内网接口下应用策略路由后往往出现无法访问内网管理地址的现象&#xff0c;该举例给出解决办法。 拓扑图 基础配置 #sysname R1 # # interface G…

QT 中的信号与槽机制详解

目录 一、引言 二、信号与槽的基本概念 1.信号&#xff08;Signals&#xff09; 2.槽&#xff08;Slots&#xff09; 三、声明信号和槽 1.声明信号和槽 2.发射信号 3.连接信号和槽 四、高级特性 1.多信号连接到一个槽 2.一个信号连接到多个槽 3.断开信号和槽的连…

SpringBoot和JPA初探

目录 SpringBoot和JPA初探0.准备条件1.创建JPA项目2.项目3.总结 SpringBoot和JPA初探 我们使用SpringBootJPA做一个简单的API接口演示&#xff0c;通过一个简单的例子让大家对Spring Data JPA有一个整体的认知。 0.准备条件 IntelliJ IDEAjdk 1.8mysql 8.0maven 3.8.x 1.创…

多智能体笔记本专家系统:集成CrewAI、Ollama和自定义Text-to-SQL工具

在这个项目中&#xff0c;我们的目标是创建一个由多智能体架构和本地大语言模型&#xff08;LLM&#xff09;驱动的个人笔记本电脑专家系统。该系统将使用一个SQL数据库&#xff0c;包含有关笔记本电脑的全面信息&#xff0c;包括价格、重量和规格。用户可以根据自己的特定需求…

前缀和问题

洛谷题面 这个其实可以当模板了。 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1e510; int sum[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m,x;cin>>n;for(int i1;i<n;i){cin>>x;sum[i]sum[i…

【算法】模拟:(leetcode)495.提莫攻击(easy)

目录 题目链接 题目介绍 解法 代码 题目链接 495. 提莫攻击 - 力扣&#xff08;LeetCode&#xff09; 题目介绍 解法 模拟 分情况讨论。 当寒冰再次中毒时&#xff0c;上次「中毒」是否已经结束。 ​ 当上次中毒已经结束了&#xff0c;那么上次「中毒」维持的时间就是 …

【图书管理系统】数据结构、链表、C/C++课程设计

【图书管理系统】数据结构、链表、课程设计、C/C 一、前言二、系统概述2.1 功能简介2.2 系统架构 三、数据结构与算法3.1 单链表的定义与操作3.2 图书信息结构体 四、功能实现详解4.1 主菜单选择系统4.2 信息注册系统4.3 用户登录系统4.4 访问图书系统 五、详细代码分析5.1 全局…

SegFormer网络结构的学习和重构

因为太多的博客并没有深入理解,本文是自己学习后加入自己深入理解的总结记录&#xff0c;方便自己以后查看。 segformer中encoder、decoder的详解。 学习前言 一起来学习Segformer的原理,如果有用的话&#xff0c;请记得点赞关注哦。 一、Segformer的网络结构图 网络结构&…

一道简单的css动态宽度问题?

题目&#xff1a; 如何实现left的宽度随着父级宽度改变而改变&#xff1f; .content {display: flex;height: 300px;}.left {max-width: 200px;min-width: 100px;background: red;}.right {flex: 1;background: yellow;}.left { max-width: 200px; min-width: 100px; backgroun…