Pod 动态分配存储空间实现持久化存储
配置 Pod 以使用 PersistentVolume 作为存储
关于持久卷的介绍,可以看官方文档 https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
持久卷根据存储位置,可以使用本地存储和云存储,如果有云服务平台,可以动态使用配置云资源(如Google Cloud Platform (GCP) 、 AWS、Azure);使用的云提供商,需要使用相应的 provisioner
和参数,
provisioner
: 指定存储插件(Provisioner),根据你实际环境调整。例如:
- NFS 使用
nfs.csi.k8s.io
- Ceph 使用
cephfs.csi.ceph.com
- AWS 使用
kubernetes.io/aws-ebs
云存储服务需要集群运行在云服务商提供的平台;如在 GCP 上运行 Kubernetes kubernetes.io/gce-pd;kubernetes.io/aws-ebs(适用于 AWS)或者 kubernetes.io/azure-disk(适用于 Azure),云存储服务有自带的 provisioner
如果使用的是本地环境,可以使用以下几种方式来配置存储:
- 本地存储(Local Storage)
- NFS 存储
- 网络存储(如 iSCSI)
hostPath 类型
hostPath: 定义主机节点文件系统上的路径,作为存储位置。这里指定路径为 /mnt/repository
;hostPath 类型的 PersistentVolume 使用节点上的文件或目
录来模拟网络附加存储
hostPath 卷 通常用于本地测试或单节点集群,在生产环境中并不推荐使用,因为它依赖于特定节点上的路径。在生产集群中,你不会使用 hostPath。 集群管理员会提供网络存储资源,比如 Google Compute Engine 持久盘卷、NFS 共享卷或 Amazon Elastic Block Store 卷。 集群管理员还可以使用 StorageClass 来设置动态制备存储
确保在主机节点上存在 /mnt/repository
目录,并且 Kubernetes 进程对该目录有访问权限。
创建 PersistentVolume
hostPath PersistentVolume 的配置文件:
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-volumelabels:type: local
spec:storageClassName: manualcapacity:storage: 20GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/repository"
这里是不使用动态分配的,因此是没有存储分配器来动态分配存储资源,即 kubernetes.io/no-provisioner, 配置文件指定卷位于集群节点上的 /mnt/repository
路径;其配置还指定了卷的容量大小为 20 GB,访问模式为 ReadWriteOnce
, 这意味着该卷可以被单个节点以读写方式安装。 此配置文件还在 PersistentVolume 中定义了 StorageClass 的名称为 manual
。 它将用于将 PersistentVolumeClaim 的请求绑定到此 PersistentVolume
创建 PersistentVolume,查看 PersistentVolume 信息
输出结果显示该 PersistentVolume 的状态(STATUS)
为 Available
。 这意味着它还没有被绑定给 PersistentVolumeClaim
创建 PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pv-claim
spec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 20Gi
创建 PersistentVolumeClaim 之后,Kubernetes 控制平面将查找满足申领要求的 PersistentVolume。 如果控制平面找到具有相同 StorageClass 的适当的 PersistentVolume, 则将 PersistentVolumeClaim 绑定到该 PersistentVolume 上。
再次查看 PersistentVolume 信息:
创建 Pod
创建一个使用 PersistentVolumeClaim 作为存储卷的 Pod
apiVersion: apps/v1
kind: Deployment
metadata:name: httpd-deployment
spec:replicas: 1selector:matchLabels:app: httpdtemplate:metadata:labels:app: httpdspec:containers:- name: httpdimage: m.daocloud.io/docker.io/httpd:latestports:- containerPort: 80volumeMounts:- name: httpd-pvcmountPath: "/usr/local/apache2/htdocs" # 挂载路径volumes:- name: httpd-pvcpersistentVolumeClaim:claimName: pv-claim # PVC 名称
创建好之后可以看到,容器内部的文件夹与宿主机的文件夹的文件是同步的
NFS 存储
在官方文档中并不建议使用 hostPath 卷,或者通常用于本地测试或单节点集群,在生产环境中并不推荐使用;因为我们显然可以发现一些问题,Pod 想要挂载本地磁盘,只能指定当前节点的文件路径作为存储,非常不灵活,且路径必须由管理员手动指定,无法动态分配存储资源
解决动态分配可以使用存储资源自动调配器,想要灵活选择存储位置可以使用 NFS 不局限于本地存储路径
NFS Subdir External Provisioner
nfs-subdir-external-provisioner ,是一个存储资源自动调配器,它可将现有的 NFS 服务器通过持久卷声明来支持 Kubernetes 持久卷的动态分配。该组件是对 Kubernetes NFS-Client Provisioner 的扩展
安装 NFS Client
所有的集群节点都需要安装客户端
sudo apt-get update && sudo apt-get install -y nfs-common
Helm 安装
# 添加 Helm 源
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
- 命令行安装 NFS Subdir External Provisioner
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set storageClass.name=nfs-sc --set nfs.server=172.100.0.109 --set nfs.path=/mnt/nfs-repository -n nfs-system
说明:
–set storageClass.name=nfs-sc:指定 storageClass 的名字(没有的话会自己创建)
–set nfs.server=192.168.9.81:指定 NFS 服务器的地址
–set nfs.path=/data/k8s:指定 NFS 导出的共享数据目录
–set storageClass.defaultClass=true:指定为默认的 sc,本示例没使用
-n nfs-system:指定命名空间
这里是会默认下载一个镜像 registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
- 自定义 values 安装 NFS Subdir External Provisioner
有更多定制化需求时可以选择自定义 values.yaml
的方式进行安装,实际使用中与命令行安装 NFS Subdir External Provisioner 并无区别,(如果网络限制无法下载镜像建议使用)
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisionertar xvf nfs-subdir-external-provisioner-4.0.18.tgz
- 查看 values.yaml 文件
cat nfs-subdir-external-provisioner/values.yaml | egrep -v '#|^$'
replicaCount: 1
strategyType: Recreate
image:repository: registry.k8s.io/sig-storage/nfs-subdir-external-provisionertag: v4.0.2pullPolicy: IfNotPresent
imagePullSecrets: []
nfs:server:path: /nfs-storagemountOptions:volumeName: nfs-subdir-external-provisioner-rootreclaimPolicy: Retain
storageClass:create: truedefaultClass: falsename: nfs-clientallowVolumeExpansion: truereclaimPolicy: DeletearchiveOnDelete: trueonDelete:pathPattern:accessModes: ReadWriteOncevolumeBindingMode: Immediateannotations: {}
leaderElection:enabled: true
rbac:create: true
podSecurityPolicy:enabled: false
podAnnotations: {}
podSecurityContext: {}
securityContext: {}
serviceAccount:create: trueannotations: {}name:
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}
labels: {}
podDisruptionBudget:enabled: falsemaxUnavailable: 1
- 根据自己集群实际配置更改
# 主要修改内容如下
image:repository: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner #镜像拉取地址,默认可能拉取不下来,建议替换成本地或是其他可正常访问的仓库,也可以使用我DockerHub上的的 unopsman/nfs-subdir-external-provisionertag: v4.0.2 #镜像 tag 默认为 v4.0.2,可根据实际情况替换
nfs:server: 172.100.0.109 #指定 NFS 服务器的地址path: /mnt/nfs-repository #指定 NFS 导出的共享数据目录
storageClass:defaultClass: false #是否设置为默认的 StorageClass,本示例没设置,有需要的可以设置为 truename: nfs-sc #指定 storageClass 的名字
这里的挂载路径需要提前共享导出
/mnt/nfs-repository *(rw,sync,no_subtree_check,no_root_squash)
- 应用更改后的 values.yaml 安装下载
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner -f nfs-subdir-external-provisioner/values.yaml -n nfs-system
正常情况下,查看 pod 的状态应该是 Running
如果出现一直为容器创建中的情况,查看日志报错为如下情况,需要在集群每一个节点不只是 master 上安装 nfs 客户端
# 安装 客户端
sudo apt-get update && sudo apt-get install -y nfs-common
验证测试
因为我们现在有了 NFS Subdir External Provisioner 分配器,我们就需要向上面一样先申请 pv 再定义 pvc 绑定,然后 Pod 再挂载 PVC 了;我们可以直接创建 pvc ,分配器可以动态分配相应的 pv ,来绑定我们的 pvc;分配规则是由 storageClass 配置决定的
创建测试 PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-nfs-pvc
spec:storageClassName: nfs-scaccessModes:- ReadWriteManyresources:requests:storage: 1Gi
正常情况下,查看 pvc 应该是绑定的状态,如果不是,有几种常见的错误
如果是这两种情况,检查配置的路径是否共享导出了;编辑 /etc/exports 文件,并且重新导出
/mnt/nfs-repository *(rw,sync,no_subtree_check,no_root_squash)
如果是这种情况,只要把存储目录的权限放开就好
这是情况下的状态
创建测试 Pod
apiVersion: v1
kind: Pod
metadata:name: test-nfs-pod
spec:volumes:- name: test-nfs-pvcpersistentVolumeClaim:claimName: test-nfs-pvccontainers:- name: test-nfs-containerimage: nginx:latestports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: test-nfs-pvc
如果 pod 运行正常,在指定的目录下会自动创建目录文件并挂载到容器的指定目录下面
测试
参考官网:
配置 Pod 以使用 PersistentVolume 作为存储
持久存储设计文档
相关文章:

Pod 动态分配存储空间实现持久化存储
配置 Pod 以使用 PersistentVolume 作为存储 关于持久卷的介绍,可以看官方文档 https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/ 持久卷根据存储位置,可以使用本地存储和云存储,如果有云服务平台,…...

Jackson、Gson、FastJSON三款JSON利器比拼
在Java领域,有多种JSON工具包,比如Jackson、Gson、FastJSON,每家都各有所长,下面我们从性能、特性、生态、易用 性等几个方面来展开下: 一、Jackson 性能 Jackson是一款高性能的JSON处理库。它在序列化和反序列化操作…...
php:nginx如何配置WebSocket代理?
在nginx配置中加入以下配置即可: server {listen 80;server_name test.com;# 配置 WebSocket 代理location /ws {proxy_pass http://127.0.0.1:8083;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade&qu…...
3349、检测相邻递增子数组 Ⅰ
3349、[简单] 检测相邻递增子数组 Ⅰ 1、题目描述 给你一个由 n 个整数组成的数组 nums 和一个整数 k,请你确定是否存在 两个 相邻 且长度为 k 的 严格递增 子数组。具体来说,需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组,…...
C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景
C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景 code review! 参考笔记 C++笔记之unique_ptr转移堆内空间的所有权 文章目录 C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景一.使用 std::unique_ptr 作为函数参数时的主要场景二.一个完整示例一…...

怎么只提取视频中的声音?从视频中提取纯音频技巧
在数字媒体的广泛应用中,提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途,提取声音都能为我们带来诸多便利。怎么只提取视频中的声音?本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…...
数仓工具—Hive语法之窗口函数中的 case when
窗口函数中的 case when 今天我们看一下窗口函数和case when 的各种花活,最近的需求各种窗口,一个需求中十几个窗口,加上各种条件边界,所以写了大量的窗口函数和case when的组合,今天我们来看一下。 我们的数据如下 %spark.pyspark df2 = spark.createDataFrame([(&quo…...

基于微信小程序的酒店客房管理系统+LW示例参考
1.项目介绍 系统角色:管理员、员工、普通用户功能模块:员工管理、用户管理、客房管理、预订管理、商品管理、评价管理、续订管理、订单管理等技术选型:SSM,vue,uniapp等测试环境:idea2024,jdk1…...

Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?
大家好,我是锋哥。今天分享关于【Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?】面试题。希望对大家有帮助; Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的? 100…...

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦
Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像:通过双像素可以实现:深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上,也有遮罩等方式的pd生成,如图双像素视图可以看到光圈的不同一半&#x…...
CTF之密码学(Polybius密码)
棋盘密码,也称为Polybius密码或方格密码,是一种基于替换的加密方法。以下是对棋盘密码的详细解析: 一、加密原理 棋盘密码使用一个5x5的方格棋盘,其中填充了26个英文字母(通常i和j被视为同一个字母并放在同一个格子中…...
【C++篇】从售票窗口到算法核心:C++队列模拟全解析
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...

clipboard
clipboard 现代复制到剪贴板。无闪光。只有 3kb 的 gzip 压缩。 安装 npm install clipboard --save第三方cdn提供商 <script src"https://cdn.jsdelivr.net/npm/clipboard2.0.11/dist/clipboard.min.js"></script>使用 data-clipboard-target"…...

【Mac】VMware Fusion Pro 安装 CentOS 7
1、下载镜像 CentOS 官网阿里云镜像网易镜像搜狐镜像 Mac M1芯片无法直接使用上述地址下载的最新镜像(7.9、9),会一直卡在安装界面(在 install 界面按 enter 回车无效),想要使用需要经过一系列操作&#…...

游戏引擎学习第22天
移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…...
洛谷 B2038:奇偶 ASCII 值判断
【题目来源】https://www.luogu.com.cn/problem/B2038http://shnoip.openjudge.cn/level1/39/【题目描述】 任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO。 例如,字符 A 的 ASCII…...
APIRouter
当然可以!理解 FastAPI 中直接在 FastAPI 实例上定义路由与使用 APIRouter 作为路由器的区别,对于编写结构良好、可维护性高的应用程序至关重要。下面,我将详细解释这两种方法的区别、各自的优缺点以及何时使用它们。 1. 直接在 FastAPI 实例…...
算法模板2:位运算+离散化+区间合并
文章目录 1.6 位运算**位运算的常见应用**1.7 离散化**经典离散化题目例子****1. 区间合并和覆盖长度问题****2. 区间查询与修改****3. 动态求第 K 小值****4. 区间最大重叠次数****5. 动态逆序对计数****6. 二维区间问题****7. 模拟车流/时间段事件****8. 区间众数统计** **具…...

钉钉授权登录
一.找开钉钉开发平台【钉钉开放平台 (dingtalk.com)】 二。点击菜单【应用开发】->左边【钉钉应用】->【创建应用】 三。创建应用-》保存成功后,点击自己【新建的应用】,进入详细页面 四。进入应用详细页面。左边【分享设置】 注意:进…...
【视频】二维码识别:libzbar-dev、zbar-tools(zbarimg )
1、简介 ZBar可以使用多个方式识别各种条形码和二维码。 支持的格式有:EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 93、Code 39、Codabar、Interleaved 2 of 5、QR Code和SQ Code 支持的来源有:视频流、图像文件等 libzbar-dev:二维码识别开发库 zbar-tools(zbarimg …...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...