k8s共享存储之nfs
更新:HHH   时间:2023-1-7


特别说明:测试使用,不建议生产环境

1、在master节点配置(node1)

1)yum安装nfs

# yum -y install nfs-utils

NFS的关键工具包括:

主要配置文件:/etc/exports;

NFS文件系统维护命令:/usr/bin/exportfs;

共享资源的日志文件: /var/lib/nfs/*tab;

客户端查询共享资源命令: /usr/sbin/showmount;

端口配置: /etc/sysconfig/nfs。

2)新建共享目录

# mkdir -p /data/volunes

3)设置Nfs权限

# cat /etc/exports

权限参数说明:

ro  只读访问

rw  读写访问

sync    所有数据在请求时写入共享

async   nfs在写入数据前可以响应请求

secure  nfs通过1024以下的安全TCP/IP端口发送

insecure    nfs通过1024以上的端口发送

wdelay  如果多个用户要写入nfs目录,则归组写入(默认)

no_wdelay   如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置

hide    在nfs共享目录中不共享其子目录

no_hide 共享nfs目录的子目录

subtree_check   如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)

no_subtree_check    不检查父目录权限

all_squash  共享文件的UID和GID映射匿名用户anonymous,适合公用目录

no_all_squash   保留共享文件的UID和GID(默认)

root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)

no_root_squash  root用户具有根目录的完全管理访问权限(不安全)

anonuid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的UID

anongid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的GID

4)启动服务

# systemctl enable nfs.service

# systemctl start nfs.service

# exportfs  -arv #不用重启nfs服务,配置文件就会生效

2、在节点node2和node3配置Nfs

1)安装

yum -y install nfs-utils

2)在node3和node2上挂载:

# mount -t nfs 172.160.45.160:/data/volunes/ /mnt

3、检查

1)#查看 RPC 服务的注册状况

rpcinfo -p localhost

2)#showmount测试

showmount -e 172.160.45.160

4、kubernetes使用NFS共享存储有两种方式:

#手动方式静态创建所需要的PV和PVC;

#通过创建PVC动态地创建对应PV,无需手动创建PV;

################静态创建#######################

1)静态申请PV卷

PersistentVolumes,是k8s抽象化的存储资源,主要包括存储能力、访问模式、存储类型、回收策略等关键信息.PV是k8s实际对接存储后端的真正入口;

#创建pv对应目录

# mkdir -p /data/volunes/v{1,2,3}

#配置exportrs

# cat /etc/exports

#立即生效

# exportfs  -arv


2)创建pv文件

# vim nfs-pv1.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

name: nfs-pv1

labels:

pv: nfs-pv1

spec:

capacity:

storage: 1Gi

accessModes:

- ReadWriteMany

persistentVolumeReclaimPolicy: Recycle

storageClassName: nfs

nfs:

path: /data/volunes/v1

server: 172.160.45.160

nfs-pv2.yaml类似


配置说明:

① capacity 指定 PV 的容量为 1G。

② accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:

ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载;

ReadOnlyMany(ROX):只读权限,可以被多个节点挂载;

ReadWriteMany(RWX):读写权限,可以被多个节点挂载;

③ persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:

Retain(保留)- 保留数据,不会再分配给pvc,需要管理员手工清理数据;

Recycle(回收)- 清除 PV 中的数据,保留pv资源,可以留供其他pvc使用;

Delete(删除)- 删除整个pv资源及内部的数据;

④ storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。

⑤ 指定 PV 在 NFS 服务器上对应的目录。

#创建pv的pod

# kubectl create-f nfs-pv1.yaml

# kubectl get pv

状态Available,表示 pv就绪,可以被 PVC 申请;

3)创建PVC

PersistentVolumeClaims,是对PV资源的一种声明,pvc绑定实体资源pv后,pod通过绑定pvc来使用pv资源.PVC是k8s的一种抽象化的声明式绑定存储资源的管理模式的中间层,pod无法直接通过pv使用存储资源,必须经过pvc,而pvc必须要绑定pv实体后,才可被pod使用;

# vim nfs-pvc2.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: nfs-pvc2

spec:

accessModes:

- eadWriteMany

resources:

requests:

storage: 1Gi

storageClassName: nfs

selector:

matchLabels:

pv: nfs-pv2

执行yaml文件创建 pvc

# kubectl create -f nfs-pvc1.yaml

查看pv资源

备注:pv对应绑定的PVC

4)创建pod

[root@node1 yaml]# vim nfs-nginx.yaml

apiVersion: v1

kind: ReplicationController

metadata:

name: nginx-test

labels:

name: nignx-test

spec:

replicas: 3

selector:

name: nginx-test

template:

metadata:

labels:

name: nginx-test

spec:

containers:

- name: web01

image: docker.io/nginx:1.14.2

volumeMounts:

- mountPath: "/usr/share/nginx/html/"

name: nfs-pv1

- mountPath: "/var/log/nginx/"

name: nfs-pv2

ports:

- containerPort: 80

volumes:

- name: nfs-pv1

persistentVolumeClaim:

claimName: nfs-pvc1

- name: nfs-pv2

persistentVolumeClaim:

claimName: nfs-pvc2

备注:

# nfs-pv1存储网页文件,nfs-pv2日志文件


#执行文件

# kubectl create -f nfs-nginx.yaml

# kubectl get pods -o wide

#创建nfs-nginx-server文件

# cat nfs-nginx-svc.yaml

apiVersion: v1

kind: Service

metadata:

name: nginx-test

labels:

name: nginx-test

spec:

type: NodePort

ports:

- port: 80

protocol: TCP

targetPort: 80

name: http

nodePort: 30088

selector:

name: nginx-test

#执行文件

# kubectl create -f nfs-nginx-svc.yaml

# kubectl get svc

5)验证 PV 是否可用

测试页面:

#内部

#外网


备注说明: nfs自身没有冗余能力,数据盘损坏易丢失数据;建议使用:glusterfs或cephfs分布式存储;


返回云计算教程...