《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。

  1. 查找当前状态为 Available 的 PV,然后自行执行命令删除他们。
$ oc get pv | grep Available
  1. 查看当前集群中的 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
  1. 进入 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
  1. 执行命令,基于 /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
  1. 执行命令,在 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
  1. 进入运行 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
  1. 参照以上(3)的操作再次进入 Node 节点,然后查看 “/mnt/pv-data/mysql-data” 目录下的文件,确认和(6)看到的完全一样。
$ oc debug node/${NODE_NAME}
# chroot /host
# ls /mnt/pv-data/mysql-data

local 类型 pv

创建 PV

  1. 查看 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
  1. 进入 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
  1. 执行命令,在集群中创建一个 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
  1. 执行命令,基于上面创建的 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

  1. 执行命令,在测试项目中通过 “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
  1. 使用 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
  1. 查看运行的测试 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>
  1. 确认 “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
  1. 再次进入 “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相关推荐

  1. Kubernetes-卷/存储卷(emptyDir/hostPath/pv/pvc)(十)

    1 卷的介绍 1.1 卷的概念   在搞容器的时候,我们在处理完应用如何起,如何运行,最终落实到数据的时候,我们又要考虑2个问题:容器是如何访问外部磁盘存储的?容器之间如何共享存储空间?在一些场景下, ...

  2. OpenShift / RHEL / DevSecOps 汇总目录

    文章目录 OpenShift / RHEL / DevSecOps 汇总目录 OpenShift 入门 OpenShift 安装 免费线上环境 CRC单机环境 MicroShift Online安装 ...

  3. emptyDir、hostPath以及local volume的不同

    转载自:https://blog.csdn.net/watermelonbig/article/details/84108424 Kubernetes支持几十种类型的后端存储卷,其中有几种存储卷总是给 ...

  4. kubernetes存储系统介绍(Volume、PV、dynamic provisioning,阿里云服务器nfs创建pv,hostpath创建pv)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 K8S存储系统 K8S的存储系统从基础到高级又大致分为三个层次:普通Volume,Persistent Volume 和动态存储供应(dynamic ...

  5. @kubernetes(k8s)数据持久化Volume存储卷(emptyDir、hostPath、NFS、StorageClass)

    文章目录 kubernetes(k8s)数据持久化Volume 一.数据持久化 1.Vlolume概述 2.数据卷的分类 3.常用的四种数据卷 4.Pod使用Volume步骤: 5. volume基本 ...

  6. OpenShift 4 - 在单机版 OpenShift Local 中运行 OpenShift Virtualization(视频)

    <OpenShift / RHEL / DevSecOps 汇总目录> 说明:本文已经在支持 OpenShift 4.12 的 OpenShift Local 环境中验证 注意:如果是 O ...

  7. kubernetes存储:local,openEBS,rook ceph

    文章目录 Local 存储(PV) 概念 hostPath Local PV storageClassName指定延迟绑定动作 pv的删除流程 OpenEBS存储 控制平面 OpenEBS PV Pr ...

  8. 资源利用率监控与存储卷(pv/pvc)

    官网:https://kubernetes.io/zh/ 一.资源利用率的概述 k8s容器创建的时候是随机分配的,如果随机分配时,有一个节点分配得比较多时,则会出现卡顿等等的事情: 1.metrics ...

  9. 【k8s的持久化存储】PV、PVC、StorageClass讲解

    一.PV和PVC的引入 Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足. Pod 通常是由应用的开发人员维护,而 Volume 则通常是由存储系统的管理员维护.开发人员要获得上面 ...

最新文章

  1. Linux命令行下关机【Ubuntu】
  2. java h5在线音频_用h5 audio播放mp3 播放一分钟就报错了
  3. 【Python】random库的使用
  4. pat 甲级 1072. Gas Station (30)
  5. vuerouter传参方式_VUE Router学习原理(一)
  6. Difference between stem and lemma
  7. python考研成绩什么时候出来_这里有最新的调剂、成绩公布时间以及复试信息
  8. 什么是好的虚拟化项目交付(转)
  9. Java并发编程框架Disruptor
  10. 【线程安全】—— 单例类双重检查加锁(double-checked locking)
  11. Mac 计算器隐藏功能,满足你所有计算要求
  12. linux 离线安装node.js,Linux上离线安装node.js、Newman、newman-reporter-html
  13. 鸿蒙系统激活炼妖壶设备管理员实现应用双开(微信,QQ三开)以及常见问题解决
  14. 联想主板9针开关接线图_收藏丨34个电气控制接线图、电子元件工作原理图
  15. TCP/IP详解 卷1:协议—概述
  16. php如何大批量群发微信模板消息,如何用php实现发送微信模板消息呢?
  17. LPC1788 UART-DMA遇到的问题
  18. 如何去掉PDF右下角的全能扫描王水印
  19. Surface Pro的MicroSDHC卡测速
  20. 银行卡号码校验算法(Luhn算法,又叫模10算法)

热门文章

  1. java 图像膨胀_OpenCV3 Java图形图像上的膨胀(Imgproc.dilate)
  2. 屏幕距离和坐便转换工具_【软件推荐】你和大神的距离,只差这几个效率工具!...
  3. python时间戳_Python-强大的模块功能库-No11
  4. 第二章简答_微观 第二章 效用论
  5. windows服务器查看系统异常,Windows服务器异常---查看系统日志--以蓝屏为例分析...
  6. python字符串_Python字符串格式化%s%d%f详解
  7. “3D字体”素材|让你的设计脱颖而出,看起来与众不同
  8. 新拟物素材|UI设计领域必掌握的要领!
  9. 优秀分层UI设计模板解析提升网站用户体验,5个UI设计技巧轻松搞定
  10. 设计师网站导航的好处