前言

自建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节点):

  1. 创建根目录
mkdir -p /mnt/nfs
  1. 编辑
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找个目录包装成根目录
  1. 启动nfs服务
systemctl start rpcbind.service
systemctl start nfs-server.service
  1. 设置开机自启
systemctl enable rpcbind.service
systemctl enable nfs-server.service
  1. 使用配置生效
exportfs -r
  1. 查看挂载情况
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

  1. 添加Helm存储库
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
  1. 本地仓库搜
helm search repo nfs-client-provisioner
  1. 开始安装
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:设为默认存储类
  1. 查看安装情况
kubectl get sc

k8s 安装openstack k8s 安装nfs_根目录

使用样例

  1. 创建一个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
  1. 执行发布命令
kubectl apply -f pvc-test.yaml
  1. 查看pvc
# 查看列表
kubectl get pvc
# 查看详情

状态为Pending则为异常,Bound为成功。

如果查看详情有permission denied字样,则需要给nfs目录777权限

chmod 777 -R /mnt/nfs/k8s

k8s 安装openstack k8s 安装nfs_根目录_02

  1. 查看nfs目录
    生成了一个动态的持久化目录
    命名规则为:命名空间+pvc名称+pvc标识+随机字符串
  2. 卸载
kubectl delete -f pvc-test.yaml
  1. 卸载后,目录还会存在,不过会加上archived前辍
    当然,这个和pvc配置的策略有关,这里暂时不展开,只是先简单的会使用。
  2. 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挂到容器上就可以了,这里先不讲更为具体的案例,后面涉及到持久化的,会详细展开说明。