06-Kubernetes中的目录挂载

目 录

1. 挂载简介

原来在 Docker 中,我们要挂载目录(也叫容器卷挂载),都是将每个容器要挂载的目录,映射到该容器所在宿主机指定的目录,从而完成挂载。但这种方式存在一个问题,那就是,如果宿主机坏掉,然后我们重新在另外的机器上新建容器对外继续提供服务,那之前的数据,此时就没法访问了。

在 k8s 中,为了解决这个问题,引入了存储层的概念,这个存储层的存储空间,所有结点共享,也叫做分布式存储。一个结点挂掉,它上面的 Pod 进行故障转移后,依旧能继续从共享的存储空间中,访问之前的数据。

存储层的示例图大致如下:

  • node1、node2、node3 3个结点,每个都用50G空间,用以存储
  • 3个结点之间的存储内容是互相同步的
  • 3个结点的存储空间,共同构成一个存储层,整个集群挂载的内容,分布式存储在各个结点上,即使挂了某个结点,也不会有太大的影响
    《06-Kubernetes中的目录挂载》
    专业的存储层框架或者系统有 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 内部要挂载出去的目录,查看二者的文件内容是否一致。修改一方的文件内容,另一方是否也同步修改,验证挂载结果。

3. PV&PVC

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置

PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格大小

PV&PVC的示意图如下:

《06-Kubernetes中的目录挂载》

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
    原文作者:yuhuofei2021
    原文地址: https://blog.csdn.net/Crezfikbd/article/details/124569094
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞