1.安装NFS服务端

找一台服务器作为NFS服务端,安装如下服务

  1. 1.安装包
  2. 在可以联网的机器上下载NFS安装包,以后在服务端和客户端安装使用。
  3. yum -y install nfs-utils --downloadonly --downloaddir /home/nfs
  4. 下载好后打包上传到要安装的服务器中,执行下面命令开始安装
  5. rpm -Uvh *.rpm --nodeps --force
  6. 2.编辑配置文件
  7. ⚠️配置文件中的*是允许所有网段,根据自己实际情况写明网段
  8. cat >/etc/exports <<EOF
  9. /mnt/kubesphere *(insecure,rw,async,no_root_squash)
  10. EOF
  11. 3.创建目录并修改权限
  12. ⚠️这里为了方便实验授予了挂载目录权限为777,请根据实际情况修改目录权限和所有者
  13. mkdir /mnt/kubesphere && chmod 777 /mnt/kubesphere
  14. 4.启动服务
  15. systemctl enable nfs-server rpcbind && systemctl start nfs-server rpcbind

2.配置NFS客户端

在所有k8s集群节点中安装NFS客户端

rpm -Uvh *.rpm --nodeps --force

3.在k8s集群中的任意节点中执行如下操作

创建文件 vi storageclass.yaml内容如下:

cat >storageclass.yaml <<EOF
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
   name: nfs-provisioner-runner
   namespace: default
rules:
   -  apiGroups: [""]
      resources: ["persistentvolumes"]
      verbs: ["get", "list", "watch", "create", "delete"]
   -  apiGroups: [""]
      resources: ["persistentvolumeclaims"]
      verbs: ["get", "list", "watch", "update"]
   -  apiGroups: ["storage.k8s.io"]
      resources: ["storageclasses"]
      verbs: ["get", "list", "watch"]
   -  apiGroups: [""]
      resources: ["events"]
      verbs: ["watch", "create", "update", "patch"]
   -  apiGroups: [""]
      resources: ["services", "endpoints"]
      verbs: ["get","create","list", "watch","update"]
   -  apiGroups: ["extensions"]
      resources: ["podsecuritypolicies"]
      resourceNames: ["nfs-provisioner"]
      verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
spec:
  selector:
    matchLabels:
      app: nfs-client-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-client-provisioner
          image: 192.168.28.150:8001/kubesphere-install/kubesphere/nfs-client-provisioner:v3.1.0-k8s1.11
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.28.160
            - name: NFS_PATH
              value: /mnt/kubesphere
      volumes:
        - name: nfs-client
          nfs:
            server: 192.168.28.160
            path: /mnt/kubesphere
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: fuseim.pri/ifs
reclaimPolicy: Retain
EOF

3.1.应用storageclass.yaml

kubectl apply -f storageclass.yaml

3.2.设置默认strorageclass

kubectl patch storageclass nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

3.3.验证

kubectl get pods

NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-7b9746695c-nrz4n   1/1     Running   0          2m38s

检查默认存储

kubectl get sc

NAME                    PROVISIONER      AGE
nfs-storage (default)   fuseim.pri/ifs   7m22s