乐趣区

关于k8s:K8S实战十六-持久化存储卷

前言

PV 用来定义长久化存储卷,可将内部存储如 NFS/GFS/CFS 等定义为一个 K8S 外部对象,是一个服务提供者。

PVC 会寻找适合的 PV 进行绑定,绑定胜利后,PVC 就能够提供给 pod 应用。

更新历史

  • 20200710 – 初稿 – 左程立
  • 原文地址 – https://blog.zuolinux.com/2020/07/10/storage-pv-pvc.html

定义 PV/PVC

定义一个 PV

[root@master01 ~]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
 name: nfs1-pv
spec:
 storageClassName: manual
 capacity:
   storage: 1Gi
 accessModes: 
   - ReadWriteMany
 nfs:
   server: 192.168.10.17
   path: "/data/nfs"

定义一个 PVC

[root@master01 ~]# cat pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: nfs1-pvc
spec:
 accessModes:
   - ReadWriteMany
 storageClassName: manual
 resources:
   requests:
     storage: 1Gi
# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM              STORAGECLASS   REASON   AGE
nfs1-pv   1Gi        RWX            Retain           Released   default/nfs1-pvc   manual                  118s
# kubectl get pvc
NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs1-pvc   Pending                                      manual         14s

PVC 会查找 storageClassName 名称统一的 PV,而后在这些 PV 中查找满足 spec.resources.requests.storage 条件的 PV,找到后就绑定 PVC 到该 PV 上。

如果没有符合条件的 PV,PVC 会处于 pending 状态。K8S 的一个名叫 PersistentVolumeController 的控制器会一直查看是否有 pending 的 PVC,以及是否有符合条件的 PV 呈现,一旦有符合条件的 PV 呈现,行将 pending 中的 PVC 与 PV 绑定,而后 PVC 状态变为 Bound。

Pod 中应用 PVC/PV

创立 Pod

[root@master01 ~]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: web
      image: nginx
      volumeMounts:
        - name: nfs
          mountPath: "/usr/share/nginx/html"
  volumes:
    - name: nfs
      persistentVolumeClaim:
        claimName: nfs1-pvc

spec.volumes.persistentVolumeClaim 指定了卷应用哪个 PVC
spec.containers.volumeMounts 指定了挂载哪个卷(name)到容器哪个目录(mountPath)中

在容器挂载目录中写入一个 index.html 文件

kubectl exec -it mypod -- touch /usr/share/nginx/html/index.html

在近程 NFS 上能够看到新建的文件

[root@work03 ~]# ls /data/nfs/
index.html

阐明挂载胜利了。

在 Pod 运行的 node,即 work01 上

# df -h | grep nfs
192.168.10.107:/data/nfs   15G  6.7G  6.8G  50% /var/lib/kubelet/pods/6adcbab7-63cd-4c4e-8db7-7234b9b49999/volumes/kubernetes.io~nfs/nfs1-pv

运行 df 能够看到,K8S 把 NFS 目录 mount 到了宿主机的 /var/lib/kubelet/pods/{pod id}/volumes/kubernetes.io~nfs/{PV 名称},这个本地目录中,而后在容器中挂载该目录。

结束语

PVC 不关怀后端存储提供者是 NFS 还是 GFS,具体应用哪种类型的存储由 PV 来定义,PVC 只和暗藏了存储实现细节的 PV 对接。

本形式为动态调配,如果有一千个 Pod,每个 Pod 有一个 PVC,那么管理员须要人工开设一千个 PV,随着集群规模的扩充,将导致无奈无效治理。

K8S 提供了一种能够动态分配的工作机制,能够主动创立 PV,该机制依赖一个叫做 StorageClass 的 API 对象。

分割我

微信公众号:zuolinux_com

退出移动版