技术标签: 云原生 kubernetes 容器 深入解析K8S K8S系列 docker
做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。
文章标记颜色说明:
- 黄色:重要标题
- 红色:用来标记结论
- 绿色:用来标记一级论点
- 蓝色:用来标记二级论点
Kubernetes (k8s) 是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s存储相关知识
希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流
这是这篇文章所在的专栏,欢迎订阅:【深入解析k8s】专栏
简单介绍一下这个专栏要做的事:
- 主要是深入解析每个知识点,帮助大家完全掌握k8s,以下是已更新的章节
- 这是专栏介绍文章地址:【深入解析K8S专栏介绍】
今天我们来看一下K8s 存储相关问题
- k8s存储类型
- 存储使用场景
- 存储使用案例
Kubernetes 存储可以分为两类:
- 临时存储
- 持久存储
临时存储:通常是短暂的、易失性的存储,例如 Pod 的本地存储或内存存储。
常见的临时存储有:
EmptyDir:EmptyDir 是一种在 Pod 中创建的空目录,它用于在容器之间共享文件。EmptyDir 的数据存在于 Pod 所在节点的本地磁盘上,当 Pod 被删除时,数据也会被删除。
HostPath:HostPath 卷将主机节点上的文件系统路径挂载到容器中。这种存储卷通常用于测试和开发环境,不适合生产环境。
持久存储:是一种长期存储,用于存储应用程序的数据和状态,例如数据库或文件系统。
常见的持久存储有:
NFS:NFS 卷将网络文件系统 (NFS) 挂载到容器中。这种存储卷可以跨多个 Pod 和节点共享数据。
ConfigMap 和 Secret:ConfigMap 和 Secret 卷将配置文件和密钥挂载到容器中。这种存储卷可以用于配置 Pod 中的应用程序或存储敏感数据。
PersistentVolumeClaim (PVC):PVC 卷是一种抽象层,它将 Kubernetes 集群中的物理存储资源抽象为逻辑存储卷。PVC 卷可以动态地分配和释放存储资源,并且可以在不同的 Pod 之间共享。
StatefulSet:StatefulSet 卷是一种特殊的 PVC 卷,它可以为有状态应用程序提供稳定的、持久的存储。StatefulSet 卷会为每个 Pod 分配唯一的持久卷,并且可以按照顺序启动和关闭 Pod。
除了上述持久存储选项之外,Kubernetes 还支持动态存储卷和 CSI 存储插件。
- 动态存储卷:是一种自动化管理存储资源的方法,它可以根据需求动态地创建和删除存储卷。
- CSI 存储插件:是一种标准化的存储插件接口,它可以与多种不同类型的存储后端集成。
在 Kubernetes 中,存储通常是通过挂载存储卷的方式来实现的。存储可以用于许多场景,包括但不限于以下几个方面:
- 持久化数据
- 分布式存储
- 数据库
- 日志和监控
- 静态资源
- 分布式文件系统
- 镜像仓库
- 大数据分析
- 云存储
在容器化的应用程序中,数据通常是存储在容器内部的文件系统中。但是,当容器被删除或重新启动时,数据也会被清除。
为了解决这个问题,可以将数据存储在持久存储卷中,以保证数据的持久性。
在分布式系统中,数据通常会被分散存储在多个节点上。可以使用 Kubernetes 中的分布式存储来存储数据,并且可以通过存储卷的方式将存储卷挂载到多个容器中,以便它们可以共享数据。
在容器化应用程序中,数据库通常是存储在容器内部的文件系统中。但是,当容器被删除或重新启动时,数据库也会被清除。
解决这个问题,可以将数据库存储在持久存储卷中,以保证数据的持久性。
在容器化应用程序中,日志和监控数据可以被存储在持久存储卷中,以便它们可以在容器被删除或重新启动后继续存在。
这可以帮助开发人员和管理员更好地了解应用程序的运行状况,并对其进行监控和调试。
在 Web 应用程序中,静态资源(如图像、CSS 文件和 JavaScript 文件等)可以被存储在持久存储卷中,以便它们可以在容器被删除或重新启动后继续存在。
这可以提高应用程序的性能和可靠性。
在分布式系统中,可以使用分布式文件系统来存储和管理数据。在 Kubernetes 中,可以使用分布式文件系统来存储容器化应用程序中的数据,并将存储卷挂载到多个容器中,以便它们可以共享数据。
在 Kubernetes 中,可以使用镜像仓库来存储和管理容器镜像。镜像仓库可以帮助开发人员和管理员更好地管理应用程序的镜像,并确保应用程序在不同环境中的镜像版本的一致性。
在大数据分析中,需要处理大量的数据。可以使用 Kubernetes 中的大数据存储来存储和管理数据,并将存储卷挂载到多个容器中,以便它们可以共享数据。这可以帮助分析师更好地处理和分析数据。
在云环境中,可以使用云存储来存储和管理数据。在 Kubernetes 中,可以使用云存储来存储容器化应用程序中的数据,并将存储卷挂载到多个容器中,以便它们可以共享数据。
总之,在 Kubernetes 中,存储具有非常广泛的应用场景。可以根据实际需求选择适合自己的存储方案,以便更好地管理容器化应用程序中的数据和资源。
介绍一下持久存储使用案例和临时存储使用案例。
以下是一个使用持久存储的详细案例介绍:
在这个案例中,将创建一个简单的 WordPress 应用程序,并使用持久存储来保存应用程序的数据。
WordPress 是一个流行的开源博客平台,它通常需要一个 MySQL 数据库来存储文章、评论和其他相关数据。
在 Kubernetes 中,可以使用持久存储来存储 MySQL 数据库的数据,并将其挂载到多个 MySQL 容器中,以便它们可以共享数据。这样,即使 MySQL 容器被删除或重新启动,数据也不会丢失。
下面是在 Kubernetes 中使用持久存储来部署 WordPress 应用程序的步骤:
- 创建 PersistentVolume
- 创建 PersistentVolumeClaim
- 创建 MySQL Pod
- 创建 WordPress Pod
- 创建 Service
- 部署应用程序
首先,需要创建一个 PersistentVolume(持久卷),用于存储 MySQL 数据库的数据。
可以使用 Kubernetes 中的各种持久化存储解决方案,例如本地存储、云存储或分布式存储。
在这个案例中,会使用本地存储来存储 MySQL 数据库的数据。可以通过创建一个 YAML 文件来定义 PersistentVolume。
下面是一个定义本地存储 PersistentVolume 的 YAML 文件示例:
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /mnt/data/mysql
这个 YAML 文件定义了一个名为 mysql-pv 的 PersistentVolume,它使用本地存储来存储数据,并将数据存储在 /mnt/data/mysql 目录中。
这个 PersistentVolume 的大小为 10GB,访问模式为 ReadWriteOnce(即只能被一个 Pod 挂载),持久化策略为 Retain(即在 PersistentVolume 被删除时不会删除数据),存储类名称为 local-storage。
完成 PersistentVolume 的创建之后,需要创建一个 PersistentVolumeClaim(持久卷声明),用于请求 PersistentVolume 中的存储空间。
可以通过创建一个 YAML 文件来定义 PersistentVolumeClaim。
下面是一个定义 PersistentVolumeClaim 的 YAML 文件示例:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: local-storage
这个 YAML 文件定义了一个名为 mysql-pvc 的 PersistentVolumeClaim,它请求 10GB 的存储空间,并使用 storageClassName 属性来指定使用的存储类名称。
在这个示例中,使用的是之前创建的 local-storage 存储类。
完成 PersistentVolumeClaim 的创建之后,可以创建一个 MySQL Pod,并将它与 PersistentVolumeClaim 和 PersistentVolume 关联起来。
在这个案例中,会使用官方的 MySQL 镜像,并将其挂载到 PersistentVolumeClaim 中。
可以通过创建一个 YAML 文件来定义 MySQL Pod。
下面是一个定义 MySQL Pod 的 YAML 文件示例:
apiVersion: v1 kind: Pod metadata: name: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-pv mountPath: /var/lib/mysql volumes: - name: mysql-pv persistentVolumeClaim: claimName: mysql-pvc
这个 YAML 文件定义了一个名为 mysql 的 Pod,它使用官方的 MySQL 镜像,并将其挂载到名为 mysql-pv 的存储卷上,该存储卷与名为 mysql-pvc 的 PersistentVolumeClaim 关联。
在容器中,使用 volumeMounts 属性将 PersistentVolumeClaim 挂载到 /var/lib/mysql 目录。
完成 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: wordpress image: wordpress:latest env: - name: WORDPRESS_DB_HOST value: mysql - name: WORDPRESS_DB_USER value: root - name: WORDPRESS_DB_PASSWORD value: password - name: WORDPRESS_DB_NAME value: wordpress ports: - containerPort: 80 name: wordpress volumeMounts: - name: wp-pv mountPath: /var/www/html volumes: - name: wp-pv persistentVolumeClaim: claimName: wp-pvc
这个 YAML 文件定义了一个名为 wordpress 的 Pod,它使用官方的 WordPress 镜像,并将其挂载到名为 wp-pv 的存储卷上,该存储卷与名为 wp-pvc 的 PersistentVolumeClaim 关联。
在容器中,使用 volumeMounts 属性将 PersistentVolumeClaim 挂载到 /var/www/html 目录。
WordPress Pod 还通过环境变量设置了 MySQL 数据库的主机、用户名、密码和数据库名称。
完成 WordPress Pod 的创建之后,需要创建一个 Service,用于将 WordPress Pod 暴露给外部访问。
可以通过创建一个 YAML 文件来定义 Service。
下面是一个定义 Service 的 YAML 文件示例:
apiVersion: v1 kind: Service metadata: name: wordpress-service spec: selector: app: wordpress ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort
这个 YAML 文件定义了一个名为 wordpress-service 的 Service,它选择 app 标签为 wordpress 的 Pod,并将其暴露在端口 80 上。
在这个示例中,Service 的类型为 NodePort,这意味着它将在每个节点上暴露一个随机端口,用于外部访问。
完成以上步骤之后,可以使用 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。
以下是一个使用临时存储的详细案例介绍:
在这个案例中,将创建一个简单的 Redis 应用程序,并使用临时存储来保存应用程序的数据。
Redis 是一个流行的开源内存数据结构存储系统,它通常需要一个本地磁盘来保存持久化数据。
在 Kubernetes 中,可以使用临时存储来保存 Redis 数据库的持久化数据。可以将临时存储挂载到 Redis Pod 中,并在 Redis Pod 中启用持久化功能。
这样,即使 Redis Pod 被删除或重新启动,数据也不会丢失。
下面是在 Kubernetes 中使用临时存储来部署 Redis 应用程序的步骤:
- 创建 Redis Pod
- 创建 Service
- 部署应用程序
首先,需要创建一个 Redis Pod,并将临时存储挂载到 Redis Pod 中。可以通过创建一个 YAML 文件来定义 Redis Pod。
下面是一个定义 Redis Pod 的 YAML 文件示例:
apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: redis:6.0 command: - redis-server args: - "--appendonly yes" ports: - containerPort: 6379 name: redis volumeMounts: - name: redis-data mountPath: /data volumes: - name: redis-data emptyDir: {}
这个 YAML 文件定义了一个名为 redis 的 Pod,它使用官方的 Redis 镜像,并将其挂载到一个名为 redis-data 的临时存储卷上。
在容器中,使用 volumeMounts 属性将临时存储卷挂载到 /data 目录。
这个 Redis Pod 还启用了 Redis 的持久化功能,通过 args 属性将 "--appendonly yes" 传递给 Redis 服务器。
完成 Redis Pod 的创建之后,需要创建一个 Service,用于将 Redis Pod 暴露给外部访问。可以通过创建一个 YAML 文件来定义 Service。
下面是一个定义 Service 的 YAML 文件示例:
apiVersion: v1 kind: Service metadata: name: redis-service spec: selector: app: redis ports: - protocol: TCP port: 6379 targetPort: 6379
这个 YAML 文件定义了一个名为 redis-service 的 Service,它选择 app 标签为 redis 的 Pod,并将其暴露在端口 6379 上。
完成以上步骤之后,可以使用 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。
文章浏览阅读9.7w次。问题现象问题原因docker jenkins使用的是ubuntu的镜像,而ubuntu默认使用的是/bin/dash作为解释器,dash比bash功能少很多,不兼容source解决方案1、在jenkins的shell脚本中加上#!/bin/bash2、命令行执行:dpkg-reconfigure dash 在界面中选择no..._jenkinsfile sh中无法使用source
文章浏览阅读819次,点赞24次,收藏20次。在构建企业级Java应用时,维护数据完整性是至关重要的,而事务管理则是确保这一点的关键。Java平台通过JTS和JTA提供了事务服务,允许将操作包装在一个原子工作单元中,确保这些操作要么全部成功,要么在遇到错误时全部回滚。Spring框架通过提供编程式和声明式事务管理工具简化了这一过程。编程式事务需要在代码中显式管理事务,而声明式事务则通过配置或注解隐式管理,这有助于将事务逻辑从业务逻辑中解耦。Spring的事务管理支持ACID属性,提供了灵活的事务传播行为和隔离级别设置,以及明确的回滚规则。正确使用Spr_java如何保证数据的一致性和完整性
文章浏览阅读2.3k次。【代码】2023新版Vue2+Vue3基础入门到实战项目 学习笔记 第一天。_vue最好笔记
文章浏览阅读1.9k次。什么是指针指针是C语言是一种特殊的数据类型,可以定义指针变量,里面存储的是整数,代表的是内存编号。每个整数对应一个字节(8个二进制位),通过这种编号可以访问对应的内存,具体访问多少个字节由指针的类型决定。32位系统一个指针变量大小4字节64位系统一个指针变量大小8字节为什么使用指针从理论上讲指针可以访问任何任何位置的内存,但绝大多数的内存我们没有访问权限,因此非常容易产生段错误,建议只在合适的时候才使用指针。1、函数之间协调工作时需要共享局部变量2、使用指针可以提高传参效率,函数之间需要传递_c语言指针的注意事项
文章浏览阅读277次。本案例数据包含了用户信用卡使用记录。其中,我们关心的是信用卡是否出现逾期缴费的情况,什么样的人更容易逾期不缴,什么样的人逾期时间更长。首先,考虑因变量status(逾期状态):status=0表示按期还款;status>1分为7类,(括号内为逾期天数)为了将问题具体化,我们将status转变为两部分变量:Y1: 是否按期还款(status=0时,Y1=1;否则,Y1=0)- 1= 是- 0= 否Y2: 逾期严重程度(参考status各类的样本量,合并为4类)- 4= (91+)_定序回归案例分析
文章浏览阅读2.5k次,点赞4次,收藏39次。基于libmodbus库的Qt上位机控制伺服电机前言一、利用YZ-ACSD608测试电机1 上位机软件界面介绍2 上位机控制过程二、使用串口助手测试电机1.串口工具SSCOM三、Qt上位机与虚拟串口通讯测试四、 Qt上位机控制伺服电机总结前言是的,经过一次又一次的调试修改,今天终于可以实现简单的对伺服电机的控制。接下来,我需要对这段时间的工作做个梳理总结。一、利用YZ-ACSD608测试电机YZ-ACSD608软件是厂商给的上位机软件,一则用来调试伺服电机,二则用来设置电机运行的参数。.._驱动器上位机软件
文章浏览阅读212次。但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直接解决这个问题。发现不管什么编辑器只要将图片转换成base64后就可以直接使用(IE8及一下可能不支持),由于编辑器中添加word文档功能也只是自己用,因此可以忽略这种浏览器了。这个时候我们在编辑器中使用jsonp获取到处理完的图片数据替换原来的file:///xxxxxx.jpg路径就搞定了。所有图片都能够保存在服务器中,而且支持分布式图片存储。_复制csdn图片到word
文章浏览阅读2k次,点赞2次,收藏19次。Java打印各种形状 心形 菱形 三角形 圆形public class TestPrint { /** * 打印*号 */ public static void main(String[] args) { // 正方体 System.out.println("\n打印正方形-----------------------------\n"); for (int i = ..._java打印心形图案三个三角形
文章浏览阅读543次。C语言 打印菱形_打印菱形最短
文章浏览阅读156次。随着移动互联网的飞速发展,时代对我们知识水平的要求也越来越高了,自学能力成了出众或出局的关键,跟着这些现象也出现了各种适合自学的在线学习网站,手机APP,电脑软件,书本等等,其中用户量最多的还是不受时间,地点限制的手机端自学APP和微信里适合自学的微信小程序,原因是手机及微信已经成了我们生活中不可缺少的一部分,使我们的聊天,收付款,娱乐,获取信息,提升自己等各方面更加方便。1.运行环境:微信开发者工具,最好是java jdk 1.8,这是目前最稳定的JDK也是被使用最多的JDK版本。或者 Mac OS;_java加vue做一个小程序都需要干啥
文章浏览阅读166次。sub_msg>非法参数¥开放平台基础API必须用户授权。_淘宝店 invoice
文章浏览阅读435次。往期周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104目录1、MDK的单片机版TensorFlow软件包和神经网络内核Ethos-U驱动包上线2、Windows的文件管理Files v2发布3、武汉新芯推出超小尺寸低功耗SPI NOR Flash产品XNOR ——XM25LU128C4、STM32U5首批型号STM32U575 和 S._arm宣称,使用微神经网络内核ethos-u55配合cortex-m55,相比上一代m内核,机器学习能