iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >k8s数据存储之Volume如何使用
  • 482
分享到

k8s数据存储之Volume如何使用

2023-07-05 11:07:26 482人浏览 薄情痞子
摘要

这篇文章主要讲解了“k8s数据存储之Volume如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“k8s数据存储之Volume如何使用”吧!一、什么是Volume通过之前学习了解到,k8

这篇文章主要讲解了“k8s数据存储之Volume如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“k8s数据存储之Volume如何使用”吧!

一、什么是Volume

通过之前学习了解到,k8s中Pod是最小的运行单元,Pod中运行的是一个个容器,但是容器的生命周期可能很短,被频繁地创建和销毁。

在学习Docker的时候,创建一个容器,如果没有指定容器的数据卷,容器中的文件在磁盘上通常是临时存放的,这就给容器中运行的重要应用程序带来了一些问题 ,比如像下面的场景:

  • 当容器崩溃时文件丢失,kubelet 会重新启动容器,但容器会以干净的状态重启,之前保存在容器中的数据也会被清除 ;

  • 当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件 ;

基于这些问题,k8s中就出现了“卷”这个组件来解决

kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题,卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录

二、k8s中的Volume

关于k8s中卷的总结

  • Volume是k8s抽象出来的对象,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下 ;

  • kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储 ;

  • Volume的生命周期不与Pod中单个容器的生命周期相关,当容器终止或者重启时,Volume中的数据也不会丢失;

  • K8S可以支持许多类型的卷,Pod 也能同时使用任意数量的卷;

三、k8s中常见的Volume类型

k8s中提供了很多种类型的Volume,下面列举一些常用的类型:

  • 常规存储:EmptyDir、HostPath ;

  • 高级存储:PV、PVC ;

  • 配置存储:ConfigMap、Secret ;

  • 其他:网络存储系统 NFS、CIFS,包括云服务商提供的、本地、分布式

接下来,针对日常业务中使用较多的Volume,通过实例一一演示下各自的使用。

四、Volume 之 EmptyDir 

4.1 EmptyDir 特点

  • 当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,只要 Pod 在该节点上运行卷就一直存在 ;

  • 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除 ;

  • 容器崩溃并不会导致 Pod 被从节点上移除,所以容器崩溃时 emptyDir 卷中的数据是安全的;

使用场景:临时缓存空间,存储一些运行过程中的中继日志

4.2 EmptyDir 实现文件共享

如图所示,我们的需求是,创建一个类型为EmptyDir的Volume,实现两个容器日志的共享;

k8s数据存储之Volume如何使用

4.2.1 关于busybox
1、是⼀个集成了三百多个最常⽤ linux 命令和⼯具的软件;
2、包含了简单的⼯具,例如 ls 、 cat 和 echo 等等,还包含了⼀些更复杂的⼯具,例grep 、 find 、 telnet等;

4.3 操作步骤

下面通过案例演示下使用的步骤

4.3.1 创建配置模板文件yaml

在当前目录下创建一个volume-emptydir.yaml 的文件,配置如下内容:

apiVersion: v1kind: Podmetadata:  name: test-volume-emptydir  namespace: defaultspec:  containers:  - name: test-Nginx    image: nginx:1.20    ports:    - containerPort: 80    volumeMounts:  # 将nginx-log-volume挂在到nginx容器中,对应的目录为 /var/log/nginx    - name: test-log-volume      mountPath: /var/log/nginx   - name: test-busybox    image: busybox:1.35.0     command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器启动后初始命令,读取指定文件中内容    volumeMounts:  # 将nginx-log-volume挂在到busybox容器中,对应的目录为 /logs    - name: test-log-volume      mountPath: /usr/local/test   volumes: # 这里声明volume存储劵, name为nginx-log-volume,类型是emptyDir  - name: test-log-volume    emptyDir: {}

配置中的关键位置如下:

k8s数据存储之Volume如何使用

4.3.2 创建Pod

使用apply命令执行pod的创建,创建成功后,可以看到在test-volume-emptydir 这个pod里面运行了2个容器;

k8s数据存储之Volume如何使用

4.3.3 访问nginx使其产生访问日志

随机访问一下,使nginx中产生部分日志

k8s数据存储之Volume如何使用

4.3.4 查看容器日志

使用下面的命令查看容器产生的access.log日志

kubectl logs -f test-volume-emptydir -n default -c test-busybox

k8s数据存储之Volume如何使用

五、Volume 之 hostPath 

上面我们聊了EmptyDir的使用,相信实际操作之后的同学应该能看出来,由于EmptyDir创建的这个Volume是一个虚拟的路径,所以当其销毁后,pod中容器产生的数据也就随之销毁了,即无法真正实现数据的落盘持久化,于是我们在想,是否可以做到下面这样呢?

当然是可以的,这就是接下来要说的另一种Volume : hostPath;

k8s数据存储之Volume如何使用

5.1 hostPath 概述

  • emptyDir中数据没做持久化,随着Pod的结束而销毁,需要持久化到磁盘则选其他方式 ;

  • hostPath类型的磁盘就是挂在了主机的一个文件或者目录 ;

  • 某些应用需要用到docker的内部文件,这时只需要挂在本机的/var/lib/docker作为hostPath ;

5.2 hostPath类型

根据使用场景的不同,又可以细分成多个类型

  • Directory 给定的目录路径必须存在 ;

  • DirectoryOrCreate 如果给定路径不存在,将根据需要在那里创建一个空目录 ;

  • File 给定路径上必须存在对应文件 ;

  • FileOrCreate 如果给定路径不存在,将根据需要在那里创建一个空文件 ;

5.3 hostPath 操作演示

5.3.1 创建模板配置文件

在当前目录下创建一个名叫volume-hostpath.yaml的配置文件,内容如下:

apiVersion: v1kind: Podmetadata:  name: hostpath-volume-test  namespace: defaultspec:  containers:  - name: test-nginx    image: nginx:1.20    ports:    - containerPort: 80    volumeMounts:  # 将nginx-log-volume挂在到nginx容器中,对应的目录为 /var/log/nginx    - name: test-log-volume      mountPath: /var/log/nginx   - name: test-busybox    image: busybox:1.35.0     command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器启动后初始命令,读取指定文件中内容    volumeMounts:  # 将nginx-log-volume挂在到busybox容器中,对应的目录为 /logs    - name: test-log-volume      mountPath: /usr/local/test   volumes: # 这里声明volume存储劵, name为test-log-volume,类型是hostPath  - name: test-log-volume    hostPath:        path: /usr/local/test        type: DirectoryOrCreate #如果给定路径不存在,将根据需要在那里创建一个空目录

主要的配置和上面的emptyDir的案例中的差不多,最后的volumes类型那里改成hostPath相关的参数;

5.3.2 使用apply命令创建pod

创建成功后,可以看到产生了一个hostpath开头的一个Pod,里面包含两个容器;

k8s数据存储之Volume如何使用

5.3.3 访问nginx使其产生访问日志

k8s数据存储之Volume如何使用

5.3.4 查看容器输出日志

这这里注意使用你自己定义的那个名称

kubectl logs -f hostpath-volume-test -n default -c test-busybox

k8s数据存储之Volume如何使用

5.3.5 查看挂载目录日志文件

工作节点查看对应的挂载目录的日志文件,登录工作节点的服务器,可以看到对应的nginx日志文件也在里面了;

k8s数据存储之Volume如何使用

5.3.6 删除当前的pod

k8s数据存储之Volume如何使用

删除pod之后发现工作节点目录下的日志文件依然存在

k8s数据存储之Volume如何使用

5.4 emptyDir和hostPath的对比

通过上面的演示,最后来对比一下emptyDir和hostPath使用上的异同点:

  • 两者都是本地存储卷方式 ;

  • emptyDir是临时存储空间,完全不提供持久化支持;

  • hostPath的卷数据是持久化在node节点的文件系统中的,即便pod已经被删除了,volume卷中的数据还留存在node节点上;

六、Volume 之 ConfigMap 

6.1 ConfigMap需求场景

很多应用在其初始化或运行期间要依赖一些配置信息 ,并且在大多数时候, 存在要调整配置参数所设置的数值的需求,而ConfigMap是Kubernetes 用来向应用 Pod 中注入配置数据的一种方法 ;

6.2 ConfigMap简介

  • 是K8S的一种API对象,用来把【非加密数据】保存到键值对中,比如etcd ;

  • 可以用作环境变量、命令行参数等,将环境变量、配置信息和容器镜像解耦,便于应用配置的修改 ;

使用方式

kubectl create configmap 命令,基于目录、 文件或者键值对来创建 ConfigMap

如下示例:

kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2

6.3 ConfigMap 创建操作演示

6.3.1 使用命令行创建

使用下面的命令进行ConfigMap的创建

kubectl create configmap test-config --from-literal=account=test --from-literal=passWord=123456

k8s数据存储之Volume如何使用

6.3.2 查看创建的configmap
kubectl get configmap test-config -o yaml

k8s数据存储之Volume如何使用

6.3.3 使用yaml配置文件创建

在当前目录下创建一个 test-configmap.yaml的文件,核心配置内容如下:

apiVersion: v1kind: ConfigMapmetadata:  name: congge-configmap  namespace: defaultdata:  info:     username:congge    password:123456

使用apply命令执行创建

k8s数据存储之Volume如何使用

6.3.4 查看configmap详情
kubectl describe cm congge-configmap -n default

k8s数据存储之Volume如何使用

6.4 ConfigMap 使用操作演示

上面演示了两种创建configmap的方式,configmap创建出来后怎么使用呢?简单来说,只需要开启一个pod,将这个configmap挂载进去使用即可;

6.4.1 使用配置文件创建pod

注意,里面的Volume使用上文yaml中创建的那个configmap的名字:

apiVersion: v1kind: Podmetadata:  name: pod-configmap  namespace: defaultspec:  containers:  - name: nginx    image: nginx:1.20    volumeMounts: # configmap挂载的目录    - name: config      mountPath: /config   volumes: # 声明configmap  - name: config    configMap:      name: congge-configmap

执行apply命令进行创建,然后检查下是否创建成功;

k8s数据存储之Volume如何使用

6.4.2 验证configmap中配置的值

进入pod容器

kubectl exec -it pod-configmap -n default -- /bin/sh

k8s数据存储之Volume如何使用

进入配置文件中的挂载目录 /config,查看配置信息

k8s数据存储之Volume如何使用

七、Volume 之 Secret 

有些配置需要加密存储,ConfigMap只能使用明文保存,因此ConfigMap就不适合了;

7.1 Secret 简介

Secret 作用

  • 用来保存敏感信息,例如密码、秘钥、证书、OAuth 令牌和 ssh key等 ;

  • 就不需要把这些敏感数据暴露到镜像或者Pod中 ;

不管是哪种Volume,最终都是为Pod服务的,对于Pod来说,可以用三种方式之一来使用 Secret:

作为挂载到一个或多个容器上的卷 中的文件 ;作为容器的环境变量 ;由 kubelet 在为 Pod 拉取镜像时使用 ;

7.2 secret 常见类型

下面列举secret中常用的几种类型

7.2.1 dockerconfigJSON

用来存储私有 docker reGIStry的认证信息

7.2.2 Service Account

只要与Kubernetes API有交互的Pod,都会自动拥有此种类型的Secret;

K8S自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中;

2.3 Opaque

加密类型为base64,其特点就是将明文改为了密文

7.3 Secret  

Opaque使用

下面以Secret中Opaque这种类型进行说明,首先用一个字符串做下测试,简单来说,就是将字符串进行base64编码,得到一串类似于密文的字符串;

k8s数据存储之Volume如何使用

7.3.1 创建模板配置文件

在当前目录下创建一个secret.yaml的配置文件,内容如下,其中,username和password用的就是上面测试中看到的:

apiVersion: v1kind: Secretmetadata:  name: my-secrettype: Opaquedata:  username: YWRtaW4=  password: MTIzNDU2
7.3.2 使用apply命令创建secret

创建成功后,可以顺便使用get查看下创建的secret;

k8s数据存储之Volume如何使用

7.3.3 查看my-secret详细信息

使用下面的命令进行查看

kubectl get secret my-secret -o yaml

k8s数据存储之Volume如何使用

7.3.4 创建pod

创建一个新的pod并使用上面这个secret,在当前目录下,创建一个名叫pod-secret-volume.yaml的配置文件,内容如下:

apiVersion: v1kind: Podmetadata:  name: pod-secretspec:  containers:  - name: nginx    image: nginx:1.20    volumeMounts: # secret挂载    - name: congge-config      mountPath: /etc/secret  volumes:  - name: congge-config    secret:      secretName: my-secret

使用apply命令执行并创建pod

k8s数据存储之Volume如何使用

7.3.5 查看secret信息

在pod中的secret信息实际已经被解密,使用下面的命令进入到pod

kubectl exec -it pod-secret -- /bin/sh

查看指定目录下secret中配置的username和password,可以看到,在pod中,加密的信息已被解密了;

k8s数据存储之Volume如何使用

感谢各位的阅读,以上就是“k8s数据存储之Volume如何使用”的内容了,经过本文的学习后,相信大家对k8s数据存储之Volume如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: k8s数据存储之Volume如何使用

本文链接: https://www.lsjlt.com/news/351174.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • k8s数据存储之Volume如何使用
    这篇文章主要讲解了“k8s数据存储之Volume如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“k8s数据存储之Volume如何使用”吧!一、什么是Volume通过之前学习了解到,k8...
    99+
    2023-07-05
  • k8s数据存储之Volume使用示例详解
    目录一、什么是Volume二、k8s中的Volume三、k8s中常见的Volume类型四、Volume 之 EmptyDir 4.1 EmptyDir 特点4.2 Empt...
    99+
    2023-03-09
    k8s Volume使用 k8s数据存储Volume使用
  • kubernetes Volume存储卷configMap怎么使用
    这篇文章主要介绍了kubernetes Volume存储卷configMap怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇kubernetes Volume存储卷configMap怎...
    99+
    2023-06-30
  • k8s如何使用emptyDir,hostPath,nfs,pv,pvc做存储
    本篇文章为大家展示了k8s如何使用emptyDir,hostPath,nfs,pv,pvc做存储,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。存储卷三种方式:emptyDir,gitRepo,hos...
    99+
    2023-06-04
  • JavaScript如何使用localStorage存储数据
    本篇内容介绍了“JavaScript如何使用localStorage存储数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2024-04-02
  • 如何使用Set和Map存储数据
    这篇文章主要讲解了“如何使用Set和Map存储数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Set和Map存储数据”吧!许多年来,程序员们一直使...
    99+
    2024-04-02
  • 如何在PHP中使用数据存储函数
    数据存储函数在PHP中扮演着极为重要的角色。PHP中有多种数据存储函数,包括文件操作函数、数据库操作函数等等。本篇文章将重点探讨如何在PHP中使用数据存储函数。一、文件操作函数fopen()函数:打开文件并返回文件指针。语法如下:resou...
    99+
    2023-05-18
    函数 PHP 数据存储
  • 如何在Android中使用SQLite存储数据
    这篇文章给大家介绍如何在Android中使用SQLite存储数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 安装一个SQLiteDeveloper,这个用来打开android生成的数据库。软件随便搜索就能找到,后面...
    99+
    2023-05-30
    android sqlite
  • Android中的数据储存之文件存储
    当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢?就是指储存在内存中,有可能因为程序关闭或...
    99+
    2023-06-04
  • K8s中MySQL 数据持久化存储的实现
    目录一、步骤二、实践2.1 创建 PV 和 PVC2.2 部署 MySQL 服务2.3 创建测试数据2.4 模拟节点宕机2.5 数据一致性验证FAQ一、步骤 (1)创建 PV 和 P...
    99+
    2023-01-08
    K8s MySQL数据持久化存储 K8s MySQL数据持久化
  • K8s中MySQL 数据持久化存储的实现
    目录一、步骤二、实践2.1 创建 PV 和 PVC2.2 部署 mysql 服务2.3 创建测试数据2.4 模拟节点宕机2.5 数据一致性验证FAQ一、步骤 (1)创建 PV 和 PVC。 (2)部署 MySQL 服务。...
    99+
    2023-01-09
    K8s MySQL数据持久化存储 K8s MySQL数据持久化
  • mysql如何存储数据
    MySQL可以使用表来存储数据,表由行和列组成。每一行表示一个记录,每一列表示一个字段。在创建表时,需要指定表的名称和字段的名称、类型以及其他属性。以下是一个创建表和存储数据的示例:1. 创建表:```sqlCREATE TABLE u...
    99+
    2023-08-11
    mysql
  • 如何在Java中使用NumPy来存储数据?
    NumPy是Python中最流行的科学计算库之一,它提供了大量的数学函数和数组操作。但是,有时候我们需要在Java中使用NumPy来存储数据,比如在机器学习和数据分析领域中。本文将介绍如何在Java中使用NumPy来存储数据。 安装Nu...
    99+
    2023-10-22
    numpy 教程 存储
  • 如何使用GO语言存储数据类型?
    GO语言是一种非常流行的开发语言,它的速度非常快,可以用于开发高性能应用程序。但是,GO语言的强大并不仅限于速度,它还有很多其他的特性,比如存储数据类型。在本文中,我们将介绍如何使用GO语言存储不同类型的数据,并提供一些实际的演示代码。 一...
    99+
    2023-11-12
    数据类型 存储 javascript
  • 如何在Python中使用Unix存储接口来优化数据存储?
    Python是一种灵活且功能强大的编程语言,因此成为了许多数据科学家和开发人员的首选语言。在Python中,我们可以使用各种不同的存储方法来存储和管理数据。其中,Unix存储接口是一种流行的存储方法,可以优化数据存储和访问。在本文中,我们将...
    99+
    2023-08-22
    存储 接口 unix
  • Unity游戏之存储数据
    目录一、Unity-PlayerPrefs(数据持久化)保存数据读取数据其他一些方法二、Unity-Serialization(序列化)和Deserialization(反序列化)三...
    99+
    2024-04-02
  • 如何使用ASP、大数据、Laravel、存储来优化企业的数据处理和存储?
    随着企业数据量的不断增加,如何优化数据处理和存储已经成为了企业管理的重要问题。本文将介绍如何使用ASP、大数据、Laravel和存储来解决这一问题。 ASP是一种非常流行的网络应用程序开发技术,它可以帮助企业快速开发出高效稳定的网络应用程...
    99+
    2023-11-12
    大数据 laravel 存储
  • Spring 中如何使用 ASP 函数进行数据存储?
    ASP 函数是一种能够帮助我们简化代码的函数,它能够实现一些常见的操作,如字符串拼接、日期格式化等。在 Spring 中,我们可以使用 ASP 函数来进行数据存储,这样能够提高代码的可读性和可维护性。本文将介绍如何在 Spring 中使用...
    99+
    2023-10-06
    函数 spring 存储
  • Atlas如何存储元数据
    Atlas使用称为Atlas Entities的数据模型来存储元数据。这个模型包含了不同类型的实体,比如数据库表、列、数据集、数据处...
    99+
    2024-04-11
    Atlas
  • PHP如何使用session存储与获取用户数据
    在PHP中,可以使用$_SESSION全局变量来存储和获取用户数据。以下是使用$_SESSION存储和获取用户数据的示例: // 开...
    99+
    2024-05-06
    PHP
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作