K8s 分布式存储后端(K8s Distributed Storage Backend)

K8s 分布式存储后端

在 K8s 中实现分布式存储后端对于管理跨集群的持久数据、确保高可用性、可扩展性和可靠性至关重要。在 K8s 环境中,应用程序通常被容器化并跨多个节点部署。虽然 K8s 可以有效处理无状态应用程序,但有状态应用程序需要持久存储来维护数据完整性和可用性。分布式存储后端通过在集群中提供可扩展、有弹性且可访问的存储来提供解决方案,从而允许应用程序可靠地访问和存储数据。本章介绍在 K8s 中设置分布式存储后端的基本概念、优点和实际步骤。

图片

为什么分布式存储很重要

在 Kubernetes 环境中,分布式存储后端在管理有状态应用程序的数据方面发挥着至关重要的作用。无状态应用程序可以轻松扩展和管理,因为它们不维护请求之间的任何内部状态。然而,有状态的应用程序,例如数据库、内容管理系统和大数据处理应用程序,需要持久存储才能正常运行。分布式存储系统通过提供可靠且可扩展的方式来跨多个节点存储数据来满足这一需求,确保应用程序即使在遇到节点故障或扩展事件时也能保持状态。

分布式存储的好处

分布式存储提供了对现代云原生应用程序至关重要的几个关键优势:

  • 可扩展性:分布式存储系统可以通过添加更多节点来水平扩展,从而允许存储容量和性能随着应用程序的需求而增长。

  • 高可用性:数据在多个节点之间复制,确保即使某些节点出现故障,数据仍然可用。

  • 数据一致性:分布式存储确保整个集群内数据的一致性,保持完整性和可靠性。

  • 灵活性:支持各种存储类型和访问模式,支持不同的工作负载和用例。

何时使用分布式存储

分布式存储应该用在数据持久性、高可用性和可扩展性至关重要的 Kubernetes 环境中。它特别有利于:

  • 有状态应用程序:需要持久数据存储的应用程序(例如数据库和内容管理系统)受益于分布式存储的可靠性和可扩展性。

  • 大数据工作负载:需要可扩展且可靠存储的大规模数据处理应用程序可以利用分布式存储来有效处理大量数据。

  • 灾难恢复:数据冗余和故障转移功能对于业务连续性至关重要的场景可以依靠分布式存储来确保即使在发生故障时数据也保持可用和一致。

为什么分布式存储很重要

在 Kubernetes 环境中,应用程序通常被容器化并跨多个节点部署。虽然 Kubernetes 可以有效管理无状态应用程序,但有状态应用程序需要持久存储来维护数据完整性和可用性。分布式存储后端通过在集群中提供可扩展、有弹性且可访问的存储来提供解决方案,从而允许应用程序可靠地访问和存储数据。

分布式存储的好处

  • 可扩展性:分布式存储系统可以通过添加更多节点来水平扩展,从而允许存储容量和性能随着应用程序的需求而增长。

  • 高可用性:数据在多个节点之间复制,确保即使某些节点出现故障,数据仍然可用。

  • 数据一致性:分布式存储确保整个集群内数据的一致性,保持完整性和可靠性。

  • 灵活性:支持各种存储类型和访问模式,支持不同的工作负载和用例。

流行的 Kubernetes 分布式存储解决方案

多种分布式存储解决方案与 Kubernetes 无缝集成,提供强大的存储功能。一些最受欢迎的选项包括:

1. Ceph

Ceph 是一个高度可扩展的分布式存储系统,可在单一平台中提供对象、块和文件存储。它通过 Rook 操作符与 Kubernetes 很好地集成。

图片

主要特点Ceph 提供了支持对象、块和文件存储的统一存储系统。它具有高度可扩展性和弹性,能够处理 PB 级的数据。 Ceph 具有自我修复和自我管理功能,使其成为满足复杂存储需求的可靠选择。

用例:设置高可用数据库在此用例中,我们将使用 Ceph 作为后端存储来设置一个高可用的 PostgreSQL 数据库。目标是确保数据库能够处理节点故障而不丢失数据。

操作步骤:

安装 Rook Operator

首先,为 Rook 创建命名空间并部署 Rook Operator。将以下配置保存到名为rook-operator.yaml的文件中:

apiVersion: v1
kind: Namespace
metadata:name: rook-ceph
---
apiVersion: apps/v1
kind: Deployment
metadata:name: rook-ceph-operatornamespace: rook-ceph
spec:replicas: 1template:metadata:labels:app: rook-ceph-operatorspec:containers:- name: rook-ceph-operatorimage: rook/ceph:v1.5.9

应用配置:

kubectl apply -f rook-operator.yaml

部署Ceph集群

通过将以下配置保存到名为rook-cluster.yaml的文件来创建 Ceph 集群:

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:name: rook-cephnamespace: rook-ceph
spec:cephVersion:image: ceph/ceph:v15.2.4dataDirHostPath: /var/lib/rookmon:count: 3dashboard:enabled: truenetwork:hostNetwork: falsestorage:useAllNodes: trueuseAllDevices: true

应用配置:

kubectl apply -f rook-cluster.yaml

创建存储类

定义一个 StorageClass 以使用 Ceph 的 RBD 进行动态配置。将以下配置保存到名为rook-storageclass.yaml的文件中:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:clusterID: rook-cephpool: replicapoolimageFormat: "2"imageFeatures: layering
reclaimPolicy: Retain

应用配置:

kubectl apply -f rook-cluster.yaml

部署 PostgreSQL

最后,使用新创建的 StorageClass 部署 PostgreSQL 数据库。将以下配置保存到名为postgres-deployment.yaml的文件中:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: postgres-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: rook-ceph-block
---
apiVersion: apps/v1
kind: Deployment
metadata:name: postgres
spec:replicas: 1selector:matchLabels:app: postgrestemplate:metadata:labels:app: postgresspec:containers:- name: postgresimage: postgres:12env:- name: POSTGRES_PASSWORDvalue: "yourpassword"volumeMounts:- mountPath: /var/lib/postgresql/dataname: postgres-storagevolumes:- name: postgres-storagepersistentVolumeClaim:claimName: postgres-pvc

应用配置:

kubectl apply -f postgres-deployment.yaml

2.GlusterFS

GlusterFS 是一个可扩展的网络文件系统,与 Kubernetes 集成以提供持久存储。它以其简单性和易于部署而闻名。

图片

主要特点

GlusterFS 具有可扩展性和分布式性,提供高性能和简单的配置。它允许轻松添加存储节点并通过数据复制提供高可用性。

使用案例:为 Web 应用程序设置共享存储

在此用例中,我们将设置 GlusterFS 为需要跨多个副本访问相同文件的 Web 应用程序提供共享存储。

操作步骤:

安装 GlusterFS

首先,设置一个 GlusterFS 集群。在每个 GlusterFS 节点上,安装 GlusterFS 并创建 GlusterFS 卷。

sudo apt-get install glusterfs-server
sudo systemctl start glusterd
sudo gluster peer probe <other-node-ip>
sudo gluster volume create gv0 replica 2 <node1-ip>:/data/brick1/gv0 <node2-ip>:/data/brick2/gv0
sudo gluster volume start gv0

部署 GlusterFS DaemonSet

在 Kubernetes 中部署 DaemonSet 以在每个节点上挂载 GlusterFS 卷。将以下配置保存到名为glusterfs-daemonset.yaml的文件中:

apiVersion: v1
kind: PersistentVolume
metadata:name: glusterfs-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteManyglusterfs:endpoints: glusterfs-clusterpath: gv0readOnly: false
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: glusterfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 10Gi

应用配置:

kubectl apply -f glusterfs-pv-pvc.yaml

创建持久卷和持久卷声明

定义 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 以使用 GlusterFS 卷。将以下配置保存到名为glusterfs-pv-pvc.yaml的文件中:

apiVersion: apps/v1
kind: Deployment
metadata:name: webapp
spec:replicas: 3selector:matchLabels:app: webapptemplate:metadata:labels:app: webappspec:containers:- name: webappimage: nginxvolumeMounts:- mountPath: /usr/share/nginx/htmlname: webapp-storagevolumes:- name: webapp-storagepersistentVolumeClaim:claimName: glusterfs-pvc

应用配置:

kubectl apply -f webapp-deployment.yaml

部署 Web 应用程序

部署使用 GlusterFS PVC 进行共享存储的 Web 应用程序。将以下配置保存到名为webapp-deployment.yaml的文件中:

apiVersion: apps/v1
kind: Deployment
metadata:name: webapp
spec:replicas: 3selector:matchLabels:app: webapptemplate:metadata:labels:app: webappspec:containers:- name: webappimage: nginxvolumeMounts:- mountPath: /usr/share/nginx/htmlname: webapp-storagevolumes:- name: webapp-storagepersistentVolumeClaim:claimName: glusterfs-pvc

应用配置:

kubectl apply -f webapp-deployment.yaml

3. OpenEBS

OpenEBS 是 Kubernetes 原生存储解决方案,提供容器附加存储。它提供对存储的精细控制,是 DevOps 工作流程的理想选择。

图片

主要特点

OpenEBS 是 Kubernetes 原生的,提供对存储的精细控制。它支持多种存储引擎,使其灵活且适用于广泛的用例。

使用案例:设置具有持久存储的 CI/CD 管道

在此用例中,我们将设置 OpenEBS 为 Jenkins CI/CD 管道提供持久存储。这可确保跨管道运行保留构建工件和日志。

操作步骤:

安装OpenEBS

使用 Helm 安装 OpenEBS。首先,添加 OpenEBS Helm 存储库并安装 OpenEBS 图表。

helm repo add openebs https://openebs.github.io/charts
helm install openebs --namespace openebs openebs/openebs

创建存储类为 OpenEBS 定义存储类。将以下配置保存到名为openebs-storageclass.yaml的文件中:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: openebs-sc
provisioner: openebs.io/provisioner-iscsi
parameters:openebs.io/storage-pool: "default"

应用配置:

kubectl apply -f openebs-storageclass.yaml

部署Jenkins

使用 OpenEBS StorageClass 部署 Jenkins 进行持久存储。将以下配置保存到名为jenkins-deployment.yaml的文件中:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: jenkins-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 20GistorageClassName: openebs-sc
---
apiVersion: apps/v1
kind: Deployment
metadata:name: jenkins
spec:replicas: 1selector:matchLabels:app: jenkinstemplate:metadata:labels:app: jenkinsspec:containers:- name: jenkinsimage: jenkins/jenkins:ltsenv:- name: JAVA_OPTSvalue: "-Djenkins.install.runSetupWizard=false"volumeMounts:- mountPath: /var/jenkins_homename: jenkins-storagevolumes:- name: jenkins-storagepersistentVolumeClaim:claimName: jenkins-pvc

应用配置:

kubectl apply -f jenkins-deployment.yaml

实施分布式存储的最佳实践

在 Kubernetes 中实现分布式存储涉及多种最佳实践,以确保最佳性能、可扩展性和可靠性。这些实践包括选择正确的存储解决方案、优化存储配置以及持续监控和维护存储系统。

选择正确的存储解决方案

选择合适的存储后端对于满足应用程序的性能、可扩展性和可靠性要求至关重要。不同的存储解决方案提供独特的功能和优势,使其适合各种用例。

例如,Ceph 非常适合需要能够处理具有高可扩展性和弹性的对象、块和文件存储的统一存储系统的环境。 GlusterFS 适用于需要简单、高性能网络文件系统的应用程序。 OpenEBS 非常适合需要对存储进行精细控制的 Kubernetes 原生环境。

优化存储配置

微调存储设置对于优化性能至关重要。这包括调整复制因子、启用缓存机制以及配置网络设置以减少延迟并提高吞吐量。

对于Ceph,您可以调整复制因子以在性能和数据冗余之间取得平衡。增加副本数量可以增强数据可用性,但可能会影响写入性能。

调整Ceph复制因子的示例:

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:name: rook-cephnamespace: rook-ceph
spec:cephVersion:image: ceph/ceph:v15.2.4dataDirHostPath: /var/lib/rookmon:count: 3dashboard:enabled: truenetwork:hostNetwork: falsestorage:useAllNodes: trueuseAllDevices: truereplication:size: 3  # Adjust the replication factor here

对于 GlusterFS,调整卷配置有助于优化性能。例如,设置适当的块大小并启用性能选项可以提高特定工作负载的吞吐量。

调整 GlusterFS 卷配置的示例:

sudo gluster volume set gv0 performance.cache-size 256MB
sudo gluster volume set gv0 performance.write-behind on
sudo gluster volume set gv0 performance.quick-read on

监控和维护

持续监控和维护存储系统对于确保其健康和性能至关重要。使用 Prometheus 等监控工具来跟踪关键指标并及早发现问题。

对于 Ceph,您可以设置 Prometheus 来监控存储运行状况。创建一个 ServiceMonitor 以从 Ceph 管理器中抓取指标。

使用Prometheus监控Ceph的示例:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: rook-ceph-mgrnamespace: rook-ceph
spec:selector:matchLabels:app: rook-ceph-mgrendpoints:- port: http-metricsinterval: 15spath: /metrics

应用配置:

kubectl apply -f servicemonitor.yaml

对于 GlusterFS,您可以使用 Gluster Prometheus Exporter 来监控 GlusterFS 卷的运行状况。将导出器部署为 DaemonSet 以确保每个节点都受到监控。

部署 Gluster Prometheus Exporter 的示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:name: glusterfs-exporternamespace: monitoring
spec:selector:matchLabels:app: glusterfs-exportertemplate:metadata:labels:app: glusterfs-exporterspec:containers:- name: glusterfs-exporterimage: prom/glusterfs-exporterports:- containerPort: 9189name: metrics

应用配置:

kubectl apply -f glusterfs-exporter.yaml

对于 OpenEBS,使用 Prometheus Operator 监控卷和存储引擎的运行状况。为 OpenEBS 设置 ServiceMonitor。

使用Prometheus监控OpenEBS的示例:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: openebs-monitornamespace: monitoring
spec:selector:matchLabels:app: openebsendpoints:- port: http-metricsinterval: 15spath: /metrics

应用配置:

kubectl apply -f openebs-monitor.yaml

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

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

相关文章

生产环境超实用shell脚本一

生产环境超实用shell脚本一 Shell脚本作为一种强大的自动化工具&#xff0c;能够帮助运维人员轻松应对各种复杂的任务。 本文将为您介绍服务器健康检查、日志清理、备份以及监控等多个方面&#xff0c;并详细阐述每个脚本的功能和应用场景&#xff0c;助力您提升运维效率&…

IM 即时通讯系统-46-OpenIM 提供了专为开发者设计的开源即时通讯解决方案

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

spy-debugger + Charles 调试移动端/内嵌小程序H5

简介说明&#xff1a; PC端可以用F12进行console等进行调试&#xff0c;但移动端App中使用webview就无法进行实时调试&#xff0c;针对这种情况 1. 安装 全局安装 spy-debugger sudo npm install spy-debugger -g // window不用加sudo2. spy-debugger 证书 其实spy-debugg…

深度整理总结MySQL——SQL的执行顺序和流程

SQL的执行顺序和流程 SQL的执行顺序执行一条select语句,发生了什么呢连接器查询缓存解析SQL执行SQL预处理器优化器执行器 总结 SQL的执行顺序 这是一条标准的查询语句: 但实际上并不是从上到下去解析的,真实的执行顺序是: 我们先执行from,join来确定表之间的连接关系&#x…

使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用逐渐成为技术热点&#xff0c;而 DeepSeek 作为国产开…

Redis有哪些常用应用场景?

大家好&#xff0c;我是锋哥。今天分享关于【Redis有哪些常用应用场景?】面试题。希望对大家有帮助&#xff1b; Redis有哪些常用应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 是一个高性能的键值对存储数据库&#xff0c;它有许多应用场景&…

115,【7】 攻防世界 web fileinclude

进入靶场 试着访问了几个文件&#xff0c;都没得到信息&#xff0c;f12看看源码 还真有 <?php // 检查是否开启了错误显示功能 // ini_get 函数用于获取 PHP 配置选项的值&#xff0c;这里检查 display_errors 选项是否开启 if( !ini_get(display_errors) ) {// 如果错误…

SpringBoot开发(五)SpringBoot接收请求参数

1. SpringBoot接收请求参数 1.1. 获取参数的方式 &#xff08;1&#xff09;通过request对象获取参数   &#xff08;2&#xff09;RequestParam(针对请求头方式为x-www-form-ur lencoded)   &#xff08;3&#xff09;RequestBody(针对请求头方式为application/json)   …

如何理解多态,以及由此引出的抽象类和纯虚函数

文章目录 1. 多态2. 抽象类和纯虚函数 1. 多态 静态多态&#xff1a; 动态多态&#xff1a; #include <iostream> #include <string> using namespace std;// 动物的基类 class Animal { public:Animal(string name) : _name(name) {}virtual void bark() {} …

java基础2(黑马)

一、变量里的数据在计算机中的存储原理 1.二进制 .二进制&#xff1a;只有0、1&#xff0c; 按照逢二进一的方式表示数据。 十进制数字11转换为&#xff1a;1011 方法&#xff1a;除二取余法 计算机中表示数据的最小单元&#xff0c;一个字节&#xff08;Byte&#xff0c;简…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

数据结构与算法学习笔记----博弈论

# 数据结构与算法学习笔记----博弈论 author: 明月清了个风 first publish time: 2025.2.6 ps⭐️包含了博弈论中的两种问题Nim游戏和SG函数&#xff0c;一共四道例题&#xff0c;给出了具体公式的证明过程。 Acwing 891. Nim游戏 [原题链接](891. Nim游戏 - AcWing题库) 给…

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年&#xff0c;很多时候麻烦的就是整理BOM&#xff0c;因为设计原理图的时候图省事&#xff0c;可能只修改value值和封装。 但是厂家&#xff0c;规格型号&#xff0c;物料描述等属性需要在最后的时候一行一行的修改&#xff0c;繁琐又容易出错&#xff0c;过…

app专项测试(网络测试流程)

一、网络测试的一般流程 step1&#xff1a;首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2&#xff1a;其次要考虑无网络的情况 ① APP各个功能在无网络情况下是否可用 ② APP各个页面之间切换是否正常 ③ 发送网络请求时是…

RFID隧道机:提升生产流水线效率与精准度

在当今制造业飞速发展的时代&#xff0c;生产流水线的效率与精准度成为企业竞争力的关键。传统的货物管理往往依赖于人工扫描和记录&#xff0c;效率低下且易出错&#xff0c;而RFID 隧道机的出现&#xff0c;为企业带来了智能化的管理体验&#xff0c;为生产流水线带来了从人工…

NSS-DAY2

Crypto [HNCTF 2022 Week1]A dictator 题目&#xff1a; from random import randint from secret import flagoffset randint(1,100) % 26 # print(offset)assert flag.startswith(NSSCTF{) assert all([ord(c) not in range(ord(A),ord(Z)) for c in flag[7:-1]])for cha…

systemctl配置httpd服务

一、环境介绍&#xff1a; Operating SystemopenEuler 22.03 (LTS-SP2)Kernel Linux 5.10.0-153.56.0.134.oe2203sp2.x86_64httpd versionhttpd-2.4.59ip address192.168.240.12/24 二、下载需要的软件包 yum install -y gcc gcc-c make apr apr-devel apr-util-devel pcre …

Redis bitmap应用

Redis bitmap应用 需求&#xff1a;存储用户今年已签到的天数&#xff0c;如在1月3日签到&#xff0c;则存 3 。。。以此类推 每秒300次请求压力测试 1、使用数据库存储 查询代码与时间 public List<Integer> selectSignRecord(long userId, Integer year) {if (year nu…

蓝桥杯之c++入门(六)【string(practice)】

目录 练习1&#xff1a;标题统计方法1&#xff1a;一次性读取整行字符&#xff0c;然后统计方法2&#xff1a;按照单词读取小提示&#xff1a; 练习2&#xff1a;石头剪子布练习3&#xff1a;密码翻译练习4&#xff1a;文字处理软件练习5&#xff1a;单词的长度练习6&#xff1…

uniapp访问django目录中的图片和视频,2025[最新]中间件访问方式

新建中间件, middleware.py 匹配,以/cover_image/ 开头的图片 匹配以/episode_video/ 开头的视频 imageSrc: http://192.168.110.148:8000/cover_image/12345/1738760890657_mmexport1738154397386.jpg, videoSrc: http://192.168.110.148:8000/episode_video/12345/compres…