PV (持久存储卷)与 PVC (持久存储卷声明) ¶
认识 pv 与 pvc
kubernetes存储卷的分类太丰富了,每种类型都要写相应的接口与参数才行,这就让维护与管理难度加大。
-
persistenvolume(PV) 是配置好的一段存储(可以是任意类型的存储卷)
- 也就是说将网络存储共享出来,配置定义成PV。
-
PersistentVolumeClaim(PVC)是用户pod使用PV的申请请求。
- 用户不需要关心具体的volume实现细节,只需要关心使用需求。
pv 与 pvc 之间的关系
-
pv 提供存储资源(生产者)
-
pvc 使用存储资源(消费者)
-
使用 pvc 绑定 pv
实现 nfs 类型 pv 与 pvc ¶
创建 pv ¶
1. 编写创建 pv 的 pv-nfs.yml 文件
apiVersion: v1
kind: PersistentVolume # 类型为PersistentVolume(pv)
metadata:
name: pv-nfs # 名称
spec:
capacity:
storage: 1Gi # 大小
accessModes:
- ReadWriteMany # 访问模式
nfs:
path: /nfs-data/nfs/ # nfs共享目录
server: 192.168.3.201 # nfs服务器IP
参考: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
访问模式有 3 种
- ReadWriteOnce 单节点读写挂载
- ReadOnlyMany 多节点只读挂载
- ReadWriteMany 多节点读写挂载
cephfs 存储卷3种类型都支持, 我们要实现多个 nginx 跨节点之间的数据共享,所以选择 ReadWriteMany 模式。
2. 创建 pv 并验证
[root@k8smaster001 pvc]# kubectl apply -f pv-nfs.yml
persistentvolume/pv-nfs created
[root@k8smaster001 pvc]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pv-nfs 1Gi RWX Retain Available <unset> 84s
说明:
-
RWX 为 ReadWriteMany 的简写
-
Retain 是回收策略
-
Retain 表示需要不使用了需要手动回收
-
参考: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaim-policy
-
创建 pvc ¶
3. 编写创建 pvc 的 pvc-nfs.yml 文件
apiVersion: v1
kind: PersistentVolumeClaim # 类型为PersistentVolumeClaim(pvc)
metadata:
name: pvc-nfs # pvc的名称
spec:
accessModes:
- ReadWriteMany # 访问模式
resources:
requests:
storage: 1Gi # 大小要与pv的大小保持一致
4. 创建 pvc 并验证
[root@k8smaster001 pvc]# kubectl apply -f pvc-nfs.yaml
persistentvolumeclaim/pvc-nfs created
[root@k8smaster001 pvc]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-nfs Bound pv-nfs 1Gi RWX <unset> 20s
注意: STATUS 为 Bound 状态( Bound 状态表示 pvc 与 pv 绑定 OK)
5. 编写 deployment 的 deploy-nginx-nfs.yml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx-nfs
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumes:
- name: www
persistentVolumeClaim:
claimName: pvc-nfs
6. 应用 deploy-nginx-nfs.yml 创建 deployment
[root@k8smaster001 pvc]# kubectl apply -f deploy-nginx-nfs.yml
deployment.apps/deploy-nginx-nfs created
7. 验证 pod 和 pod 内卷的数据
[root@k8smaster001 pvc]# kubectl get pod |grep deploy-nginx-nfs
deploy-nginx-nfs-c469f9797-rss6x 1/1 Running 0 13s
deploy-nginx-nfs-c469f9797-vbnb2 1/1 Running 0 13s
[root@k8smaster001 pvc]# kubectl exec -it deploy-nginx-nfs-c469f9797-rss6x -- cat /usr/share/nginx/html/index.html
volume-nfs
[root@k8smaster001 pvc]# kubectl exec -it deploy-nginx-nfs-c469f9797-vbnb2 -- cat /usr/share/nginx/html/index.html
volume-nfs