PV静态供给明显的缺点是维护成本太高了!因此,K8s开始支持PV动态供给,使用StorageClass对象实现。

Storgess帮你创建pvc,只需要在pvc里面定义使用哪个storgeclass,storgess可以标志使用什么存储比如nfs ceph, 并不是所有存储支持storgess,有的需要插件。

支持动态供给的存储插件:Storage Classes | Kubernetes

Provisioner


Each StorageClass has a provisioner that determines what volume plugin is used for provisioning PVs. This field must be specified.

Volume PluginInternal ProvisionerConfig Example
AWSElasticBlockStoreAWS EBS
AzureFileAzure File
AzureDiskAzure Disk
CephFS--
CinderOpenStack Cinder
FlexVolume--
Flocker-
GCEPersistentDiskGCE PD
GlusterfsGlusterfs
iSCSI--
QuobyteQuobyte
NFS-NFS
RBDCeph RBD
VsphereVolumevSphere
PortworxVolumePortworx Volume
ScaleIOScaleIO
StorageOSStorageOS
Local-Local

NFS

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: example-nfs
provisioner: example.com/external-nfs
parameters:
  server: nfs-server.example.com
  path: /share
  readOnly: false
  • server: Server is the hostname or IP address of the NFS server.
  • path: Path that is exported by the NFS server.
  • readOnly: A flag indicating whether the storage will be mounted as read only (default false).

Kubernetes doesn't include an internal NFS provisioner. You need to use an external provisioner to create a StorageClass for NFS. Here are some examples:

PV 动态供给(StorageClass)


                                           基于NFS实现PV动态供给流程图

[root@k8s-master nfs-client]# ls
class.yaml  deployment.yaml  rbac.yaml
[root@k8s-master nfs-client]# kubectl apply -f .


[root@k8s-master nfs-client]# cat deployment.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
---
kind: Deployment
apiVersion: apps/v1 
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  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.179.102 
            - name: NFS_PATH
              value: /ifs/kubernetes
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.179.102
            path: /ifs/kubernetes


[root@k8s-master ~]# kubectl get pod,svc
NAME                                         READY   STATUS    RESTARTS   AGE
pod/nfs-client-provisioner-855d45d4f-l5h9w   1/1     Running   0          4m58s

 部署NFS实现自动创建PV插件:

  • git clone https://github.com/kubernetes-incubator/external-storage
  • cd nfs-client/deploy
  • kubectl apply -f rbac.yaml                       # 授权访问apiserver
  • kubectl apply -f deployment.yaml           # 部署插件,需修改里面NFS服务器地址与共享目录
  • kubectl apply -f class.yaml                     # 创建存储类

当前申请的pv请求会给到storageClass,storageClass会将请求交给之前创建的扩展插件处理,自动创建pv,也就是不需要手工创建pv 

[root@k8s-master ~]# cat deployment-sc.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-sc
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-sc
  template:
    metadata:
      labels:
        app: nginx-sc
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
      volumes:
      - name: wwwroot
        persistentVolumeClaim:
          claimName: my-pvc3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc3
spec:
  storageClassName: "managed-nfs-storage"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 18Gi


[root@k8s-master nfs-client]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS          REASON   AGE
pvc-d033b273-a2c2-4c78-bd7e-074114a32ee6   18Gi       RWX            Delete           Bound    default/my-pvc   managed-nfs-storage            88s

[root@k8s-master nfs-client]# kubectl get pvc
NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
my-pvc   Bound    pvc-d033b273-a2c2-4c78-bd7e-074114a32ee6   18Gi       RWX            managed-nfs-storage   98s

[root@k8s-master nfs-client]# kubectl get sc
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  4m

[root@k8s-master nfs-client]# kubectl get pod -o wide
NAME                                      READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
deployment-sc-c5d6db95-95xt4              1/1     Running   0          7m17s   10.244.36.77     k8s-node1   <none>           <none>
deployment-sc-c5d6db95-g4vrh              1/1     Running   0          7m17s   10.244.169.141   k8s-node2   <none>           <none>
deployment-sc-c5d6db95-g5cwx              1/1     Running   0          7m17s   10.244.169.140   k8s-node2   <none>           <none>
nfs-client-provisioner-776769c5c7-2zx55   1/1     Running   0          8m16s   10.244.169.139   k8s-node2   <none>           <none>

 这个目录实际上就是插件帮你创建的,这个目录就是为一组pod提供存储(目录名称为pvc名字+pv名字)

[root@reg ~]# cd /ifs/kubernetes/
[root@reg kubernetes]# ls
default-my-pvc-pvc-d033b273-a2c2-4c78-bd7e-074114a32ee6
[root@reg kubernetes]# cd default-my-pvc-pvc-d033b273-a2c2-4c78-bd7e-074114a32ee6/
[root@reg default-my-pvc-pvc-d033b273-a2c2-4c78-bd7e-074114a32ee6]# ls
[root@reg default-my-pvc-pvc-d033b273-a2c2-4c78-bd7e-074114a32ee6]# echo "default my-mypvc" >> index.html


[root@k8s-master nfs-client]# curl 10.244.169.140
default my-mypvc

当你使用了delete回收策略,当pvc删除,对应的pv也会删除,并且之前的数据会被清理 

[root@k8s-master nfs-client]# kubectl delete -f deployment-sc.yaml 
deployment.apps "deployment-sc" deleted
persistentvolumeclaim "my-pvc" deleted
[root@k8s-master nfs-client]# kubectl get pvc,pv
No resources found

后端并没有被删除,将之前的目录做了一个归档,如果不想要归档设置存储类 

[root@k8s-master nfs-client]# vim class.yaml 
archiveOnDelete: "false"
[root@reg ~]# cd /ifs/kubernetes/
[root@reg kubernetes]# ls
archived-default-my-pvc-pvc-d033b273-a2c2-4c78-bd7e-074114a32ee6
[root@reg kubernetes]# ls archived-default-my-pvc-pvc-d033b273-a2c2-4c78-bd7e-074114a32ee6/
index.html

 

 

NFS权限不足问题


 kubectl logs   nfs-client-provisioner-8f7d9db6b-cnv7n

failed to provision volume with StorageClass "managed-nfs-storage": unable to create directory to provision new pv: mkdir /persistentvolumes/default-data-nacos-0-pvc-6e8f2f4f-be81-11ed-8c76-5254004d77d3: permission denied
 

日志文件提示:permission denied

原因:NFS服务器的共享文件:没有权限

 

 

 

总结


pvc匹配pv 容量匹配 访问模式匹配

你可能的疑问?

Q:PV与PVC什么关系?

A:一对一

Q:PVC与PV怎么匹配的?

A:访问模式和存储容量

Q:容量匹配策略

A:匹配就近的符合的容量(向上)

Q:存储容量是真的用于限制吗?

A:存储容量取决于后端存储,容量字段主要还是用于匹配

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐