【Kubernetes】K8s 持久化存储方式

news2024/11/14 13:32:53

K8s 持久化存储方式

  • 1.使用节点数据卷
  • 2.使用网络数据卷
  • 3.使用临时数据卷

由于容器是一种无状态的服务,所以容器中的文件在宿主机上表现出来的都是临时存放(当容器崩溃或者重启时,容器中的文件会丢失)。另外,Kubernetes 也需要在 Pod 之间实现数据共享。为了解决这些问题,Kubernetes 与 Docker 一样,也通过使用 数据卷 的方式来实现 数据持久化

在 Kubernetes 中,数据卷具有明确的生命周期,该生命周期与 Pod 的生命周期相同。即使 Pod 中的容器崩溃或者重启了,其挂载的数据集依然存在。因此,Kubernetes 中数据卷的生命周期比 Pod 中运行的任何容器的生命同期都要长。Pod 中的容器可以访问挂载的数据卷、读写数据卷中的文件。

Kubernetes 允许 Pod 使用任意数据的数据卷,并支持各种类型的数据卷驱动程序。下面列举了 Kubernetes 支持的数据卷驱动程序。

类型
类型
类型
类型
awsElasticBlockStore(已弃用)azureDisk(已弃用)azureFile(已弃用)cephfs(已弃用)
cinder(已弃用)configMapdownwardAPIemptyDir
fc(光纤通道)gcePersistentDisk(已弃用)gitRepo (已弃用)glusterfs(已移除)
hostPathiscsilocalnfs
persistentVolumeClaimportworxVolume(已弃用)投射(projectedrbd
secretvsphereVolume(已弃用)

🚀 Kubernetes 支持多种类型的卷,详见《官方文档》。

要在 Kubernetes 中使用数据卷,则需要在 Pod 的描述文件中使用 spec.volumes 字段来指定数据卷的类型和挂载的目录,还需要使用 spec.containers.volumeMounts 字段来指定数据卷映射到容器的位置。

根据数据卷的挂载方式的不同,Kubernetes 中的数据卷分为:节点数据卷Host PathVolume)、网络数据卷NFS Volume)和 临时数据卷EmptyDir Volume)。

1.使用节点数据卷

节点数据卷(HostPath Volume)是指,将 node 节点上的某个文件或者目录挂载到 Pod 中的一个数据卷。节点数据卷与 Docker 的数据卷类似 —— 都把宿主机的目录挂载到容器下,因此要求在每个 node 节点上被挂载的目录必须存在。因为,Kubernetes 在创建 Pod 时,并不能确定将 Pod 分配到哪个 node 节点上。

下面来演示如何使用节点数据卷。

创建 Pod 的描述文件 hostdir-demo.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Pod
metadata:
  name: hostdir-demo
spec:
  containers:
  - name: container-demo
    image: nginx
    volumeMounts:
    - mountPath: /demo-pod
      name: volume-demo
  volumes:
  - name: volume-demo
    hostPath:
      path: /tmp
      type: Directory

🚀 这里在创建 Pod 的同时创建了一个节点数据卷,实现了将宿主机上的 /tmp 目录挂载到容器内部的 /demo-pod 目录下。

使用 kubectl apply -f 命令创建 Pod。

kubectl apply -f hostdir-demo.yaml

查看 Pod 的详细信息。

kubectl get pod -o wide

输出的信息如下。可以看到,Pod 被分配到 node01 节点上了。

在这里插入图片描述

进入 Pod 中的容器内。

kubectl exec -it hostdir-demo -c container-demo bash

查看 /demo-pod 目录下的内容。

ls /demo-pod/

在这里插入图片描述
在这里插入图片描述

在 node01 节点上删除 /tmp 目录下的内容,再次查看容器内的 /demo-pod 目录。这时会发现容器内挂载的文件也随之被删除了。

在这里插入图片描述
在这里插入图片描述

2.使用网络数据卷

网络数据卷(NFS Volume)能将网络文件系统 NFS 直接挂载到 Pod 中。在删除 Pod 时,网络数据卷不会同时被删除,只是被从挂载的 Pod 上卸载了。通过使用网络数据卷,可以在 Pod 被创建之前预先填充数据,这些数据可以在创建 Pod 时被直接传递给 Pod。

下面来演示如何使用节点数据卷,将把 master 节点作为 NFS Server 来使用。

在这里插入图片描述

执行以下命令在所有节点上安装并启动 NFS。

apt install -y nfs-kernel-server
systemctl enable nfs-server
systemctl start nfs-server
systemctl status nfs-server

在这里插入图片描述

在 master 节点上创建 /nfs 目录,并在该目录下生成一些测试文件。

mkdir /nfs
echo "<h1>Hello World and Hello NFS</h1>" > /nfs/index.html

在 master 节点上编辑 /etc/exports 文件,输入以下配置信息。该节点将作为 NFS Server。

echo "/nfs *(rw,sync,no_root_squash)" > /etc/exports

其中的参数说明如下。

  • /nfs:NFS 共享的目录。
  • *:可以访问所有的主机网段。
  • rw:可读写权限。如果是只读权限,则是 ro
  • sync:数据传输采用同步方式。采用同步方式可以保障数据的安全性,但传输速度较慢。如果采用异步方式,则是 async。在异步方式下,数据传输效率高,但安全性差。
  • no_root_squash:NFS 服务共享目录的属性。如果用户是 root,则它对这个目录就有 root 的权限了。

重启 master 节点上的 NFS 服务。

systemctl restart nfs-kernel-server

创建 Pod 的描述文件 nfsdir-demo.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Pod
metadata:
  name: nfsdir-demo
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: webroot
      mountPath: /usr/share/nginx/html
    ports:
    - containerPort: 80
  volumes:
  - name: webroot
    nfs:
      server: 172.30.1.2
      path: /nfs

🚀 这里通过使用网络数据卷将 NFS Server 上的目录挂载到了容器内部 /usr/share/nginx/html 目录下。

使用 kubectl apply -f 命令创建 Pod。

kubectl apply -f nfsdir-demo.yaml

查看 Pod 的 IP 地址。

kubectl get pod -o wide

输出的信息如下:

在这里插入图片描述

使用 curl 命令访问 Pod IP 地址的 80 端口。

curl 192.168.0.6:80

将返回 Nginx 的首页,内容如下:

在这里插入图片描述

这里使用网络数据卷将事先准备好的 Nginx 首页 index.html 挂载到 Pod 容器的内部了。可以使用以下命令进入 Pod 容器的内部查看 usr/share/nginx/html 目录下的 index.html 文件。

kubectl exec -it nfsdir-demo -c nginx bash

在这里插入图片描述

3.使用临时数据卷

临时数据卷(EmptyDir Volume)是 Pod 生命周期中的一个临时目录。与其他数据卷所不同的是,当 Pod 的生命周期结束时(如 Pod 被删除),临时数据卷也会同时被删除。

利用临时数据卷,可以实现 Pod 内部多个容器之间的数据共享,也可以使用临时数据卷作为容器的临时目录来进行数据的缓存。

下面演示如何使用节点数据卷。

创建 Pod 的描述文件 emptydir-demo.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Pod
metadata:
  name: emptydir-demo
spec:
  containers:
  - name: tomcat
    image: tomcat
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: app-logs
      mountPath: /usr/local/tomcat/logs
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["sh", "-c", "tail -f /logs/catalina*.log"]
    volumeMounts:
    - name: app-logs
      mountPath: /logs
  volumes:
  - name: app-logs
    emptyDir: {}

这里的 Pod 创建了两个容器:tomcat 容器和 busybox 容器。通过定义一个临时数据卷实现了 tomcat 容器的 /usr/ocal/tomcat/logs 目录与 busybox 容器的 /logs 目录的数据共享。这样就可以在 busybox 容器中使用 tail 命令来查看 tomcat 容器中的日志信息了。

使用 kubectl apply -f 命令创建 Pod。

kubectl apply -f emptydir-demo.yaml

查看 Pod 信息。

在这里插入图片描述

进入 busybox 容器。

kubectl exec -it emptydir-demo -c busybox sh

查看 /logs/catalina.2022-02-03.log 文件的内容,如下图所示。

tail /logs/catalina.2024-08-25.log

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++领进门(第一讲)

目录 1. C关键字&#xff08;C98&#xff09; 2. 命名空间 ​编辑 2.1命名空间的定义 2.2命名空间的使用 3.C的输入&输出 3.1cout与printf的区别 4.缺省参数 4.1缺省函数的概念 4.2缺省参数分类 5.函数重载 C的语法就是在C的基础上弥补了C的缺陷与不足 1. C关键…

Java集合框架(三)---Map

接口Map<K,V> Map集合&#xff1a;该集合存储键值对&#xff0c;一对一对往里存&#xff0c;而且要保证键的唯一性。 1&#xff0c;添加 put(K key, V value) putAll(Map<? extends K, ? extends V> m) 2&#xff0c;删除 clear() remove(Object key) 3&#xff…

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用DFX能力介绍(含闯关习题)

学完时间&#xff1a;2024年8月24日 学完排名&#xff1a;第1698名 一、Performance Analysis Kit简介 Performance Analysis Kit&#xff08;性能分析服务&#xff09;为开发者提供应用事件、日志、跟踪分析工具&#xff0c;可观测应用运行时状态&#xff0c;用于行为分析、…

游戏分享网站|基于SprinBoot+vue的游戏分享网站系统(源码+数据库+文档)

游戏分享网站 目录 基于SprinBootvue的游戏分享网站 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2后台登录 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

kaggle竞赛宝典 | 量化竞赛第一名的网络模型

本文来源公众号“kaggle竞赛宝典”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;量化竞赛第一名的网络模型 1 简介 今天我们重温Jane Street 大赛第一名的网络模型。该次赛事数据集包含了一组匿名的特征&#xff0c;feature_{0…

2014年4月-2023年上市公司秩鼎ESG评级数据

2014年4月-2023年上市公司秩鼎ESG评级数据 1、时间&#xff1a;2014年4月-2023年11月 2、来源:秩鼎数据 3、指标&#xff1a;证券代码、SC、评级日期、ESG评级、ESG等级、ESG得分、E评级、E等级、E得分、S评级、S等级、S得分、G评级、G等级、G得分、总市值(亿元)、流通市值(…

企业微信聊天记录可以保存多久?员工聊天记录查看指南!合规存档,助力企业规避风险!

在数字化办公的浪潮中&#xff0c;企业微信已成为企业沟通协作的重要工具。然而&#xff0c;聊天记录的保存时长与合规性管理&#xff0c;成为企业不可忽视的问题。 企业微信聊天记录云端最长可保存90天&#xff0c;但企业可根据需求自定义设置。本文将为您详细解析企业微信聊…

Linux TCP多线程服务器

一、多线程开发 线程和进程 程序写好存储在硬盘介质里&#xff0c;CPU读取程序到内存 &#xff0c;这个在内存中的可执行程序实例就叫进程。一个程序如果多次读取到内存中&#xff0c;那他们就是各自独立的进程 内存中的任何位置都有相应的地址方便访问&#xff0c;而在内存中…

8.23-docker基础命令学习

docker 1.docker容器 [rootdocker ~]# systemctl start docker[rootdocker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 5d0da3dc9764 2 years ago 231MB​# 容器执行完就退出了​[rootdocker ~]# docker run -it …

C++20中的简写函数模板(abbreviated function template)

简写函数模板(abbreviated function template):当占位符类型(auto或concept auto)出现在函数声明或函数模板声明的参数列表中时&#xff0c;该声明将声明一个函数模板&#xff0c;并且每个占位符的一个虚构模板参数(one invented template parameter)将附加到模板参数列表。如下…

【412】【K 次乘运算后的最终数组 I】

第一次打周赛&#xff0c;难绷 后两题都差200个样例。 这题很简单&#xff0c;看题就可以 class Solution:def getFinalState(self, nums: List[int], k: int, multiplier: int) -> List[int]:nlen(nums)for i in range(k):mnmin(nums)for j in range(n):if nums[j]mn:nums…

自定义类加载器使用geotools读取高程报 ImageRead: No OperationDescriptor is registered 问题

背景 项目中使用了 自定义classLoader ,&#xff0c;然后使用下面简化后的代码读取高程数据 public class Test{public static void main(String[] args) throwS Exception{CustomClassLoader cl new CustomClassLoader();Class<?> clazz cl.loadClass(“Test”);Te…

后端代码练习5--验证码案例

我们日常生活中&#xff0c;在进行应用程序注册或者登录的时候&#xff0c;出于安全性的考虑&#xff0c;我们都会被进行一项验证的操作&#xff0c;即通过网页给我们的图片进行一些列的操作&#xff0c;最终完成对我们身份的验证并给我们这些用户返回验证码&#xff0c;让我们…

C语言-有两个磁盘文件A和B,各存放一行字母,今要求把这两个文件的信息合并(按字母顺序排列),输出到一个新文件C中去-深度代码解析

1、题目要求 有两个磁盘文件A和B&#xff0c;各存放一行字母&#xff0c;今要求把这两个文件的信息合并&#xff08;按字母顺序排列&#xff09;&#xff0c;输出到一个新文件C中去 2、准备工作 问题1&#xff1a;为什么不需要手动创建C.txt文件&#xff1f; 答&#xff1a;根…

技术分享-商城篇-订单模块-取消/收货功能(十六)

前言 再上一篇文章技术分享-商城篇-用户订单管理&#xff08;十五) 中&#xff0c;订单模块用户操作含有&#xff1a;取消订单、去支付、确认收货、删除订单、查看详情、去退款、查看物流、再次购买等业务操作&#xff0c;以上的每一个操作&#xff0c;都是对应不同的业务和状…

AudioNotes -将音频内容转 markdown

文章目录 一、关于 AudioNotes效果展示音视频识别和整理与音视频内容对话 二、使用方法1、安装 Ollama2、拉取模型3、部署服务3.1 Docker部署&#xff08;推荐&#xff09;&#x1f433;3.2 本地部署 &#x1f4e6; 一、关于 AudioNotes AudioNotes 能够快速提取音视频的内容&…

贪心处理任务(华为od机考题)

一、题目 1.原题 在某个项目中有多个任务&#xff08;用 tasks 数组表示&#xff09;需要您进行处理&#xff0c; 其中 tasks[i] [si, ei]&#xff0c; 你可以在 si < day < ei 中的任意一天处理该任务。 请返回你可以处理的最大任务数。 注&#xff1a;一天可以完成一…

硬件面试经典 100 题(81~90)题

81、请问下图电路中二极管 D1、D2 有什么作用&#xff1f; 在 Vi 输入电压接近于零时&#xff0c;D1、D2 给三极管 T1、T2 提供偏置电压&#xff0c;使 T1、T2 维持导通&#xff0c;以消除交越失真。 陈氏解释 这道题参见&#xff1a;硬件面试经典 100 题&#xff08;51~70 题…

【学习笔记】STM32F407探索者HAL库开发(三)IO分配

【学习笔记】STM32F407探索者HAL库开发&#xff08;三&#xff09;IO分配 1 STM32F407 IO资源分配表2 STM32F407ZGT6 引脚定义3 IO分配的重要性3.1 硬件设计优化3.2 软件编程3.3 系统性能提升 4 F1/F7/H7芯片的IO分配差异4.1 引脚数量和分组4.2 功能模式4.2.1 输入模式4.2.2 输…

Kubernetes 外部 etcd 集群的快速 Docker Compose 部署指南

一、背景 在高可用 Kubernetes 部署中&#xff0c;需要单独部署外部 etcd 集群&#xff0c;而不是使用 kubeadm 默认在 master 节点上部署的 etcd。以下是关于这一配置场景的详细记录。 二、etcd简介 etcd 是一个高可用的分布式键值存储系统&#xff0c;主要用于存储和管理配…