跳转至

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

说明:

创建 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