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服务是否能正常访问
共享目录设置参数说明:
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,如下图
添加之后使用kubeadm部署的集群会自动加载部署pod,如果api-server启动失败 需重新在执行一遍
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml