前言
自建k8s集群,或要做持久化存储,一般都会选择nfs,而为了管理方便,我们一般都会安装nfs-client-provisinoner来动态创建存储。下面来介绍其安装与使用。
环境
主机名 | ip | 角色 |
mldong01 | 192.168.0.245 | master |
mldong02 | 192.168.0.54 | node01 |
mldong03 | 192.168.0.22 | node02 |
三台主机为华为软开云的ECS,CentOS Linux release 7.6.1810 (Core)
安装前准备
所有节点安装NFS客户端
yum install -y nfs-utils
选择一台做nfs server
进行如下配置(这里选择mldong01节点):
- 创建根目录
mkdir -p /mnt/nfs
- 编辑
vim /etc/exports
/mnt/nfs/ 192.168.0.0/24(rw,sync,fsid=0)
- 同192.168.0.0/24一个网络号的主机可以挂载NFS服务器上的/mnt/nfs/目录到自己的文件系统中
- rw表示可读写
- sync表示同步写
- fsid=0表示将/mnt找个目录包装成根目录
- 启动nfs服务
systemctl start rpcbind.service
systemctl start nfs-server.service
- 设置开机自启
systemctl enable rpcbind.service
systemctl enable nfs-server.service
- 使用配置生效
exportfs -r
- 查看挂载情况
exportfs
在另一个节点上验证
这里选择mldong02
mkdir -p /mnt/nfs
mount -t nfs 192.168.0.245:/mnt/nfs /mnt/nfs
查看挂载情况
df -h | grep /mnt/nfs
可在master上添加一个文件,再node上是否可以查看
取消挂载(按需)
umount /mnt/nfs
安装nfs-provisioner
- 添加Helm存储库
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
- 本地仓库搜
helm search repo nfs-client-provisioner
- 开始安装
helm install nfs-storage azure/nfs-client-provisioner \
--set nfs.server=192.168.0.245 \
--set nfs.path=/mnt/nfs/k8s \
--set storageClass.name=nfs-storage \
--set storageClass.defaultClass=true
说明:
- nfs.server:nfs服务地址
- nfs.path:nfs根目录
- storageClass.name:存储类名称
- storageClass.defaultClass:设为默认存储类
- 查看安装情况
kubectl get sc
使用样例
- 创建一个pvc
# 配置
cat <<EOF > pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-test
spec:
storageClassName: "nfs-storage"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
EOF
- 执行发布命令
kubectl apply -f pvc-test.yaml
- 查看pvc
# 查看列表
kubectl get pvc
# 查看详情
状态为Pending则为异常,Bound为成功。
如果查看详情有permission denied字样,则需要给nfs目录777权限
chmod 777 -R /mnt/nfs/k8s
- 查看nfs目录
生成了一个动态的持久化目录
命名规则为:命名空间+pvc名称+pvc标识+随机字符串 - 卸载
kubectl delete -f pvc-test.yaml
- 卸载后,目录还会存在,不过会加上
archived
前辍
当然,这个和pvc配置的策略有关,这里暂时不展开,只是先简单的会使用。 - pods使用样例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: mldong-test
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: port
protocol: TCP
volumeMounts:
- name: nginx-pvc # 与下面的volumes.name一致
mountPath: "/usr/share/nginx/html" # 容器对应的目录
volumes:
- name: nginx-pvc # 这里定义的名称,与上面的volumeMounts.name一致
persistentVolumeClaim:
claimName: nginx-pvc # 创建的pvc名称
小结
本文只是简单讲了nfs-client-provisioner的安装,基本上安装好nfs-client-provisioner,就可以使用动态存储类去定义pvc了。然后再将pvc挂到容器上就可以了,这里先不讲更为具体的案例,后面涉及到持久化的,会详细展开说明。