环境:k8s一主两从
k8s version: 1.20.2
k8s-master: 192.168.31.200
k8s-node1: 192.168.31.201
k8s-node2: 192.168.31.202
nfs: 192.168.31.100
nfs共享目录:/data

1、搭建nfs服务器

1、更改/etc/exports文件

/data 192.168.31.0/24(rw,async,no_root_squash)

/data:nfs服务器上提供的共享目录
192.168.31.0:表示白名单ip,这里192.168.31.0表示所有192.168.31.x的ip都可以访问
(rw,async,no_root_squash):表示连接nfs服务器的用户的权限
下面配置nfs所有不同权限,表示如下:
 ro: 表示只读权限
 rw: 读写权限
 sync: 数据同步写内存硬盘
 async: 将数据先保存在内存缓冲区中,必要时才写入磁盘;
 all_squash: 不管你访问共享目录的用户是谁,都必须压缩为nfsnobody用户的权限;
 **no_all_squash(默认):**访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
 root_squash: 如果访问共享目录是root的权限用户,对共享目录的权限会被压缩为nfsnobody用户的权
 no_root_squash: 来访的root用户保持root帐号权限;
 no_squash: 访问共享目录时,用户如果是root权限,对共享目录也具有root权限(最好不要设置,增加服务安全隐患,稍后再提)
anonuid=: 指定匿名访问用户的本地用户UID,要和root_squash 以及 all_squash一同使用;
 anongid=: 指定匿名访问用户的本地用户组GID,要和root_squash 以及 all_squash一同使用;
 anonuid/anongid : 要和root_squash 以及 all_squash一同使用,用于指定使用NFS的用户限定后的uid和gid,前提是本机的/etc/passwd中存在这个uid和gid】
secure(默认): 限制客户端只能从小于1024的tcp/ip端口连接服务器;
insecure: 允许客户端从大于1024的tcp/ip端口连接服务器;
wdelay(默认): 检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
no_wdelay: 若有写操作则立即执行,应与sync配合使用;
subtree_check(默认) : 若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
no_subtree_check : 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

2、检查rpc服务,以及安装nfs-utils

rpcbind一般是centos自带,用ss -tlnp|grep 111检查一下rpc服务是否启动
在这里插入图片描述
使用yum安装一下nfs-utils并添加开机自启动

yum install -y nfs-utils && systemctl enable nfs && systemctl start nfs

3、创建data目录并更改权限

mkdir /data && chmod 777 /data

4、检查nfs是否启动正常

rpcinfo -p localhost

在这里插入图片描述
如图所示则是启动正常

2、使用nfs为pv提供动态供给

安装nfs-utils的目的只是为了能查看远程的nfs服务

yum install -y nfs-utils

查看nfs服务端

showmount -e 192.168.31.100

在这里插入图片描述

1、更改配置

k8s版本在1.19以上,需要在
/etc/kubernetes/manifests/kube-apiserver.yaml
/etc/kubernetes/manifests/kube-controller-manager.yaml
/etc/kubernetes/manifests/kube-scheduler.yaml
三个配置文件的command下添加一行配置

--feature-gates=RemoveSelfLink=false

在这里插入图片描述
在这里插入图片描述

2、使用nfs-client插件连接nfs服务端

K8S的外部NFS驱动,可以按照其工作方式(是作为NFS server还是NFS client)分为两类:
1.nfs-client:
也就是我们接下来演示的这一类,它通过K8S的内置的NFS驱动挂载远端的NFS服务器到本地目录;然后将自身作为storage provider,关联storage class。当用户创建对应的PVC来申请PV时,该provider就将PVC的要求与自身的属性比较,一旦满足就在本地挂载好的NFS目录中创建PV所属的子目录,为Pod提供动态的存储服务。
2.nfs:
与nfs-client不同,该驱动并不使用k8s的NFS驱动来挂载远端的NFS到本地再分配,而是直接将本地文件映射到容器内部,然后在容器内使用ganesha.nfsd来对外提供NFS服务;在每次创建PV的时候,直接在本地的NFS根目录中创建对应文件夹,并export出该子目录。
利用NFS动态提供Kubernetes后端存储卷
本文将介绍使用nfs-client-provisioner这个应用,利用NFS Server给Kubernetes作为持久存储的后端,并且动态提供PV。前提条件是有已经安装好的NFS服务器,并且NFS服务器与Kubernetes的Slave节点都能网络连通。将nfs-client驱动做一个deployment部署到K8S集群中,然后对外提供存储服务。
nfs-client-provisioner 是一个Kubernetes的简易NFS的外部provisioner,本身不提供NFS,需要现有的NFS服务器提供存储

1、部署provisioner

下载yaml文件,github地址

下载,class.yaml,rbac.yaml,deployment.yaml三个文件
在这里插入图片描述
修改deployment.yaml文件
在这里插入图片描述
将箭头所指的nfs服务器ip以及nfs共享目录更改为自己的
然后保存

2、按顺序执行yaml文件创建

1、rbac.yaml

sudo kubectl apply -f rbac.yaml

2、deployment.yaml

sudo kubectl apply -f deployment.yaml

3、class.yaml

sudo kubectl apply -f class.yaml

3、time out问题解决

上述三个yaml文件执行完毕后,查看pod运行是否正常

sudo kubectl get pod

在这里插入图片描述

这里看到Pod的状态是正常的,查看日志

sudo kubectl logs nfs-client-provisioner-68d858cf98-kxl4h

在这里插入图片描述
如果日志如图所示,那么nfs-client则启动正常,可以跳过这段,如果日志打印的是

F0324 09:57:58.478881       1 provisioner.go:180] Error getting server version: Get https://10.96.0.1:443/version?timeout=32s: dial tcp 10.96.0.1:443: i/o timeout

在这里插入图片描述
则nfs-client启动失败了

1、问题排查

10.96.0.1实际上,是kubenetes-api-server的ip
在这里插入图片描述
先查看他的endpoints是否正常
在这里插入图片描述
对应的是k8s主机的api地址,没有问题

再查看Pod是否能访问到除主机以外的网络,例如百度,进入任意一个Pod(nfs-client不行,它的基础镜像不是Centos或者Ubuntu)
在这里插入图片描述
正常应该是这样,如果不能访问百度
问题的原因在于部署集群时使用的网络插件flannel配置不正确,导致node的iptables设置错误。
可以参考这个文章解决:https://www.cnblogs.com/wswind/p/14808756.html
我在参考文章解决了Pod不能访问网络的问题后,nfs-client还是一样的报错

2、最终解决

我这边的原因是因为之前安装k8s时,修改了pod的ip端,导致最终两个ip端对不上,访问不了kubernetes这个svc,所以我重新进行了k8s的安装

k8s master节点重装及工作节点重新加入
1、 master节点执行如下命令

kubeadm reset;
rm -rf $HOME/.kube/config && rm -rf /etc/cni/net.d;

安装k8s

kubeadm init \
--apiserver-advertise-address=192.168.31.200 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

保存安装k8s后打印的提示信息中的join命令
kubeadm join 192.168.31.200:6443 --token jmjbt4.n5iu7wr6htnr31hk
–discovery-token-ca-cert-hash sha256:905b2f1f9a125a656ab51d93236dad92c5ca72d0b2e770709c900eedc9064d53

kubectl工具所需配置

mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装cliaco
cliaco官方文档,点击跳转
下载yaml

curl https://projectcalico.docs.tigera.io/manifests/canal.yaml -O

建议直接点击这个连接,https://projectcalico.docs.tigera.io/manifests/canal.yaml
然后ctrl + s保存,再上传到服务器

kubectl apply -f canal.yaml

2、 node节点执行命令

kubeadm reset;
rm -rf $HOME/.kube/config && rm -rf /etc/cni/net.d;
kubeadm join 192.168.31.200:6443 --token jmjbt4.n5iu7wr6htnr31hk
–discovery-token-ca-cert-hash sha256:905b2f1f9a125a656ab51d93236dad92c5ca72d0b2e770709c900eedc9064d53

sudo kubectl delete -f rbac.yaml
sudo kubectl delete -f deployment.yaml
sudo kubectl delete -f class.yaml

再重新执行安装命令,最好查看nfs-client日志
在这里插入图片描述
已正常

3、创建nfs-pvc测试nfs-client是否安装成功

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

在这里插入图片描述
可以看到pvc已经是Bound状态

文章写的可能有点乱,我也是一路踩坑过来的

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐