简介
要实现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/
可以看到有下面几个文件
[root@nginx1-pro 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
apiVersion: v1
kind: Namespace
metadata:
name: nfs-client
之后修改rbac.yaml
和deployment.yaml
的namespace为你创建的namespace
修改完成之后我们修改deployment.yaml
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
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.yaml
和test-pod.yaml
是用来测试的,首先看test-claim.yaml
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有
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
那么就会动态创建pv
接着你就可以使用这两个文件测试下是不是会动态创建pv,以及删除pvc之后数据还在不在了
欢迎关注我的博客www.bboy.app
Have Fun