OpenShift 4 - 使用 emptyDir/hostPath/local 类型 PV
《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.9环境中验证
文章目录
- emptyDir 类型 pv
- hostPath 类型 pv
- local 类型 pv
- 创建 PV
- 使用 local pv
- 参考
Kubernetes 的 emptyDir、hostPath、local 类型 PV 使用的都是 Node 节点的存储,但是功能和使用场景不同。
- emptyDir 类型的 PV 是临时性的,因为 Pod 一旦重建,则原有的内容则被清空。
- hostPath 类型的 PV 锁定到 Node 节点的本地存储,因此不适合集群中有多个 Node 节点的情况。因为重建的 Pod 可能会调度到其它 Node 节点上,导致无法访问存储。
- local 类型的 PV 类似 hostPath 类型 PV,但是它具备亲和性,比较适合在集群中为容器化数据库提供存储。
emptyDir 类型 pv
emptyDir 类型的PV在pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。
$ cat << EOF | oc apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxinc/nginx-unprivilegedvolumeMounts:- mountPath: /cachename: emptydir-volumevolumes:- name: emptydir-volumeemptyDir: {}
EOF
hostPath 类型 pv
一个 hostPath 类型的 PV 将一个文件或目录从主机节点的文件系统挂载到 pod。hostPath PV 必须只在单节点集群中使用,Kubernetes 不支持多节点集群上的 hostPath。
- 查找当前状态为 Available 的 PV,然后自行执行命令删除他们。
$ oc get pv | grep Available
- 查看当前集群中的 Node 节点。
$ oc get node
NAME STATUS ROLES AGE VERSION
crc-dzk9v-master-0 Ready master,worker 88d v1.22.0-rc.0+894a78b
$ NODE_NAME=crc-dzk9v-master-0
- 进入 OpenShift 集群中的 “${NODE_NAME}” 节点,先创建目录 /mnt/pv-data/mysql-data,然后修改其访问权限,最后退出 Node 节点。
$ oc debug node/${NODE_NAME}
# chroot /host
# mkdir -p /mnt/pv-data/mysql-data
# chmod -R 770 /mnt/pv-data/mysql-data
# exit
- 执行命令,基于 /mnt/pv-data/mysql-data 创建 PV。
$ cat << EOF | oc apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-mysql
spec:capacity:storage: 100GiaccessModes:- ReadWriteOnce- ReadWriteMany- ReadOnlyManypersistentVolumeReclaimPolicy: RecyclevolumeMode: FilesystemhostPath:path: "/mnt/pv-data/mysql-data"type: ""
EOF
- 执行命令,在 mysql 项目中根据 mysql-persistent 模板创建应用。
$ oc new-project mysql
$ oc new-app --template=mysql-persistent
$ oc get pod mysql
NAME READY STATUS RESTARTS AGE
mysql-1-5j4vh 1/1 Running 0 30s
mysql-1-deploy 0/1 Completed 0 37s
- 进入运行 mysql 的 Pod,然后查看 “/var/lib/mysql/data/” 下的文件,然后退出 Pod。
$ oc rsh dc/mysql
sh-4.4$ ls /var/lib/mysql/data/
'#ib_16384_0.dblwr' '#innodb_temp' binlog.000001 binlog.index ca.pem client-key.pem ib_logfile0 ibdata1 mysql mysql.ibd performance_schema public_key.pem server-cert.pem sys undo_002
'#ib_16384_1.dblwr' auto.cnf binlog.000002 ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 mysql-1-5j4vh.pid mysql_upgrade_info private_key.pem sampledb server-key.pem undo_001
sh-4.4$ exit
- 参照以上(3)的操作再次进入 Node 节点,然后查看 “/mnt/pv-data/mysql-data” 目录下的文件,确认和(6)看到的完全一样。
$ oc debug node/${NODE_NAME}
# chroot /host
# ls /mnt/pv-data/mysql-data
local 类型 pv
创建 PV
- 查看 OpenShift 集群中的节点。
$ oc get node
NAME STATUS ROLES AGE VERSION
crc-dzk9v-master-0 Ready master,worker 88d v1.22.0-rc.0+894a78b
$ NODE_NAME=crc-dzk9v-master-0
- 进入 OpenShift 集群中的 “${NODE_NAME}” 节点,然后创建在后面步骤的 my-local-pv 对象中用到的 “path” 目录。最后退出集群节点。
$ oc debug node/${NODE_NAME}
# chroot /host
# DIR_NAME="vol1"
# mkdir -p /mnt/disk/${DIR_NAME}
# chcon -Rt svirt_sandbox_file_t /mnt/disk/${DIR_NAME}
# chmod 777 /mnt/disk/${DIR_NAME}
# exit
- 执行命令,在集群中创建一个 StorageClass。
$ cat << EOF | oc apply -f -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: my-local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
- 执行命令,基于上面创建的 StorageClass 对象在 mynode 节点上创建一个 “local” 类型的 PersistentVolume。
注意:
“/mnt/disk/vol1” 是以上步骤创建的。
“nodeAffinity” 部分保证了 “local” 类型的 PersistentVolume 和指定节点的亲和性。
$ cat << EOF | oc apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:name: my-local-pv
spec:capacity:storage: 50GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: my-local-storagelocal:path: /mnt/disk/vol1nodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- ${NODE_NAME}
EOF$ oc get pv my-local-pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
my-local-pv 50Gi RWO Retain Available my-local-storage 8m44s
使用 local pv
- 执行命令,在测试项目中通过 “my-local-storage” 的 storageClassName 申请使用 Local pv。
$ oc new-project test
$ cat << EOF | oc apply -f -
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: my-local-pvc
spec:accessModes:- ReadWriteOncestorageClassName: my-local-storageresources:requests:storage: 50Gi
EOF
- 使用 my-local-pvc 运行 Pod。
$ cat << EOF | oc apply -f -
apiVersion: v1
kind: Pod
metadata:name: wwwlabels:name: www
spec:containers:- name: wwwimage: nginx:alpineports:- containerPort: 80name: wwwvolumeMounts:- name: www-persistent-storagemountPath: /usr/share/nginx/htmlvolumes:- name: www-persistent-storagepersistentVolumeClaim:claimName: my-local-pvc
EOF
- 查看运行的测试 Pod, 记录 Pod 的 IP。
$ get pod www -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
www 1/1 Running 0 32m 10.217.0.82 crc-dzk9v-master-0 <none> <none>
- 确认 “my-local-pv” 已经中已经有 “my-local-pvc”。
$ oc get pv my-local-pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
my-local-pv 50Gi RWO Retain Bound test/my-local-pvc my-local-storage 34m
- 再次进入 “NODE_NAME”。先向该 Node 节点的 “** /mnt/disk/vol1/**” 目录写入文件,然后访问测试 Pod 的 IP 地址,确认返回结果。
$ oc debug node/${NODE_NAME}
# chroot /host
# echo "Hello local persistent volume" > /mnt/disk/vol1/index.html
# url 10.217.0.82
Hello local persistent volume
参考
https://vocon-it.com/2018/12/20/kubernetes-local-persistent-volumes/
https://speakerdeck.com/msau42/2018-kubecon-eu-kubernetes-local-persistent-volumes-in-production
https://bswen.com/2020/12/others-local-vs-hostpath-k8s.html
OpenShift 4 - 使用 emptyDir/hostPath/local 类型 PV相关推荐
- Kubernetes-卷/存储卷(emptyDir/hostPath/pv/pvc)(十)
1 卷的介绍 1.1 卷的概念 在搞容器的时候,我们在处理完应用如何起,如何运行,最终落实到数据的时候,我们又要考虑2个问题:容器是如何访问外部磁盘存储的?容器之间如何共享存储空间?在一些场景下, ...
- OpenShift / RHEL / DevSecOps 汇总目录
文章目录 OpenShift / RHEL / DevSecOps 汇总目录 OpenShift 入门 OpenShift 安装 免费线上环境 CRC单机环境 MicroShift Online安装 ...
- emptyDir、hostPath以及local volume的不同
转载自:https://blog.csdn.net/watermelonbig/article/details/84108424 Kubernetes支持几十种类型的后端存储卷,其中有几种存储卷总是给 ...
- kubernetes存储系统介绍(Volume、PV、dynamic provisioning,阿里云服务器nfs创建pv,hostpath创建pv)
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 K8S存储系统 K8S的存储系统从基础到高级又大致分为三个层次:普通Volume,Persistent Volume 和动态存储供应(dynamic ...
- @kubernetes(k8s)数据持久化Volume存储卷(emptyDir、hostPath、NFS、StorageClass)
文章目录 kubernetes(k8s)数据持久化Volume 一.数据持久化 1.Vlolume概述 2.数据卷的分类 3.常用的四种数据卷 4.Pod使用Volume步骤: 5. volume基本 ...
- OpenShift 4 - 在单机版 OpenShift Local 中运行 OpenShift Virtualization(视频)
<OpenShift / RHEL / DevSecOps 汇总目录> 说明:本文已经在支持 OpenShift 4.12 的 OpenShift Local 环境中验证 注意:如果是 O ...
- kubernetes存储:local,openEBS,rook ceph
文章目录 Local 存储(PV) 概念 hostPath Local PV storageClassName指定延迟绑定动作 pv的删除流程 OpenEBS存储 控制平面 OpenEBS PV Pr ...
- 资源利用率监控与存储卷(pv/pvc)
官网:https://kubernetes.io/zh/ 一.资源利用率的概述 k8s容器创建的时候是随机分配的,如果随机分配时,有一个节点分配得比较多时,则会出现卡顿等等的事情: 1.metrics ...
- 【k8s的持久化存储】PV、PVC、StorageClass讲解
一.PV和PVC的引入 Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足. Pod 通常是由应用的开发人员维护,而 Volume 则通常是由存储系统的管理员维护.开发人员要获得上面 ...
最新文章
- Linux命令行下关机【Ubuntu】
- java h5在线音频_用h5 audio播放mp3 播放一分钟就报错了
- 【Python】random库的使用
- pat 甲级 1072. Gas Station (30)
- vuerouter传参方式_VUE Router学习原理(一)
- Difference between stem and lemma
- python考研成绩什么时候出来_这里有最新的调剂、成绩公布时间以及复试信息
- 什么是好的虚拟化项目交付(转)
- Java并发编程框架Disruptor
- 【线程安全】—— 单例类双重检查加锁(double-checked locking)
- Mac 计算器隐藏功能,满足你所有计算要求
- linux 离线安装node.js,Linux上离线安装node.js、Newman、newman-reporter-html
- 鸿蒙系统激活炼妖壶设备管理员实现应用双开(微信,QQ三开)以及常见问题解决
- 联想主板9针开关接线图_收藏丨34个电气控制接线图、电子元件工作原理图
- TCP/IP详解 卷1:协议—概述
- php如何大批量群发微信模板消息,如何用php实现发送微信模板消息呢?
- LPC1788 UART-DMA遇到的问题
- 如何去掉PDF右下角的全能扫描王水印
- Surface Pro的MicroSDHC卡测速
- 银行卡号码校验算法(Luhn算法,又叫模10算法)
热门文章
- java 图像膨胀_OpenCV3 Java图形图像上的膨胀(Imgproc.dilate)
- 屏幕距离和坐便转换工具_【软件推荐】你和大神的距离,只差这几个效率工具!...
- python时间戳_Python-强大的模块功能库-No11
- 第二章简答_微观 第二章 效用论
- windows服务器查看系统异常,Windows服务器异常---查看系统日志--以蓝屏为例分析...
- python字符串_Python字符串格式化%s%d%f详解
- “3D字体”素材|让你的设计脱颖而出,看起来与众不同
- 新拟物素材|UI设计领域必掌握的要领!
- 优秀分层UI设计模板解析提升网站用户体验,5个UI设计技巧轻松搞定
- 设计师网站导航的好处