Kubernetes中的目录挂载

  1. 挂载简介
    原来在 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 内部要挂载出去的目录,查看二者的文件内容是否一致。修改一方的文件内容,另一方是否也同步修改,验证挂载结果。

  1. 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

posted @ 2022-06-29 16:59  seaskyccl  阅读(476)  评论(0编辑  收藏  举报