往期精彩文章 :
- 提升CKA考试胜算:一文带你全面了解RBAC权限控制!
- 揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?
- CKA认证必备:掌握k8s网络策略的关键要点
- 提高CKA认证成功率,CKA真题中的节点维护全攻略!
- 数据无忧,一学就会:掌握CKA认证必备的etcd备份与还原秘籍!
- 提升你的云技能:深入了解CKA认证之k8s升级秘籍!
- 揭秘CKA认证:Service四层代理的神秘面纱
- 提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
- CKA考生注意:这些Deployment要点能助你一臂之力!
- 从NodeSelector到NodeAffinity:探索Kubernetes节点亲和性的进化之路
- 提升CKA考试效率:精准统计Ready状态Node节点的实用攻略
- CKA考试必备:解锁Pod封装多容器的高级技巧!
理论
1、PV概念
持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用PV的Pod的生命周期。
- PV是对K8S存储资源的抽象,PV一般由运维人员创建和配置,供容器申请使用。
- 注意:PV没有命名空间限制!!!
2、PVC概念
持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样PVC申领也可以请求特定的大小和访问模式 。
- Pod 在使用 PVC 时必须与PVC在同一个Namespace下。
- 注意:PVC有命名空间限制!!!
3、PV与PVC的关系
PV相当于对磁盘的分区,PVC相当于APP(应用程序)向某个分区申请多少空间。比如说安装WPS程序时,一般会告知我们安装它需要多少存储空间,让你选择在某个磁盘下安装。如果将来某个分区磁盘满了,也不会影响别的分区磁盘的使用。 一旦 PV 与PVC绑定,Pod就可以使用这个 PVC 了。如果在系统中没有满足 PVC 要求的 PV,PVC则一直处于 Pending 状态,直到系统里产生了一个合适的 PV。
4、StorageClass概念
K8S有两种存储资源的供应模式:静态模式和动态模式,资源供应的最终目的就是将适合的PV与PVC绑定:
- 静态模式:管理员预先创建许多各种各样的PV,等待PVC申请使用。
- 动态模式:管理员无须预先创建PV,而是通过StorageClass自动完成PV的创建以及与PVC的绑定。
StorageClass就是动态模式,根据PVC的需求动态创建合适的PV资源,从而实现存储卷的按需创建。
5、PV的访问模式
模式 | 解析 |
ReadWriteOnce(RWO) | 可读可写,但只支持被单个节点挂载 |
ReadOnlyMany(ROX) | 只读,可被多个节点挂载 |
ReadWriteMany(RWX) | 多路可读可写,这种存储可以以读写的方式被多个节点共享、不是每一种存储都支持者三种方式,像共享方式,目前支持的还比较少,比较常用的是NFS,在pvc绑定pv时通常根据两个条件来判定,是存储的大小,另一个就是模式 |
6、PV的回收策略
策略 | 解析 |
Retain | 不清除、保留volume(需要手动清除) |
Recycle | 删除数据,即rm -rf /thevolume/* (只有nfs和hostPath支持) |
Delete | 删除储存资源,比如删除aws ebs卷(只有aws EBS,GCE PD,Azure Disk和cinder支持) |
7、PV的状态
状态 | 解析 |
Available | 可用,没有被PVC绑定的空闲资源。 |
Bound | 已绑定,已经被PVC绑定 |
Released | 已释放,PVC被删除,但是资源还未被重新使用。 |
Failed | 失败,自动回收失败 |
案例演示
NFS安装
本案例演示使用NFS作为后端的存储,在K8S所有节点上都要安装NFS客户端软件,下面采用控制平面作为NFS服务端。
- 在控制平面安装NFS服务端:
apt install nfs-kernel-server nfs-common -y
- 并配置共享目录,编辑
/etc/exports
这个文件
/nfs/data *(rw,sync,no_root_squash)
这表示将 /data 目录共享给所有客户端,具有读写权限。
- 修改配置文件,需要执行下面的命令使其生效
exportfs -a
- 在所有的节点上安装NFS客户端
apt install nfs-common -y
- 节点上安装完后,通过执行如下命令验证NFS是否配置正确
node01 $ showmount -e 172.30.1.2 Export list for 172.30.1.2: /nfs/data * node01 $
上面的命令是列出NFS服务器所有的共享目录,172.30.1.2是NFS服务器的地址。
创建PV
下面创建一个用于持久化存储MYSQL数据的PV,大小为2Gi
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv labels: pv: mysql-pv spec: capacity: storage: 2Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: nfs-slow nfs: path: /nfs/data server: 172.30.1.2
执行PV的创建后,如下图,PV目前的状态为Available
创建PVC
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc labels: pv: mysql-pvc spec: storageClassName: nfs-slow resources: requests: storage: 2Gi accessModes: - ReadWriteOnce selector: matchLabels: pv: mysql-pv
执行创建PVC命令后,pv的状态就从原来的Available
变成Bound
,如下图:
本来想通过标签的方式去关联PV和PVC的,但是,在v.1.29.0版本,通过标签的方式PVC的创建一直处于
Pending
中。最后通过查询官方文档通过storageClassName
这个字段才成功Bound
。
创建Deploy资源
在Deployment中调用PVC资源,mysql-deploy.yaml
资源清单如下:
apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deployment labels: app: mysql spec: replicas: 2 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: "@123456@" ports: - containerPort: 3306 volumeMounts: - mountPath: /var/lib/mysql name: mysqlvolume volumes: - name: mysqlvolume persistentVolumeClaim: claimName: mysql-pvc #使用的pvc名字
执行如下命令,提交资源清单返回结果如下:
CKA真题
持久卷PersistentVolume
真题截图
中文解析
切换 k8s 集群环境:
kubectl config use-context hk8s
Task
创建一个 pv,名字为
app-config
,大小为 2Gi, 访问权限为ReadWriteMany
。Volume
的类型为 hostPath,路径为/srv/app-config
。
官方参考文档
配置 Pod 以使用 PersistentVolume 作为存储
做题解答
- 切换K8s集群环境
kubectl config use-context hk8s
- 按照题目的要求,编写PV的资源清单
apiVersion: v1 kind: PersistentVolume metadata: name: app-config labels: type: local spec: capacity: storage: 2Gi accessModes: - ReadWriteMany hostPath: path: "/srv/app-config"
- 提交PV资源清单
kubectl apply -f pv.yaml
- 通过下面的命令检查PV的状态。
持久卷申领(PVC)
真题截图
中文解析
切换 k8s 集群环境:
kubectl config use-context ok8s
Task
创建一个名字为 pv-volume 的 pvc,指定 storageClass 为
csi-hostpath-sc
,大小为 10Mi。然后创建一个 Pod,名字为web-server
,镜像为 nginx,并且挂载该 PVC 至/usr/share/nginx/html
,挂载的权限为RedWriteOnce
。之后通过 kubectl edit 或者 kubectl path 将 pvc 改成 70Mi,并且记录修改记录。
官方参考文档
配置 Pod 以使用 PersistentVolume 作为存储
做题解答
- 切换K8s集群环境
kubectl config use-context hk8s
- 按照题目的要求,编写PVC的资源清单
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pv-volume spec: storageClassName: csi-hostpath-sc accessModes: - ReadWriteOnce resources: requests: storage: 10Mi --- apiVersion: v1 kind: Pod metadata: name: web-server spec: volumes: - name: html-volume persistentVolumeClaim: claimName: pv-volume containers: - name: web-server image: nginx volumeMounts: - mountPath: "/usr/share/nginx/html" name: html-volume
- 提交资源清单
kubectl apply -f pod.yaml
- 修改PVC的容量从原来的10Mi改成70Mi
kubectl edit pvc pv-volume -------- resources: requests: storage: 70Mi storageClassName: csi-hostpath-sc ---------