本文介绍在k8s集群中部署nfs-csi-driver

环境依赖

  • Docker
  • Kubernetes(本文是基于Rancher的RKE集群)

前言

csi-driver是非常丰富的,新搭建的集群,推荐使用阿里云的NAS作为存储后端(NAS对比云盘,扩展性高、费用低、容错好),使用阿里云提供的NAS CSI Plugin进行csi-driver的安装。

对于有云盘的ECS或者本地服务器来说,可以使用NFS作为存储后端,k8s官方提供了nfs-csi-driver

如果是阿里的ECS,还可以使用阿里提供的disk-csi-driver,使用云盘作为存储后端(有单机故障的风险)

部署nfs-csi-driver

1、安装nfs-server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 选择一台主机,安装nfs-server
$ sudo apt update
$ sudo apt install nfs-kernel-server
$ mkdir -p /data/nfs
$ sudo vim /etc/fstab
172.16.1.23:/data/nfs /data/nfs nfs defaults,timeo=900,retrans=5,_netdev 0 0
$ sudo vim /etc/exports
/data/nfs 172.16.1.23/12(rw,sync,all_squash,anonuid=1001,anongid=1001,no_subtree_check) # 这里设置anonuid和anongid,是为了便于部署bitnami提供的helm charts
$ sudo exportfs -ra
# bitnami提供的helm-chart的fsGroup默认是1001,如果1001的用户被占用,可以修改用户的uid和gid,将1001空出来给bitnami使用

# 其他主机,配置nfs-client
$ apt install nfs-common
$ sudo mount -t nfs -o vers=4 172.16.1.23:/data/nfs /data/nfs

$ sudo vim /etc/fstab
172.16.1.23:/data/nfs /data/nfs nfs defaults,timeo=900,retrans=5,_netdev 0 0

# 测试nfs访问
# 在任意一台机器上创建、修改、删除文件,在其他机器上会对应列出修改

2、安装nfs-csi-driver

这里有个小插曲,由于国内的网络环境,无法下载谷歌的docker镜像,所以只能一个个的把它们转到dockerhub上

1
2
3
4
5
6
7
8
9
10
11
docker pull k8s.gcr.io/sig-storage/livenessprobe:v2.1.0 \
&& docker tag k8s.gcr.io/sig-storage/livenessprobe:v2.1.0 qq1398371419/gcr.sig-storage.livenessprobe:v2.1.0 \
&& docker push qq1398371419/gcr.sig-storage.livenessprobe:v2.1.0

docker pull k8s.gcr.io/sig-storage/csi-provisioner:v2.1.0 \
&& docker tag k8s.gcr.io/sig-storage/csi-provisioner:v2.1.0 qq1398371419/gcr.sig-storage.csi-provisioner:v2.1.0 \
&& docker push qq1398371419/gcr.sig-storage.csi-provisioner:v2.1.0

docker pull k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0 \
&& docker tag k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0 qq1398371419/gcr.sig-storage.csi-node-driver-registrar:v2.1.0 \
&& docker push qq1398371419/gcr.sig-storage.csi-node-driver-registrar:v2.1.0

安装nfs-csi-driver

1
curl -skSL https://gitee.com/qq1398371419/csi-driver-nfs/raw/master/deploy/install-driver.sh | bash -s master --

Image

3、安装StorageClass

nfs-sc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
server: 172.16.1.23 # 这里改成自己的内网IP
share: /data/nfs # 这里改成自己的nfs共享目录
reclaimPolicy: Retain
volumeBindingMode: Immediate
mountOptions:
- hard
- nfsvers=4.1
1
$ kubectl create -f nfs-sc.yaml

4、测试部署Redis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ vim redis-test.yaml
---
master:
persistence:
storageClass: nfs-csi
service:
nodePort: 30001
type: NodePort
replica:
persistence:
storageClass: nfs-csi
auth:
enabled: false
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm install my-release bitnami/redis -f redis-test.yaml

image-20210620031253181

问题

前面提到的设置anonuid和anongid,是因为部署bitnami提供的helm charts遇到了无法写入文件的问题,之所以设置为1001,因为bitnami默认的uid是1001

Image

容器对于mount的路径的访问权限问题,可以参考https://www.cnblogs.com/sammyliu/p/10129670.html

相关资料