使用nfs-client-provisioner动态创建pv

简介

要实现kubernetes中动态创建pv必须先创建StorageClass,每一个StorageClass对应了一个provisioner,kubernetes中内置了很多provisioner,但是很难受的是没有内置的nfs provisioner,对于我们这种没有钱的玩家,nfs是实现后端存储最简单直接的方法,所以不知道为什么k8s不提供,但是没关系有方法实现,k8s允许提供外部的provisioner,而nfs可以使用nfs-client-provisioner

https://github.com/kubernetes-retired/external-storage/tree/master/nfs-client

配置NFS-Client provisioner

首先clone这个项目

git clone https://github.com/kubernetes-retired/external-storage.git

之后进入nfs-client/deploy/文件夹

cd nfs-client/deploy/

可以看到有下面几个文件

1
2
3
4
5
6
7
8
9
[[email protected] deploy]# ll
总用量 28
-rw-r--r-- 1 root root  225 9月   3 14:26 class.yaml
-rw-r--r-- 1 root root 1030 9月   3 13:17 deployment-arm.yaml
-rw-r--r-- 1 root root 1040 9月   3 13:30 deployment.yaml
drwxr-xr-x 2 root root  214 9月   3 13:32 objects
-rw-r--r-- 1 root root 1834 9月   3 13:19 rbac.yaml
-rw-r--r-- 1 root root  241 9月   3 13:55 test-claim.yaml
-rw-r--r-- 1 root root  399 9月   3 13:38 test-pod.yaml

首先你要做的是创建一个独立的命名空间

vim namespace.yaml

1
2
3
4
apiVersion: v1
kind: Namespace
metadata:
  name: nfs-client

之后修改rbac.yamldeployment.yaml的namespace为你创建的namespace

修改完成之后我们修改deployment.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.1.11
            - name: NFS_PATH
              value: /data/kubernetes
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.1.11
            path: /data/kubernetes

PROVISIONER_NAME之后创建StorageClass要使用到,你可以修改成其他的名字,其他的参数根据你的nfs服务器来配置

之后apply rbac和deployment

kubectl apply -f deployment.yaml

kubectl apply -f rbac.yaml

创建完成之后我们来创建StorageClass

查看class.yaml

cat class.yaml

1
2
3
4
5
6
7
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"

provisioner就是刚才deployment中的PROVISIONER_NAME,还有一个比较关键的参数是archiveOnDelete,如果你想在删除了pvc之后还保留数据的话需要把这个参数改为true,不然你删除了pvc同时pv也会删除,然后数据也会丢失

apply class.yaml

kubectl apply -f class.yaml

测试

test-claim.yamltest-pod.yaml是用来测试的,首先看test-claim.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

很简单,只要pvc有

1
2
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"

那么就会动态创建pv

接着你就可以使用这两个文件测试下是不是会动态创建pv,以及删除pvc之后数据还在不在了

欢迎关注我的博客 www.bboy.app

Have Fun