环境说明:作者使用的环境是 Debian 10,K8S的容器运行时是 CRI-O。默认使用root账号,所有指令都在root下执行。
背景
在使用Kubernetes时,总会需要提供后端存储能力。而NFS Provisioner是一个不错的解决方案。
NFS Provisioner 简介
NFS Provisioner 是一个自动配置卷程序,它使用现有的和已配置的 NFS 服务器来支持通过持久卷声明动态配置 Kubernetes 持久卷。
持久卷被配置为:namespace−{pvcName}-${pvName}。
有了这样的特性支持,我们只需要配置服务需要的PVC,设定好资源,就能动态分配好存储空间。不过这里并没有考虑高可用等问题。这种简便的方式个人觉得用在分配一些需要数据持久化但又不是十分重要的场景下比较合适。例如一些文件数据的缓存等。
安装配置 NFS 服务
1 2 3 4 5 6 7 8 9 10
| # 安装nfs client 与 server apt-get install nfs-kernel-server nfs-common # 创建存储目录 mkdir -p /nfs-homespace/kubernetes # edit /etc/exports # (IP) 是服务器的访问ip,可以是内网ip,也可以是公网 /nfs-homespace/kubernetes 10.96.0.0/16(rw,sync,no_subtree_check,no_root_squash) /nfs-homespace/kubernetes (IP)(rw,sync,no_subtree_check,no_root_squash) # restart nfs-kernel-server service nfs-kernel-server restart
|
配置 NFS-Client-Provisioner
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 拉取配置文件 git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git # 其实需要用到的只是 deploy 目录里面的 rbac.yaml class.yaml deployment.yaml # 复制一份,里面可按自己需要修改 namespace,或者直接放在default里也可以 cp -r nfs-subdir-external-provisioner/deploy ./deploy # 配置 cd deploy # rbac权限管理 kubectl apply -f rbac.yaml # nfs-client-provisioner 与 storageclass kubectl apply -f class.yaml -f deploment.yaml
# 测试是否成功 kubectl apply -f test-claim -f test-pod
|
在 NFS 服务器上查看,生成了相应的数据目录,成功 : )
期间遇到的问题
PVC 一直处于 Pending 状态, 通过查log,发现错误信息 selfLink was empty, can’t make reference。google查了下,需要配置 feature-gates 的 RemoveSelfLink=false (默认建议是true,其实应该是master机器配置pod才有的问题)
1 2 3 4 5 6 7 8 9 10 11
| # 动态修改 fature-gates,追加 RemoveSelfLink=false # Edit /etc/kubernetes/manifests/kube-apiserver.yaml # 追加 - --feature-gates=RemoveSelfLink=false # kubelet会监控文件,修改后,会自动终止api-server,重新配置启动。这时候会出现服务停顿,要注意。 # 服务恢复后,重新配置一次 deploment.yaml kubectl delete -f deploment.yaml kubectl apply -f deploment.yaml
# 再次测试,成功~ kubectl apply -f test-claim -f test-pod
|
(图:配置 feature-gates参数)
参考
https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner