• K8S实战(十六)| 持久化存储卷


    前言

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

    PVC 会寻找合适的 PV 进行绑定,绑定成功后,PVC 就可以提供给 pod 使用。

    更新历史

    定义 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

    微信扫码关注

  • 相关阅读:
    spring声明式事务
    spring的传播行为和隔离级别
    索引(index)
    存储过程(转)
    Java中ArrayList相关的5道面试题
    记CVTE2014年春季招聘实习生求职历程
    Java中String,StringBuffer,StringBuilder的区别及其使用
    Linux下C程序的编译,运行,及调试
    skynet源码分析之skynet_server
    skynet源码分析之skynet_module
  • 原文地址:https://www.cnblogs.com/zuolinux/p/13693799.html
Copyright © 2020-2023  润新知