当前位置: 首页 > news >正文

Kubernetes概念:存储:PersistentVolume和PersistentVolumeClaim使用

官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/

配置 Pod 以使用 PersistentVolume 作为存储

本文将向你介绍如何配置 Pod 使用 PersistentVolumeClaim 作为存储。 以下是该过程的总结:

  1. 你作为集群管理员创建由物理存储支持的 PersistentVolume。你不会将该卷与任何 Pod 关联。
  2. 你现在以开发人员或者集群用户的角色创建一个 PersistentVolumeClaim, 它将自动绑定到合适的 PersistentVolume。
  3. 你创建一个使用以上 PersistentVolumeClaim 作为存储的 Pod。

1、在你的节点上创建一个 index.html 文件

在该节点的 Shell 中,创建一个 /mnt/data 目录:

# 这里假定你的节点使用 "sudo" 来以超级用户角色执行命令
sudo mkdir /mnt/data

/mnt/data 目录中创建一个 index.html 文件:

# 这里再次假定你的节点使用 "sudo" 来以超级用户角色执行命令
sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"

测试 index.html 文件确实存在:

cat /mnt/data/index.htmlHello from Kubernetes storage

2、创建 PersistentVolume

你将创建一个 hostPath 类型的 PersistentVolume。 Kubernetes 支持用于在单节点集群上开发和测试的 hostPath 类型的 PersistentVolume。 hostPath 类型的 PersistentVolume 使用节点上的文件或目录来模拟网络附加存储。

在生产集群中,你不会使用 hostPath。 集群管理员会提供网络存储资源,比如 Google Compute Engine 持久盘卷、NFS 共享卷或 Amazon Elastic Block Store 卷。 集群管理员还可以使用 StorageClass 来设置动态制备存储。

下面是 hostPath PersistentVolume 的配置文件:pods/storage/pv-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:name: task-pv-volumelabels:type: local
spec:storageClassName: manualcapacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data"

此配置文件指定卷位于集群节点上的 /mnt/data 路径。 其配置还指定了卷的容量大小为 10 GB,访问模式为 ReadWriteOnce, 这意味着该卷可以被单个节点以读写方式安装。 此配置文件还在 PersistentVolume 中定义了 StorageClass 的名称为 manual。 它将用于将 PersistentVolumeClaim 的请求绑定到此 PersistentVolume。

创建 PersistentVolume:kubectl apply -f https://k8s.io/examples/pods/storage/pv-volume.yaml
查看 PersistentVolume 的信息:kubectl get pv task-pv-volume
输出结果显示该 PersistentVolume 的状态(STATUS)为 Available。 这意味着它还没有被绑定给 PersistentVolumeClaim。

NAME             CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
task-pv-volume   10Gi       RWO           Retain          Available             manual                   4s

3、创建 PersistentVolumeClaim

下一步是创建一个 PersistentVolumeClaim。 Pod 使用 PersistentVolumeClaim 来请求物理存储。 在本练习中,你将创建一个 PersistentVolumeClaim,它请求至少 3 GB 容量的卷, 该卷一次最多可以为一个节点提供读写访问。
下面是 PersistentVolumeClaim 的配置文件:pods/storage/pv-claim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: task-pv-claim
spec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 3Gi

创建 PersistentVolumeClaim:kubectl apply -f https://k8s.io/examples/pods/storage/pv-claim.yaml
创建 PersistentVolumeClaim 之后,Kubernetes 控制平面将查找满足申领要求的 PersistentVolume。 如果控制平面找到具有相同 StorageClass 的适当的 PersistentVolume, 则将 PersistentVolumeClaim 绑定到该 PersistentVolume 上。
再次查看 PersistentVolume 信息:kubectl get pv task-pv-volume
现在输出的 STATUS 为 Bound

NAME             CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                   STORAGECLASS   REASON    AGE
task-pv-volume   10Gi       RWO           Retain          Bound     default/task-pv-claim   manual                   2m

查看 PersistentVolumeClaim:kubectl get pvc task-pv-claim
输出结果表明该 PersistentVolumeClaim 绑定了你的 PersistentVolume task-pv-volume

NAME            STATUS    VOLUME           CAPACITY   ACCESSMODES   STORAGECLASS   AGE
task-pv-claim   Bound     task-pv-volume   10Gi       RWO           manual         30s

4、创建 Pod

下一步是创建一个使用你的 PersistentVolumeClaim 作为存储卷的 Pod。
下面是此 Pod 的配置文件:pods/storage/pv-pod.yaml

apiVersion: v1
kind: Pod
metadata:name: task-pv-pod
spec:volumes:- name: task-pv-storagepersistentVolumeClaim:claimName: task-pv-claimcontainers:- name: task-pv-containerimage: nginxports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: task-pv-storage

注意 Pod 的配置文件指定了 PersistentVolumeClaim,但没有指定 PersistentVolume。 对 Pod 而言,PersistentVolumeClaim 就是一个存储卷。
创建 Pod:kubectl apply -f https://k8s.io/examples/pods/storage/pv-pod.yaml
检查 Pod 中的容器是否运行正常:kubectl get pod task-pv-pod
打开一个 Shell 访问 Pod 中的容器:kubectl exec -it task-pv-pod -- /bin/bash
在 Shell 中,验证 Nginx 是否正在从 hostPath 卷提供 index.html 文件:

# 一定要在上一步 "kubectl exec" 所返回的 Shell 中执行下面三个命令
apt update
apt install curl
curl http://localhost/

输出结果是你之前写到 hostPath 卷中的 index.html 文件中的内容:

Hello from Kubernetes storage

如果你看到此消息,则证明你已经成功地配置了 Pod 使用 PersistentVolumeClaim 的存储。

清理

删除 Pod、PersistentVolumeClaim 和 PersistentVolume 对象:

kubectl delete pod task-pv-pod
kubectl delete pvc task-pv-claim
kubectl delete pv task-pv-volume

在两个地方挂载相同的 persistentVolume

pods/storage/pv-duplicate.yaml

apiVersion: v1
kind: Pod
metadata:name: test
spec:containers:- name: testimage: nginxvolumeMounts:# 网站数据挂载- name: configmountPath: /usr/share/nginx/htmlsubPath: html# Nginx 配置挂载- name: configmountPath: /etc/nginx/nginx.confsubPath: nginx.confvolumes:- name: configpersistentVolumeClaim:claimName: test-nfs-claim

你可以在 nginx 容器上执行两个卷挂载:
/usr/share/nginx/html 用于静态网站
/etc/nginx/nginx.conf 作为默认配置

相关文章:

  • C#WPF控件TextBlock、Label以及与TextBox的区别
  • Superset二次开发之webpack.config.js 功能模块解读
  • 目标检测的相关模型图:YOLO系列和RCNN系列
  • 城市内涝排水系统最新模型:慧天【HTWATER】与SWMM完美耦合
  • 知乎:多云架构下大模型训练,如何保障存储稳定性?
  • C#学习笔记5:简单上位机串口助手的实现
  • MySQL---触发器
  • Webpack生成企业站静态页面 - 增强数据处理能力
  • Windows前后端部署(达梦,东方通)
  • 数据结构——双向链表
  • 利用图像识别进行疾病诊断
  • 【数据结构】顺序表的实现——静态分配
  • 气象预测新篇章:Python人工智能的变革力量
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • 分类任务中的评估指标:Accuracy、Precision、Recall、F1
  • .pyc 想到的一些问题
  • android 一些 utils
  • IDEA 插件开发入门教程
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS函数式编程 数组部分风格 ES6版
  • Linux快速复制或删除大量小文件
  • Mac转Windows的拯救指南
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • React系列之 Redux 架构模式
  • Vim Clutch | 面向脚踏板编程……
  • vue总结
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • ------- 计算机网络基础
  • 数据结构java版之冒泡排序及优化
  • 物联网链路协议
  • 用 Swift 编写面向协议的视图
  • 2017年360最后一道编程题
  • raise 与 raise ... from 的区别
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • # centos7下FFmpeg环境部署记录
  • ###STL(标准模板库)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (4)STL算法之比较
  • (52)只出现一次的数字III
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (JS基础)String 类型
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (六)c52学习之旅-独立按键
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (五)IO流之ByteArrayInput/OutputStream
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 表达式计算:Expression Evaluator