Skip to content

3.1

主旨

  • PV&PVC概念原理
  • PV&PVC&POD案例使用

创建示例

测试环境信息

// IP k8s单master测试环境
10.1.6.104

// k8s信息
# kubectl version --short
Client Version: v1.26.6
Kustomize Version: v4.5.7
Server Version: v1.26.6

// docker
# docker version
……此处省略……
Server: Docker Engine - Community
 Engine:
  Version:          20.10.6
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       8728dd2
  Built:            Fri Apr  9 22:43:57 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.24
  GitCommit:        61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
 runc:
  Version:          1.1.9
……此处省略……

本地创建示例

# tree
.
├── nginx-deployment.yaml
├── pvc.yaml
└── pv-local.yaml

0 directories, 3 files
# kubectl get pv
NAME                                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                       STORAGECLASS   REASON   AGE
pv-common                            10Gi       RWO            Retain           Bound    default/pv-common                                                   27m
# kubectl get pvc
NAME        STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pv-common   Bound    pv-common   10Gi       RWO                           27m

案例1-本地

创建pv

# cat pv-local.yaml 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-common
  labels:
    app: pv-common
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  local:
    path: /var/local/common/pv
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - master

pvc绑定pv

# cat pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pv-common
  namespace: default
spec:
  volumeName: pv-common
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

pod挂载pvc

# cat nginx-deployment.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    name: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
      - image: nginx:1.20.0
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/statics
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: pv-common
---
kind: Service
apiVersion: v1
metadata:
  name: nginx
  namespace: default
  labels:
    name: nginx
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30088
  selector:
    name: nginx

nginx-pvc

案例2-NFS

创建pv

# pv/test-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: test
  labels:
    type: test
spec:
  capacity:
    storage: 10Gi # 提供 10G 的存储
  accessModes:
    - ReadWriteMany # 允许多个 Pod 同时读写
  persistentVolumeReclaimPolicy: Recycle # pvc 的策略,允许回收
  nfs:
    path: "/data/k8s"
    server: 192.168.208.130 # 
    readOnly: false # 取消只读,就是可写

pvc绑定pv

# test-pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs # pvc 的名字
spec:
  accessModes:
    - ReadWriteMany # 模式允许多人读写访问
  resources:
    requests:
      storage: 1Gi # 需求资源 1G

pod挂载pvc

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    name: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
      - image: nginx:1.20.0
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/statics
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nfs

进阶剖析

主要名词解释

// PV & PVC
PersistentVolume (PV)
PV是集群中配置好的一个网络存储,是集群的全局资源,不属于任何namespace;
PV无法与pod直接关联,它的设计是用来和存储对接的,所以用于绑定后端存储,写入PV的数据最终都是存放在后端存储服务器上

PersistentVolumeClaim (PVC)
PVC可以直接被pod挂载,同时可以绑定PV,从而让pod使用PV;
PVC与挂载它的pod隶属于同一个namespace

pv-pvc-pod-relation

主要参数解释

PV参数
访问模式:
ReadWriteOnce : PV只能被单个节点以读写权限挂载,rwo
ReadOnlyMany: PV可以被多个节点挂载但是权限是只读的,rox
ReadWrieMany: PV可以被多个节点以读写方式挂载使用, rwx

删除机制:
Retain : 删除PV后保持原状,如果需要删除数据需要管理员到存储上手动删除(建议)
Recycle : 空间回收,直接删除存储卷上所有数据,目前仅支持NFS和hostPath (不建议)
Delete : 自动删除存储卷

卷类型:
定义存储卷使用的文件系统是块设备还是文件系统,默认是文件系统

PVC参数
访问模式:
ReadWriteOnce : PVC只能被单个节点以读写权限挂载,rwo
ReadOnlyMany: PVC可以被多个节点挂载但是权限是只读的,rox
ReadWrieMany: PVC可以被多个节点以读写方式挂载使用, rwx
resources  : 定义PVC创建存储卷的大小

PVC如何绑定PV:(两种方式)
1、seletcot : 标签选择器,用来选择需要绑定的PV
    # matchLabels : 匹配标签名称
    # matchExpressions : 基于正则表达式匹配

2、volumeName : 
    直接点名要绑定的PV名称(相较于上面的标签选择器更精准)

volumeMode : 卷类型
    定义PVC使用的文件系统是块设备还是文件系统,默认是文件系统


// 注意
PVC空间要小于PV的空间

存储类StorageClass

kubernetes中文文档

StorageClass介绍参考

……待继续补充完善……

常见问题

pvc无法绑定pv

// 日志描述
pvc pending
pvc Cannot bind to requested volume "": incompatible accessMode

// 排查
是否创建storageClassName,pv和pvc是否一致
accessModes 是否一致
pvc资源是否超过pv最远

参考文档

PV&PVC介绍和使用