使用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之后数据还在不在了

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

Have Fun

欢迎关注我的其它发布渠道