【K8S系列】深入解析K8S存储

序言

做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

Kubernetes (k8s) 是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s存储相关知识

希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流

 专栏介绍

这是这篇文章所在的专栏,欢迎订阅:【深入解析k8s】专栏

简单介绍一下这个专栏要做的事:

  • 主要是深入解析每个知识点,帮助大家完全掌握k8s,以下是已更新的章节
  • 这是专栏介绍文章地址:【深入解析K8S专栏介绍】

今天我们来看一下K8s 存储相关问题

  • k8s存储类型
  • 存储使用场景
  • 存储使用案例

1 存储类型

Kubernetes 存储可以分为两类:

  • 临时存储
  • 持久存储

1.1 临时存储

临时存储:通常是短暂的、易失性的存储,例如 Pod 的本地存储或内存存储。

常见的临时存储有: 

  • EmptyDirEmptyDir 是一种在 Pod 中创建的空目录,它用于在容器之间共享文件。EmptyDir 的数据存在于 Pod 所在节点的本地磁盘上,当 Pod 被删除时,数据也会被删除。

  • HostPath:HostPath 卷将主机节点上的文件系统路径挂载到容器中。这种存储卷通常用于测试和开发环境,不适合生产环境

1.2 持久存储

持久存储:是一种长期存储,用于存储应用程序的数据和状态,例如数据库或文件系统。

常见的持久存储有: 

  • NFS:NFS 卷将网络文件系统 (NFS) 挂载到容器中。这种存储卷可以跨多个 Pod 和节点共享数据。

  • ConfigMap 和 SecretConfigMap 和 Secret 卷将配置文件和密钥挂载到容器中。这种存储卷可以用于配置 Pod 中的应用程序或存储敏感数据。

  • PersistentVolumeClaim (PVC):PVC 卷是一种抽象层,它将 Kubernetes 集群中的物理存储资源抽象为逻辑存储卷。PVC 卷可以动态地分配和释放存储资源,并且可以在不同的 Pod 之间共享。

  • StatefulSet:StatefulSet 卷是一种特殊的 PVC 卷,它可以为有状态应用程序提供稳定的、持久的存储。StatefulSet 卷会为每个 Pod 分配唯一的持久卷,并且可以按照顺序启动和关闭 Pod。

除了上述持久存储选项之外,Kubernetes 还支持动态存储卷和 CSI 存储插件。

  • 动态存储卷:是一种自动化管理存储资源的方法,它可以根据需求动态地创建和删除存储卷。
  • CSI 存储插件:是一种标准化的存储插件接口,它可以与多种不同类型的存储后端集成。

2 使用场景 

在 Kubernetes 中,存储通常是通过挂载存储卷的方式来实现的。存储可以用于许多场景,包括但不限于以下几个方面:

  1. 持久化数据
  2. 分布式存储
  3. 数据库
  4. 日志和监控
  5. 静态资源
  6. 分布式文件系统
  7. 镜像仓库
  8. 大数据分析
  9. 云存储

2.1 持久化数据 

在容器化的应用程序中,数据通常是存储在容器内部的文件系统中。但是,当容器被删除或重新启动时,数据也会被清除。

为了解决这个问题,可以将数据存储在持久存储卷中,以保证数据的持久性。

2.2 分布式存储 

在分布式系统中,数据通常会被分散存储在多个节点上。可以使用 Kubernetes 中的分布式存储来存储数据,并且可以通过存储卷的方式将存储卷挂载到多个容器中,以便它们可以共享数据。

2.3 数据库 

在容器化应用程序中,数据库通常是存储在容器内部的文件系统中。但是,当容器被删除或重新启动时,数据库也会被清除。

解决这个问题,可以将数据库存储在持久存储卷中,以保证数据的持久性。

2.4 日志和监控 

在容器化应用程序中,日志和监控数据可以被存储在持久存储卷中,以便它们可以在容器被删除或重新启动后继续存在。

这可以帮助开发人员和管理员更好地了解应用程序的运行状况,并对其进行监控和调试。

2.5 静态资源 

在 Web 应用程序中,静态资源(如图像、CSS 文件和 JavaScript 文件等)可以被存储在持久存储卷中,以便它们可以在容器被删除或重新启动后继续存在。

这可以提高应用程序的性能和可靠性。

2.6 分布式文件系统 

在分布式系统中,可以使用分布式文件系统来存储和管理数据。在 Kubernetes 中,可以使用分布式文件系统来存储容器化应用程序中的数据,并将存储卷挂载到多个容器中,以便它们可以共享数据。

2.7 镜像仓库 

在 Kubernetes 中,可以使用镜像仓库来存储和管理容器镜像。镜像仓库可以帮助开发人员和管理员更好地管理应用程序的镜像,并确保应用程序在不同环境中的镜像版本的一致性。

2.8 大数据分析 

在大数据分析中,需要处理大量的数据。可以使用 Kubernetes 中的大数据存储来存储和管理数据,并将存储卷挂载到多个容器中,以便它们可以共享数据。这可以帮助分析师更好地处理和分析数据。

2.9 云存储 

在云环境中,可以使用云存储来存储和管理数据。在 Kubernetes 中,可以使用云存储来存储容器化应用程序中的数据,并将存储卷挂载到多个容器中,以便它们可以共享数据。

2.10 总结 

总之,在 Kubernetes 中,存储具有非常广泛的应用场景。可以根据实际需求选择适合自己的存储方案,以便更好地管理容器化应用程序中的数据和资源。

3 使用案例

 介绍一下持久存储使用案例和临时存储使用案例。

3.1 持久存储使用详细案例介绍

以下是一个使用持久存储的详细案例介绍:

在这个案例中,将创建一个简单的 WordPress 应用程序,并使用持久存储来保存应用程序的数据。

WordPress 是一个流行的开源博客平台,它通常需要一个 MySQL 数据库来存储文章、评论和其他相关数据。

在 Kubernetes 中,可以使用持久存储来存储 MySQL 数据库的数据,并将其挂载到多个 MySQL 容器中,以便它们可以共享数据。这样,即使 MySQL 容器被删除或重新启动,数据也不会丢失。

下面是在 Kubernetes 中使用持久存储来部署 WordPress 应用程序的步骤:

  1. 创建 PersistentVolume
  2. 创建 PersistentVolumeClaim
  3. 创建 MySQL Pod
  4. 创建 WordPress Pod
  5. 创建 Service
  6. 部署应用程序

3.1.1 创建 PersistentVolume 

首先,需要创建一个 PersistentVolume(持久卷),用于存储 MySQL 数据库的数据。

可以使用 Kubernetes 中的各种持久化存储解决方案,例如本地存储、云存储或分布式存储。

在这个案例中,会使用本地存储来存储 MySQL 数据库的数据。可以通过创建一个 YAML 文件来定义 PersistentVolume。

下面是一个定义本地存储 PersistentVolume 的 YAML 文件示例:

apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /mnt/data/mysql

这个 YAML 文件定义了一个名为 mysql-pv 的 PersistentVolume,它使用本地存储来存储数据,并将数据存储在 /mnt/data/mysql 目录中。

这个 PersistentVolume 的大小为 10GB,访问模式为 ReadWriteOnce(即只能被一个 Pod 挂载),持久化策略为 Retain(即在 PersistentVolume 被删除时不会删除数据),存储类名称为 local-storage。

3.1.2 创建 PersistentVolumeClaim 

完成 PersistentVolume 的创建之后,需要创建一个 PersistentVolumeClaim(持久卷声明),用于请求 PersistentVolume 中的存储空间。

可以通过创建一个 YAML 文件来定义 PersistentVolumeClaim。

下面是一个定义 PersistentVolumeClaim 的 YAML 文件示例:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: local-storage

这个 YAML 文件定义了一个名为 mysql-pvc 的 PersistentVolumeClaim,它请求 10GB 的存储空间,并使用 storageClassName 属性来指定使用的存储类名称。

在这个示例中,使用的是之前创建的 local-storage 存储类。

3.1.3 创建 MySQL Pod 

完成 PersistentVolumeClaim 的创建之后,可以创建一个 MySQL Pod,并将它与 PersistentVolumeClaim 和 PersistentVolume 关联起来。

在这个案例中,会使用官方的 MySQL 镜像,并将其挂载到 PersistentVolumeClaim 中。

可以通过创建一个 YAML 文件来定义 MySQL Pod。

下面是一个定义 MySQL Pod 的 YAML 文件示例:

apiVersion: v1
kind: Pod
metadata:name: mysql
spec:containers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalue: passwordports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-pvmountPath: /var/lib/mysqlvolumes:- name: mysql-pvpersistentVolumeClaim:claimName: mysql-pvc

这个 YAML 文件定义了一个名为 mysql 的 Pod,它使用官方的 MySQL 镜像,并将其挂载到名为 mysql-pv 的存储卷上,该存储卷与名为 mysql-pvc 的 PersistentVolumeClaim 关联。

在容器中,使用 volumeMounts 属性将 PersistentVolumeClaim 挂载到 /var/lib/mysql 目录。

3.1.4 创建 WordPress Pod 

完成 MySQL Pod 的创建之后,可以创建 WordPress Pod,并将其与 MySQL Pod 关联起来。

在这个案例中,会使用官方的 WordPress 镜像,并将其挂载到一个名为 wp-pv 的存储卷上,该存储卷与名为 wp-pvc 的 PersistentVolumeClaim 关联。

可以通过创建一个 YAML 文件来定义 WordPress Pod。

下面是一个定义 WordPress Pod 的 YAML 文件示例:

apiVersion: v1
kind: Pod
metadata:name: wordpress
spec:containers:- name: wordpressimage: wordpress:latestenv:- name: WORDPRESS_DB_HOSTvalue: mysql- name: WORDPRESS_DB_USERvalue: root- name: WORDPRESS_DB_PASSWORDvalue: password- name: WORDPRESS_DB_NAMEvalue: wordpressports:- containerPort: 80name: wordpressvolumeMounts:- name: wp-pvmountPath: /var/www/htmlvolumes:- name: wp-pvpersistentVolumeClaim:claimName: wp-pvc

这个 YAML 文件定义了一个名为 wordpress 的 Pod,它使用官方的 WordPress 镜像,并将其挂载到名为 wp-pv 的存储卷上,该存储卷与名为 wp-pvc 的 PersistentVolumeClaim 关联。

在容器中,使用 volumeMounts 属性将 PersistentVolumeClaim 挂载到 /var/www/html 目录。

WordPress Pod 还通过环境变量设置了 MySQL 数据库的主机、用户名、密码和数据库名称。

3.1.5 创建 Service 

完成 WordPress Pod 的创建之后,需要创建一个 Service,用于将 WordPress Pod 暴露给外部访问。

可以通过创建一个 YAML 文件来定义 Service。

下面是一个定义 Service 的 YAML 文件示例:

apiVersion: v1
kind: Service
metadata:name: wordpress-service
spec:selector:app: wordpressports:- protocol: TCPport: 80targetPort: 80type: NodePort

这个 YAML 文件定义了一个名为 wordpress-service 的 Service,它选择 app 标签为 wordpress 的 Pod,并将其暴露在端口 80 上。

在这个示例中,Service 的类型为 NodePort,这意味着它将在每个节点上暴露一个随机端口,用于外部访问。

3.1.6 部署应用程序 

完成以上步骤之后,可以使用 kubectl 命令来部署 WordPress 应用程序。

以下是部署 WordPress 应用程序的 kubectl 命令:

kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-pod.yaml
kubectl apply -f wp-pvc.yaml
kubectl apply -f wp-pod.yaml
kubectl apply -f wp-service.yaml

这些命令将按照顺序:

1. 创建 PersistentVolume

kubectl apply -f mysql-pv.yaml

2. 创建PersistentVolumeClaim

kubectl apply -f mysql-pvc.yaml

3. 创建MySQL Pod

kubectl apply -f mysql-pod.yaml

4. 创建WordPress PersistentVolumeClaim

kubectl apply -f wp-pvc.yaml

5. 创建WordPress Pod

kubectl apply -f wp-pod.yaml

6. 创建Service

kubectl apply -f wp-service.yaml

完成部署之后,可以在浏览器中访问 WordPress 应用程序,以确保它可以正常工作。如果需要对应用程序进行修改或升级,可以重复这些步骤,并使用新的 YAML 文件来定义新的 Pod、PersistentVolumeClaim 和 Service。

3.2 临时存储使用详细案例介绍

以下是一个使用临时存储的详细案例介绍:

在这个案例中,将创建一个简单的 Redis 应用程序,并使用临时存储来保存应用程序的数据。

Redis 是一个流行的开源内存数据结构存储系统,它通常需要一个本地磁盘来保存持久化数据。

在 Kubernetes 中,可以使用临时存储来保存 Redis 数据库的持久化数据。可以将临时存储挂载到 Redis Pod 中,并在 Redis Pod 中启用持久化功能。

这样,即使 Redis Pod 被删除或重新启动,数据也不会丢失。

下面是在 Kubernetes 中使用临时存储来部署 Redis 应用程序的步骤:

  1. 创建 Redis Pod
  2. 创建 Service
  3. 部署应用程序

3.2.1 创建 Redis Pod 

首先,需要创建一个 Redis Pod,并将临时存储挂载到 Redis Pod 中。可以通过创建一个 YAML 文件来定义 Redis Pod。

下面是一个定义 Redis Pod 的 YAML 文件示例:

apiVersion: v1
kind: Pod
metadata:name: redis
spec:containers:- name: redisimage: redis:6.0command:- redis-serverargs:- "--appendonly yes"ports:- containerPort: 6379name: redisvolumeMounts:- name: redis-datamountPath: /datavolumes:- name: redis-dataemptyDir: {}

这个 YAML 文件定义了一个名为 redis 的 Pod,它使用官方的 Redis 镜像,并将其挂载到一个名为 redis-data 的临时存储卷上。

在容器中,使用 volumeMounts 属性将临时存储卷挂载到 /data 目录。

这个 Redis Pod 还启用了 Redis 的持久化功能,通过 args 属性将 "--appendonly yes" 传递给 Redis 服务器。

3.2.2 创建 Service 

完成 Redis Pod 的创建之后,需要创建一个 Service,用于将 Redis Pod 暴露给外部访问。可以通过创建一个 YAML 文件来定义 Service。

下面是一个定义 Service 的 YAML 文件示例:

apiVersion: v1
kind: Service
metadata:name: redis-service
spec:selector:app: redisports:- protocol: TCPport: 6379targetPort: 6379

这个 YAML 文件定义了一个名为 redis-service 的 Service,它选择 app 标签为 redis 的 Pod,并将其暴露在端口 6379 上。

3.2.3 部署应用程序 

完成以上步骤之后,可以使用 kubectl 命令来部署 Redis 应用程序。例如,以下是一个部署 Redis 应用程序的 kubectl 命令:

kubectl apply -f redis-pod.yaml
kubectl apply -f redis-service.yaml

这些命令将按照顺序创建

1.创建Redis Pod

kubectl apply -f redis-pod.yaml

2.创建Service

kubectl apply -f redis-service.yaml

完成部署之后,可以使用 Redis 客户端连接到 Redis Pod,并将数据存储在 Redis 中。如果需要对应用程序进行修改或升级,可以重复这些步骤,并使用新的 YAML 文件来定义新的 Pod 和 Service。

4 投票

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debian 12 静态IP / 固定IP的设置

环境:Debian 12 amd64-lxde 局域网:PT925E电信光猫 手机APP 网络管家 一般用动态IP就可以了,但如果软件环境比较小众,问题就随之而来。起始问题:路由器无法解析设备名和IP,网络管家也不让设置固定IP&…

REDIS缓存穿透 击穿 雪崩

一、前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者…

vscode高亮插件——highlight-words(高亮代码、高亮变量、突出显示)

文章目录 官方教程高亮文字使用方法配置 演示变量高亮(Highlight Toggle Current)选择高亮(Highlight Selection with Options)删除高亮(Highlight Remove)侧边栏(Highlight Toggle Sidebar&…

QT——使用QListWidget、QListWidgetItem、QWidget实现自定义管理列表

作者:小 琛 欢迎转载,请标明出处 文章目录 需求场景思路描述Qt模块QListWidgetQListWidgetItem自定义QWidget配合QListWidget 例子:实现一个json文件管理窗口 需求场景 因工作需要,开发一个文件管理窗口,要让使用者可…

Buildroot 取消默认QT桌面-迅为RK3588开发板

本小节将讲解如何取消掉默认的 qt 桌面。 首先对开发板进行上电,开发板正常启动后,使用命令“cd /etc/init.d”进入到/etc/init.d 目录 下,然后使用以下命令对开机自启动脚本 rcS 进行查看,如下图所示: vi rcS 从上…

B2a实例学习记录

B2a简介 只是把hit存到了hitcollection,只是统计了各自event结果,将每次event的运行结果存起来了,并没有做总的求和 如何在B2a的基础上,实现对某一个chamber的能量的累加 1 hit和SD(sensitive detector) 每一个s…

minikube从入门到精通系列之一:部署minikube详细步骤

minikube从入门到精通系列之一:部署minikube详细步骤 一、认识Minikube二、Minikube核心知识点三、minikube官方地址四、minikube 启动五、minikube的配置需求六、Mac安装minikube七、CenotOS7上安装minikube八、启动集群九、与集群交互十、部署应用程序1.Service2.…

服务器压力测试

目录 一、磁盘性能测试安装fio磁盘性能测试工具测试内容为顺序读、随机读、顺序写、随机写、随机读写结果分析 二、CPU性能测试安装sysbench性能测试工具结果分析 三、内存性能测试结果分析 四、网络性能测试测试iperf3工具测试结果分析1.测试TCP吞吐量2 . 测试UDP丢包和延迟 此…

自定义MVC框架优化

目录 一、前言 二、优化问题 1.子控制器的初始化配置问题 2.页面跳转优化代码冗余问题 3.优化参数封装问题 三、进行优化 1.解决子控制器初始化配置 2.解决页面跳转的代码冗余问题 3.解决优化参数封装问题 4.中央控制器 一、前言 在自定义MVC框架原理中讲述了什么是…

基于matlab使用点特征匹配稳定从抖动平台捕获的视频(附源码)

一、前言 此示例演示如何稳定从抖动平台捕获的视频。稳定视频的一种方法是跟踪图像中的显著特征,并将其用作锚点以消除与其相关的所有扰动。但是,此过程必须了解第一个视频帧中这种显着特征的位置。在此示例中,我们探索了一种无需任何此类先…

亚马逊云科技中国峰会聚焦生成式AI等前沿科技,探讨当下时代的挑战与机遇

6月27日,“2023亚马逊云科技中国峰会”在上海世博中心盛大启幕! 亚马逊全球副总裁、亚马逊云科技大中华区执行董事张文翊全面阐述了在当下这个挑战与机遇并存的时代,面对生成式AI等前沿科技带来的新挑战和新机遇,企业需要“面向未…

使用 Docker 高效搭建本地开发环境(详细教程)

Docker本地开发环境的好处 试错 对开发者而言,每天会催生出的各式各样的新技术都需要尝试,然而开发者却不太可能为他们一一搭建好环境并进行测试。时间非常宝贵,正是得益于 Docker,让我们有可能在一条或者几条命令内就搭建完环境…