首页 >  kubernetes >  nfs网络文件系统
nfs网络文件系统
编辑时间:2022-08-27 11:17:01 浏览量:523

1 nfs服务端

以master作服务端

yum -y install nfs-utils rpcbind #安装
 
#启动服务
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs
systemctl enable nfs
 
mkdir /home/nfs-share #创建共享目录(存储目录)
chmod -R 777 /home/nfs-share #设置权限


配置文件为/etc/exports,通过此配置文件可以设置服务端的共享文件目录。NFS客户端地址:允许其访问的NFS服务端的客户端地址,可以是客户端IP地址,也可以是一个网段(192.168.1.0/24),或者是*表示所有客户端IP都可以访问。

echo "/home/nfs-share 192.168.1.0/24(rw,async,insecure,no_subtree_check,no_root_squash)" >> /etc/exports #我以网段设置,用IP就需设置两条
 
exportfs -r #使设置生效
 
showmount -e 192.168.1.135 #检查nfs服务是否能正常访问


共享目录设置参数说明:

        image.png                       

 

2 nfs客户端

Node作客户端

yum -y install nfs-utils #安装
systemctl start nfs && systemctl enable nfs #启动


设置挂载

mkdir /mnt/nfs #创建挂载目录
chmod -R 777 /mnt/nfs #设置权限
 
mount -t nfs 192.168.1.135:/home/nfs-share /mnt/nfs
 
umount /mnt/nfs #取消挂载


设置成功后可在客户端/mnt/nfs下添加文件或文件夹,会看到服务端和其它客户端都同时有了新加内容。

 

以上设置虽然挂载成功,但重启后会失效。

#自动挂载方法一(修改/etc/fstab)
vi /etc/fstab #修改文件
192.168.1.135:/home/nfs-share /mnt/nfs nfs defaults 0 0
 
#自动挂载方法二(修改/etc/rc.d/rc.local)
#/etc/fstab挂载可能有问题,开机时先挂载本机磁盘再启动网络,而NFS是需要网络启动后才能挂载的(暂未验证)
vi /etc/rc.d/rc.local #修改文件
mount -t nfs 192.168.1.135:/home/nfs-share /mnt/nfs #增加执行挂载命令


 

3 nfs持久化存储storageclass

nfs-storageclass.yml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"   #设置其为默认存储后端
provisioner: storage.pri/nfs   #or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"   #删除pvc后,后端存储上的pv也自动删除


nfs-storageclass.yml

kind: ServiceAccount
apiVersion: v1
metadata:
  name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-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
subjects:
- kind: ServiceAccount
  name: nfs-client-provisioner
  namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
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
subjects:
- kind: ServiceAccount
  name: nfs-client-provisioner
  namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

nfs-provisioner.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
      - name: nfs-client-provisioner
        image: lizhenliang/nfs-client-provisioner:latest
        volumeMounts:
        - name: timezone
          mountPath: /etc/localtime
        - name: nfs-client-root
          mountPath: /persistentvolumes
        env:
        - name: PROVISIONER_NAME
          value: storage.pri/nfs
        - name: NFS_SERVER
          value: 192.168.1.135
        - name: NFS_PATH
          value: /home/nfs-share
      volumes:
      - name: timezone
        hostPath:
          path: /usr/share/zoneinfo/Asia/Shanghai
      - name: nfs-client-root
        nfs:
          server: 192.168.1.135
          path: /home/nfs-share

把上面的三个yaml放在“nfs”文件夹内,上传到服务器,执行如下命令

kubectl apply -f nfs/


#查看nfs-client-provisioner的日志会发现报错:selfLink was empty, can't make reference
kubectl logs -f nfs-client-provisioner-6ffd9bcf77-5r5xj -n default #或直接点日志查看


selfLink was empty 在k8s集群 v1.20之前都存在,在v1.20之后被删除,需要在/etc/kubernetes/manifests/kube-apiserver.yaml 添加参数

增加 - --feature-gates=RemoveSelfLink=false,如下图

image.png

添加之后使用kubeadm部署的集群会自动加载部署pod,如果api-server启动失败 需重新在执行一遍

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml