部署NFS

安装nfs套件

  1. yum -y install nfs-utils

配置nfs路径

mkdir /home/nfs
chmod 777 /home/nfs

配置

vim /etc/exports
/home/nfs 192.168.31.10/24(rw)

启动

systemctl start nfs-server && systemctl enable nfs-server

看下111端口起来没?

[root@node1 k8s_nfs]# netstat -tnlp|grep 111
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      44466/rpcbind
tcp6       0      0 :::111                  :::*                    LISTEN      44466/rpcbind

起来了~

挂载个目录试试~

mount -t nfs 192.168.31.10:/home/nfs /home/test
echo "hello" > /home/test/a.txt
cat /home/nfs/a.txt

没啥问题了

然后就是搞k8s的了

nfs sc动态存储怎么搞?

先配置rbac

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner-one
  namespace: nfs
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-one-runner
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: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner-one
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner-one
    namespace: nfs
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-one-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner-one
  # replace with namespace where provisioner is deployed
  namespace: nfs
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner-one
  # replace with namespace where provisioner is deployed
  namespace: nfs
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner-one
    # replace with namespace where provisioner is deployed
    namespace: nfs
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner-one
  apiGroup: rbac.authorization.k8s.io

权限都安排上了

provisioner配置下:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nfs-client-provisioner-one
  name: nfs-client-provisioner-one
  namespace: nfs
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nfs-client-provisioner-one
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nfs-client-provisioner-one
    spec:
      containers:
      - env:
        - name: PROVISIONER_NAME
          value: nfsone
        - name: NFS_SERVER
          value: 192.168.31.10
        - name: NFS_PATH
          value: /data-nfs
        image: easzlab/nfs-subdir-external-provisioner:v4.0.1
        imagePullPolicy: Always
        name: nfs-client-provisioner-one
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /persistentvolumes
          name: nfs-client-root
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: nfs-client-provisioner-one
      serviceAccountName: nfs-client-provisioner-one
      terminationGracePeriodSeconds: 30
      volumes:
      - name: nfs-client-root
        nfs:
          path: /home/nfs
          server: 192.168.31.10

最后声明下StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  #创建PVC时会用到的参数
  name: nfs-one
  labels:
    uds.dce.daocloud.io/storage-type: file
  annotations:
   # 设置该storageclass为PVC创建时默认使用的存储机制;如果不设置该参数,PVC想要使用该storageclass时需要指定 storageclassname
    storageclass.kubernetes.io/is-default-class: "true"
#!!!修改值---匹配deployment中的环境变量'PROVISIONER_NAME'
provisioner: nfsone
parameters:
  archiveOnDelete: "true" # "false" 删除PVC时不会保留数据,"true"将保留PVC数据
reclaimPolicy: Retain

就可以声明pvc玩玩了

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: hello-pvc
spec:
  storageClassName: nfs-one
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi