14-k8s-基本存储之EmptyDir、HostPath、NFS

2023-10-17 04:12

本文主要是介绍14-k8s-基本存储之EmptyDir、HostPath、NFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、相关概念
    • 二、EmptyDir存储
    • 三、HostPath存储
    • 四、NFS存储

一、相关概念

  1. 概述

    Volumn定义在Pod上,然后被该Pod里面的多个容器挂载到具体的文件目录下。实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命周期不和Pod中的单个容器的生命周期有关。Volume的生命周期和Pod的生命周期关系需要根据储存类型来定

  2. kubernetes支持的常见Volume类型

    基本存储:EmptyDir、HostPath、NFS
    高级存储:PV、PVC
    配置存储:ConfigMap、Secret

二、EmptyDir存储

  1. 概述

    EmptyDir在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时,EmptyDir中的数据也会被永久删除,所以也被称为临时存储。

  2. 实操逻辑

    1. 先声明一个EmptyDir储存类型的volume
    2. 在一个Pod中准备两个容器nginx和busybox
    3. 将volume分别挂载到两个容器的目录中
    4. 然后nginx容器负责向volume中写日志,busybox中通过命令从volume读取日志文件内容到控制台
    
  3. 编写yml文件:vi /opt/volume-emptydir.yaml

    apiVersion: v1
    kind: Pod
    metadata:name: volume-emptydir
    spec:containers:- name: nginximage: nginx:latestports:- name: nginx-portcontainerPort: 80protocol: TCPvolumeMounts:    # 将logs-volume挂载到nginx容器的/var/log/nginx目录, nginx会将用户的访问日志写入到该目录的access.log文件中- name: logs-volumemountPath: /var/log/nginx- name: busyboximage: busybox:latestcommand: ["/bin/sh", "-c", "tail -f /logs/access.log"] volumeMounts:    # 将logs-volume挂载到busybox容器中的/logs目录- name: logs-volumemountPath: /logsvolumes:    # 声明volume- name: logs-volumeemptyDir: {}
    
  4. 运行:kubectl apply -f /opt/volume-emptydir.yaml

  5. 查看是否启动:kubectl get pod -o wide
    在这里插入图片描述

  6. 测试访问,生成日志: curl 192.169.189.78

  7. 查看日志(-c是指定容器):kubectl logs volume-emptydir -c busybox -f
    在这里插入图片描述

三、HostPath存储

  1. 概述

    HostPath就是将Node主机中的一个实际目录挂载到Pod中,以供容器使用。即使Pod销毁,数据依旧可以保存在Node主机上,也被称为本地存储。

  2. 实操逻辑

    1. 先声明一个HostPath储存类型的volume,数据储存在Node主机的目录中
    2. 在一个Pod中准备两个容器nginx和busybox
    3. 将volume分别挂载到两个容器的目录中
    4. 然后nginx容器负责向volume中写日志,busybox中通过命令从volume读取日志文件内容到控制台
    
  3. 编写yml文件:vi /opt/volume-hostpath.yaml

    apiVersion: v1
    kind: Pod
    metadata:name: volume-hostpath
    spec:containers:- name: nginximage: nginx:latestports:- name: nginx-portcontainerPort: 80protocol: TCPvolumeMounts:    # 将logs-volume挂载到nginx容器的/var/log/nginx目录, nginx会将用户的访问日志写入到该目录的access.log文件中- name: logs-volumemountPath: /var/log/nginx- name: busyboximage: busybox:latestcommand: ["/bin/sh", "-c", "tail -f /logs/access.log"] volumeMounts:    # 将logs-volume挂载到busybox容器中的/logs目录- name: logs-volumemountPath: /logsvolumes:    # 声明volume- name: logs-volumehostPath:path: /root/logstype: DirectoryOrCreate
    

    ps:type类型解析

    DirectoryOrCreate:目录存在就使用,不存在就先创建
    Directory:目录必须存在
    FileOrCreate:文件存在就使用,不存在就先创建
    File:文件必须存在
    Socket:unix socket必须存在
    CharDevice:字符设备必须存在
    BlockDevice:块设备必须存在
    
  4. 启动pod:kubectl apply -f /opt/volume-hostpath.yaml

  5. 查看pod:kubectl get pod volume-hostpath -o wide
    在这里插入图片描述

  6. 访问nginx:curl 192.169.235.141

  7. 查看日志(-c是指定容器):kubectl logs volume-hostpath -c busybox -f
    在这里插入图片描述

  8. 查看节点: kubectl describe pod volume-hostpath
    在这里插入图片描述

  9. 该pod在节点11,则查看日志:ls /root/logs
    在这里插入图片描述

四、NFS存储

  1. 概述

    HostPath虽然可以解决数据持久化问题,但是一旦Node节点故障了,Pod如果转移到别的Node节点上,又会出现问题。此时需要准备单独的网络存储系统。比较常用的是NFS和CIFS

    NFS是一个网络文件存储系统,可以搭建NFS服务器,然后将Pod中的存储直接连接到NFS系统上。无论Pod在节点上怎么转移,只要Node和NFS的对接没有问题,数据就可以成功访问。

  2. 搭建NFS服务器(所有的k8s服务器)

    ps1:生产环境可以使用nfs + keepalived做高可用防止单点故障,rsync + inotify实现主备间共享数据同步

    这里测试环境只搭建一台NFS服务器

    ​ 1)安装NFS服务(客户端只需安装NFS服务即可,用于客户端驱动NFS设备):yum install -y nfs-utils

    ​ 2)准备共享目录:mkdir -p /root/data/nfs

    ​ 3)将共享目录以读写权限暴露给192.168.248.0/24网段中的所有主机:vi /etc/exports

    ​ 添加 /root/data/nfs 192.168.248.0/24(rw,no_root_squash)

    ​ ps1:原来/etc/exports是空的

    ​ ps2:其中no_root_squash表示:NFS客户端连接服务端时如果使用的是root的话,那么对服务端共享目录也拥有root权限

    ​ 5)启动NFS服务:systemctl start nfs --》 systemctl enable nfs

    ​ 6)查看:exportfs -v
    在这里插入图片描述

    ​ 7)如果其他台也装nfs,可以将dnf服务器的存储路径挂载出去,共享挂载路径(可忽略):mount -t nfs 192.168.248.11:/root/data/nfs /root/data/nfs

  3. 实操逻辑

    1. 先声明一个NFS储存类型的volume,数据储存在远程主机的目录中
    2. 在一个Pod中准备两个容器nginx和busybox
    3. 将volume分别挂载到两个容器的目录中
    4. 然后nginx容器负责向volume中写日志,busybox中通过命令从volume读取日志文件内容到控制台
    
  4. 编写脚本:vi /opt/volume-nfs.yaml

    apiVersion: v1
    kind: Pod
    metadata:name: volume-nfs
    spec:containers:- name: nginximage: nginx:latestports:- name: nginx-portcontainerPort: 80protocol: TCPvolumeMounts:    # 将logs-volume挂载到nginx容器的/var/log/nginx目录, nginx会将用户的访问日志写入到该目录的access.log文件中- name: logs-volumemountPath: /var/log/nginx- name: busyboximage: busybox:latestcommand: ["/bin/sh", "-c", "tail -f /logs/access.log"] volumeMounts:    # 将logs-volume挂载到busybox容器中的/logs目录- name: logs-volume mountPath: /logsvolumes:    # 声明volume- name: logs-volumenfs:server: 192.168.248.10    # NFS服务器地址path: /root/data/nfs     # NFS服务器的共享目录readOnly: false    # 是否只读
    
  5. 启动:kubectl apply -f /opt/volume-nfs.yaml

  6. 查看pod:kubectl get pod volume-nfs -o wide
    在这里插入图片描述

  7. 访问Pod中的Nginx:curl 192.169.189.68

  8. 查看日志(-c是指定容器):kubectl logs volume-nfs -c busybox -f

  9. 查看文件:ls /root/data/nfs
    在这里插入图片描述

这篇关于14-k8s-基本存储之EmptyDir、HostPath、NFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/222862

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁