前言
自建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挂到容器上就可以了,这里先不讲更为具体的案例,后面涉及到持久化的,会详细展开说明。