K8s不同node如何共享存储&&nfs 搭建(markdown版本)

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加强协议
在这里插入图片描述

写入一个测试文件

K8s不同node如何共享存储&&nfs 搭建(markdown版本)_第1张图片
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 搭建

你可能感兴趣的:(#,k8s,大数据存储,kubernetes,docker,运维)