zoukankan      html  css  js  c++  java
  • pv和pvc

    概念

    PV 的全称是:PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如 Ceph、GlusterFS、NFS 等,都是通过插件机制完成与共享存储的对接。

    PVC 的全称是:PersistentVolumeClaim(持久化卷声明),PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。

    但是通过 PVC 请求到一定的存储空间也很有可能不足以满足应用对于存储设备的各种需求,而且不同的应用程序对于存储性能的要求可能也不尽相同,比如读写速度、并发性能等,为了解决这一问题,Kubernetes 又为我们引入了一个新的资源对象:StorageClass,通过 StorageClass 的定义,管理员可以将存储资源定义为某种类型的资源,比如快速存储、慢速存储等,用户根据 StorageClass 的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根据应用的特性去申请合适的存储资源了。

    NFS

    server

    yum -y install nfs-utils rpcbind
    mkdir -pv /data/k8s
    cd /data/k8s/
    chmod 755 /data/k8s/
    
    vim /etc/exports
    /data/k8s  *(rw,sync,no_root_squash)
    
    
    systemctl start rpcbind.service
    systemctl status rpcbind
    systemctl start nfs.service
    systemctl status nfs
    

    client

    yum -y install nfs-utils rpcbind
    showmount -e 192.168.6.101
    
    mount -t nfs 192.168.6.101:/data/k8s /root/sy/data
    

    PV

    PV 作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略等关键信息,新建一个 PV 对象,使用 nfs 类型的后端存储,1G 的存储空间,访问模式为 ReadWriteOnce,回收策略为 Recyle。

    [root@master101 pv]# cat pv1-demo.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name:  pv1
    spec:
      capacity:
        storage: 1Gi
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      nfs:
        path: /data/k8s
        server: 192.168.6.101
    [root@master101 pv]#kubectl create -f pv1-demo.yaml
    
    [root@master101 pv]# kubectl get pv
    NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    pv1    1Gi        RWO            Recycle          Available                                    4s
    

    Capacity(存储能力)

    一般来说,一个 PV 对象都要指定一个存储能力,通过 PV 的 capacity属性来设置的,目前只支持存储空间的设置,就是我们这里的 storage=1Gi,不过未来可能会加入 IOPS、吞吐量等指标的配置。

    AccessModes(访问模式)

    AccessModes 是用来对 PV 进行访问模式的设置,用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:

    • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
    • ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
    • ReadWriteMany(RWX):读写权限,可以被多个节点挂载

    注意:一些 PV 可能支持多种访问模式,但是在挂载的时候只能使用一种访问模式,多种访问模式是不会生效的。

    persistentVolumeReclaimPolicy(回收策略)

    我这里指定的 PV 的回收策略为 Recycle,目前 PV 支持的策略有三种:

    • Retain(保留)- 保留数据,需要管理员手工清理数据
    • Recycle(回收)- 清除 PV 中的数据,效果相当于执行 rm -rf /thevoluem/*
    • Delete(删除)- 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务,比如 ASW EBS。

    不过需要注意的是,目前只有 NFS 和 HostPath 两种类型支持回收策略。当然一般来说还是设置为 Retain 这种策略保险一点。

    状态

    一个 PV 的生命周期中,可能会处于4中不同的阶段:

    • Available(可用):表示可用状态,还未被任何 PVC 绑定
    • Bound(已绑定):表示 PV 已经被 PVC 绑定
    • Released(已释放):PVC 被删除,但是资源还未被集群重新声明
    • Failed(失败):表示该 PV 的自动回收失败

    PVC

    创建不带标签的

    [root@master101 pv]# cat pvc-nfs.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-nfs
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    [root@master101 pv]# kubectl get pv
    NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    pv1    1Gi        RWO            Recycle          Available                                   8m17s
    
    
    [root@master101 pv]# kubectl create -f pvc-nfs.yaml
    persistentvolumeclaim/pvc-nfs created
    
    
    [root@master101 pv]# kubectl get pvc
    NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-nfs   Bound    pv1      1Gi        RWO                           18s
    
    [root@master101 pv]# kubectl get pv
    NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
    pv1    1Gi        RWO            Recycle          Bound    default/pvc-nfs                           9m11s
    

    创建带标签的

    [root@master101 pv]# cat pv2-nfs.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv2-nfs
      labels:
        app: nfs
    spec:
      capacity:
        storage: 2Gi
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      nfs:
        server: 192.168.6.101
        path: /data/k8s
    [root@master101 pv]# kubectl create -f pv2-nfs.yaml
    persistentvolume/pv2-nfs created
    [root@master101 pv]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM             STORAGECLASS   REASON   AGE
    pv1       1Gi        RWO            Recycle          Bound       default/pvc-nfs                           14m
    pv2-nfs   2Gi        RWO            Recycle          Available                                             3s
    [root@master101 pv]# cat pvc2-nfs.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc2-nfs
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi
      selector:
        matchLabels:
          app: nfs
    [root@master101 pv]# kubectl create -f pvc2-nfs.yaml
    persistentvolumeclaim/pvc2-nfs created
    [root@master101 pv]# kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS   REASON   AGE
    pv1       1Gi        RWO            Recycle          Bound    default/pvc-nfs                            15m
    pv2-nfs   2Gi        RWO            Recycle          Bound    default/pvc2-nfs                           61s
    [root@master101 pv]# kubectl get pvc
    NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-nfs    Bound    pv1       1Gi        RWO                           7m21s
    pvc2-nfs   Bound    pv2-nfs   2Gi        RWO                           4s
    

    StorageClass

    创建 Provisioner

    要使用 StorageClass,我们就得安装对应的自动配置程序,比如我们这里存储后端使用的是 nfs,那么我们就需要使用到一个 nfs-client 的自动配置程序,我们也叫它 Provisioner,这个程序使用我们已经配置好的 nfs 服务器,来自动创建持久卷,也就是自动帮我们创建 PV。

    • 自动创建的 PV 以${namespace}-${pvcName}-${pvName}这样的命名格式创建在 NFS 服务器上的共享数据目录中
    • 而当这个 PV 被回收后会以archieved-${namespace}-${pvcName}-${pvName}这样的命名格式存在 NFS 服务器上。
    [root@master101 pv]# cat nfs-client.yaml
    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: nfs-client-provisioner
    spec:
      replicas: 1
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: nfs-client-provisioner
        spec:
          serviceAccountName: nfs-client-provisioner
          containers:
            - name: nfs-client-provisioner
              image: quay.io/external_storage/nfs-client-provisioner:latest
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME
                  value: fuseim.pri/ifs
                - name: NFS_SERVER
                  value: 192.168.6.101
                - name: NFS_PATH
                  value: /data/k8s
          volumes:
            - name: nfs-client-root
              nfs:
                server: 192.168.6.101
                path: /data/k8s
    [root@master101 pv]# cat nfs-client-sa.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
    
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["list", "watch", "create", "update", "patch"]
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
    
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        namespace: default
    roleRef:
      kind: ClusterRole
      name: nfs-client-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    [root@master101 pv]# cat nfs-client-class.yaml
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage
    provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
    [root@master101 pv]# kubectl create -f nfs-client.yaml
    deployment.extensions/nfs-client-provisioner created
    [root@master101 pv]# kubectl create -f nfs-client-sa.yaml
    serviceaccount/nfs-client-provisioner created
    clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
    clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
    [root@master101 pv]# kubectl create -f nfs-client-class.yaml
    storageclass.storage.k8s.io/nfs-storage created
    [root@master101 pv]# kubectl get pods
    NAME                                     READY   STATUS              RESTARTS   AGE
    nfs-client-provisioner-8c7fc4457-d8v6z   0/1     ContainerCreating   0          10s
    recycler-for-pv2-nfs                     0/1     ContainerCreating   0          10m
    [root@master101 pv]# kubectl get storageclass
    NAME          PROVISIONER      AGE
    nfs-storage   fuseim.pri/ifs   13s
    

    创建pvc

    两种方法

    添加annotations属性

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc
      annotations:
        volume.beta.kubernetes.io/storage-class: "nfs-storage"
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Mi
    

    设置默认存储

    kubectl patch storageclass nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.
    

    转载​ 微信公众号SY小站

    现在学习还不晚;
  • 相关阅读:
    团队会议第八天
    团队会议第七天
    站立会议第五天
    站立会议第四天
    站立会议第三天
    站立会议第二天
    站立会议第一天(2016.4.19)
    团队报告
    团队计划backlog
    每日Scrum(5)
  • 原文地址:https://www.cnblogs.com/ainimore/p/13206834.html
Copyright © 2011-2022 走看看