k8s如何共享存储
同一个pod内不同container可以使用共同挂载一个volume来共享数据,但是不同node跨服务器如何共享数据呢?
nfs是一种成熟的共享存储方案. 例如我们生产环境中的nas.
ceph是一种(分布式共享存储)
什么是分布式共享存储呢?
pod中产生了数据,数据通过存储插件(通常是一个容器)将数据写入远程的分布式存储系统ceph,当pod迁移或是升级K8s集群 ,即无论你在其他哪个宿主机上启动新的容器,都可以请求挂载指定的持久化存储卷,从而访问到数据卷里保存的内容。
NFS可以实现部分功能,对于动态扩容nfs-provision目前不支持
NFS provisioner limitations/pitfalls
- The provisioned storage is not guaranteed. You may allocate more than the NFS share’s total size. The share may also not have enough storage space left to actually accommodate the request.
- The provisioned storage limit is not enforced. The application can expand to use all the available storage regardless of the provisioned size.
- Storage resize/expansion operations are not presently supported in any form. You will end up in an error state: Ignoring the PVC: didn’t find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
ceph功能就比较丰富了,还提供 对象存储和块存储。
环境准备
服务端安装NFS服务步骤
第一步:安装NFS和rpc。
[root@localhost ~]# yum install -y nfs-utils #安装nfs服务 [root@localhost ~]# yum install -y rpcbind #安装rpc服务
第二步:启动服务和设置开启启动:
systemctl enable rpcbind --now #--now 设置开机启动 systemctl enable nfs-server --now #配置生效 exportfs -r
第三步:配置共享文件目录,编辑配置文件/etc/exports:
# 创建共享节点 mkdir -p /monitor/data #编辑配置文件 echo "/monitor/data *(insecure,rw,sync,no_root_squash)" > /etc/exports # 指定cidr范围的主机可访问 # echo "/monitor/data 10.50.0.0/16(insecure,rw,sync,no_root_squash)" > /etc/exports systemctl reload nfs #重新加载NFS服务,使配置文件生效
用于配置NFS服务程序配置文件的参数:
格式: 共享目录的路径 允许访问的NFS客户端(共享权限参数) 参数: - ro 只读 - rw 读写 - root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 - no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员 - all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 - sync 同时将数据写入到内存与硬盘中,保证不丢失数据 - async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 请注意,NFS客户端地址与权限之间没有空格
NFS客户端挂载配置
第一步
使用showmount命令查看nfs服务器共享信息。输出格式为“共享的目录名称 允许使用客户端地址”。
[root@meta /www/pigsty]#showmount -e 10.50.10.179 Export list for 10.50.10.179: /monitor/data 10.50.0.0/16 /k8s-sc2-xfs/data 10.50.0.0/16
showmount 用法
参数 作用 -e 显示NFS服务器的共享列表 -a 显示本机挂载的文件资源的情况NFS资源的情况 -v 显示版本号
第二步,在客户端创建目录,并挂载共享目录。
mkdir -p /nfs/data/prometheus # 挂载 [root@meta /www/pigsty]#mount 10.50.10.179:/monitor/data/ /nfs/data/prometheus/ [root@meta /www/pigsty]#df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 32G 0 32G 0% /dev tmpfs tmpfs 32G 180K 32G 1% /dev/shm tmpfs tmpfs 32G 17M 32G 1% /run tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/sda1 xfs 40G 30G 11G 74% / /dev/sdb1 xfs 50G 5.8G 45G 12% /prometheus tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/0 10.50.10.179:/monitor/data nfs4 2.0T 32G 2.0T 2% /nfs/data/prometheus
修改fstab使系统每次启动时都能自动挂载
这种挂载文件系统的方法只能临时挂载文件系统。当重启Linux系统时,文件系统并不会自动挂载。要强制Linux在启动时自动挂载新的文件系统,可以将其添加到/etc/fstab文件。
# 使系统每次启动时都能自动挂载 ]#more /etc/fstab # # /etc/fstab # Created by anaconda on Thu Apr 30 22:04:55 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=1c419d6c-5064-4a2b-953c-05b2c67edb15 / xfs defaults 0 0 /dev/sdb1 /prometheus xfs defaults 0 0 /swapfile none swap defaults 0 0 10.50.10.179:/monitor/data /nfs/data/prometheus nfs defaults 0 0
nfs4加强协议
写入一个测试文件
libvirt是个啥?
原生方式数据挂载
原生方式挂载数据对外暴露太多了,需要用户了解我们整个nfs的架构,对开发人员不友好,而且关键是不安全。 整个存储应该同一管理,并分配给应用。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv-demo
name: nginx-pv-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
server: 172.31.0.4
path: /nfs/data/nginx-pv
1、PV&PVC
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
下面这些yaml文件中的字段不懂可以使用explain 一个一个解释。
静态供应
1、创建pv池
#nfs主节点 mkdir -p /nfs/data/01 mkdir -p /nfs/data/02 mkdir -p /nfs/data/03 创建PV apiVersion: v1 kind: PersistentVolume metadata: name: pv01-10m spec: capacity: storage: 10M accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/01 server: 172.31.0.4 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv02-1gi spec: capacity: storage: 1Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/02 server: 172.31.0.4 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv03-3gi spec: capacity: storage: 3Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/03 server: 172.31.0.4
2、PVC创建与绑定
创建PVC kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nginx-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 200Mi storageClassName: nfs 创建Pod绑定PVC apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy-pvc name: nginx-deploy-pvc spec: replicas: 2 selector: matchLabels: app: nginx-deploy-pvc template: metadata: labels: app: nginx-deploy-pvc spec: containers: - image: nginx name: nginx volumeMounts: - name: html mountPath: /usr/share/nginx/html volumes: - name: html persistentVolumeClaim: claimName: nginx-pvc
动态供应
参考
[1] nfs 搭建