静态PV:
    手动创建PV和PVC,PV和PVC通过大小和类型自动匹配PV。

    1. [root@VM_0_48_centos prometheus]# cat mypv.yaml
    2. apiVersion: v1
    3. kind: PersistentVolume
    4. metadata:
    5. name: pv001
    6. spec:
    7. capacity:
    8. storage: 10Gi
    9. accessModes:
    10. - ReadWriteMany
    11. nfs:
    12. path: /data/k8s
    13. server: 172.19.0.14
    14. [root@VM_0_48_centos prometheus]# cat mypvc.yaml ###会根据大小和类型自动匹配到上面的PV
    15. kind: PersistentVolumeClaim
    16. apiVersion: v1
    17. metadata:
    18. namespace: kube-system
    19. name: prometheus-claim
    20. spec:
    21. accessModes:
    22. - ReadWriteMany
    23. resources:
    24. requests:
    25. storage: 10Gi
    26. ----------------------------
    27. 如需使用的话:
    28. volumeMounts:
    29. - name: config-volume
    30. mountPath: /etc/config
    31. - name: prometheus-data
    32. mountPath: /data
    33. subPath: ""
    34. terminationGracePeriodSeconds: 300
    35. volumes:
    36. - name: config-volume
    37. configMap:
    38. name: prometheus-config
    39. - name: prometheus-data
    40. persistentVolumeClaim: #申明使用静态PVC永久化存储
    41. claimName: prometheus-claim

    动态PV:
    我们需要使用到StorageClass,来对接存储,靠他来自动关联pvc,并创建pv。

    [root@master storage]# cat storageclass-nfs.yaml
    apiVersion: storage.k8s.io/v1beta1
    kind: StorageClass
    metadata:
      name: managed-nfs-storage
    provisioner: fuseim.pri/ifs
    
    因为storage自动创建pv需要经过kube-apiserver,所以要进行授权
    [root@master storage]# cat rbac.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
    
    ---
    
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    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"]
    
    ---
    
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    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@master storage]# cat deployment-nfs.yaml     ##因为使用的是NFS,所提需要nfs-client-provisioner镜像自动创建pv
    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: nfs-client-provisioner
    spec:
      replicas: 1
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: nfs-client-provisioner
        spec:
        #  imagePullSecrets:
        #    - name: registry-pull-secret
          serviceAccount: nfs-client-provisioner
          containers:
            - name: nfs-client-provisioner
              #image: quay.io/external_storage/nfs-client-provisioner:latest
              image: lizhenliang/nfs-client-provisioner:v2.0.0
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME
                  #这个值是定义storage里面的那个值
                  value: fuseim.pri/ifs
                - name: NFS_SERVER
                  value: 192.168.1.39
                - name: NFS_PATH
                  value: /opt/container_data
          volumes:
            - name: nfs-client-root
              nfs:
                server: 192.168.1.39
                path: /opt/container_data
    

    示例的nginx服务:

    [root@master ~]# cat nginx.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "nginx"
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "managed-nfs-storage"
          resources:
            requests:
              storage: 1Gi