Kubernetes中的目录挂载
- 挂载简介
原来在 Docker 中,我们要挂载目录(也叫容器卷挂载),都是将每个容器要挂载的目录,映射到该容器所在宿主机指定的目录,从而完成挂载。但这种方式存在一个问题,那就是,如果宿主机坏掉,然后我们重新在另外的机器上新建容器对外继续提供服务,那之前的数据,此时就没法访问了。
在 k8s 中,为了解决这个问题,引入了存储层的概念,这个存储层的存储空间,所有结点共享,也叫做分布式存储。一个结点挂掉,它上面的 Pod 进行故障转移后,依旧能继续从共享的存储空间中,访问之前的数据。
node1、node2、node3 3个结点,每个都用50G空间,用以存储
3个结点之间的存储内容是互相同步的
3个结点的存储空间,共同构成一个存储层,整个集群挂载的内容,分布式存储在各个结点上,即使挂了某个结点,也不会有太大的影响
专业的存储层框架或者系统有 Glusterfs、NFS、CephFS等,下面以NFS(网络文件系统)为例,应用到 k8s 中,实现分布式挂载。
2. 搭建存储的环境
2.1 安装NFS
假设当前有3台机器,就记为node1、node2、node3,在所有的机器上,都执行下面的命令,安装NFS
yum install -y nfs-utils
2.2 设置存储的主节点
这里,将 node1 作为主结点(master),另外两个作为从结点(worker)。
在 node1 的机器上,执行以下命令,设置 NFS 的主节点
创建文件夹目录
mkdir -p /nfs/data
设置nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
启动绑定
systemctl enable rpcbind --now
启动nfs服务器
systemctl enable nfs-server --now
检查nfs配置是否生效
exportfs -r
2.3 设置从节点
在 node2、node3 的机器上,都执行以下命令
查看主节点上的挂载目录
showmount -e 主节点的ip
创建本机的挂载目录
mkdir -p /bak/data
挂载nfs服务器上的共享目录到本机路径/bak/data,这里假设主节点的ip是172.31.0.4
mount -t nfs 172.31.0.4:/nfs/data /bak/data
写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
在每个从结点上,查看各自挂载目录下的test.txt文件
cd /bak/data
2.4 测试原生方式数据挂载
(1)先写一个 yaml 文件,如 deploy.yaml ,内容如下
点击查看代码
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv-demo
name: nginx-pv-demo
spec:
replicas: 2 # 2个副本
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts: # Pod的数据卷挂载
- name: html # Pod的数据卷挂载到外面的名称
mountPath: /usr/share/nginx/html # Pod的内部要挂载出去的目录
volumes: # 映射Pod对外的挂载
- name: html # Pod要挂载的名称指代,即指向volumeMounts的name
nfs: # 采用nfs挂载
server: 172.31.0.4 # Pod要挂载的宿主机ip
path: /nfs/data/nginx-pv # Pod挂载到外部宿主机上的目录
(2)应用一下上面的文件,创建 Pod
kubectl apply -f deploy.yaml
(3)分别进到宿主机的挂载目录、 Pod 内部要挂载出去的目录,查看二者的文件内容是否一致。修改一方的文件内容,另一方是否也同步修改,验证挂载结果。
- PV&PVC
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格大小
3.1 创建PV池
(1)在 NFS 的主节点上,分别创建以下三个目录
nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
(2)新建一个 yaml 文件,如 pv.yaml,内容如下
点击查看代码
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 # nfs主结点服务器ip
---
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
(3)应用上面的 pv.yaml 文件
kubectl apply -f pv.yaml
(4)查看创建的 PV 结果
kubectl get PersistentVolume
3.2 PVC的创建与绑定
3.2.1 创建PVC
(1)写一个 pvc.yaml 文件,内容如下
点击查看代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi # 需要200M大小
storageClassName: nfs # 存储类型名称,要与前面定的一致
(2)应用以下
kubectl apply -f pvc.yaml
(3)查看结果
kubectl get pvc
3.2.2 创建 Pod 并绑定 PVC
在 3.2.1 中,我们已经创建好了PVC,在此基础之上,我们可以在创建 Pod 的同时绑定已有的PVC。
(1)写一个 deploye-pvc.yaml 文件,内容如下
点击查看代码
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: # pvc声明
claimName: nginx-pvc # 已有的pvc名称
(2)应用一下
kubectl apply -f deploye-pvc.yaml
(3)查看结果
kubectl get pvc