Kubernetes实战(三十一)-使用开源CEPH作为后端StorageClass
1 引言
K8S在1.13版本开始支持使用Ceph作为StorageClass。其中云原生存储Rook和开源Ceph应用都非常广泛。本文主要介绍K8S如何对接开源Ceph使用RBD卷。
K8S对接Ceph的技术栈如下图所示。K8S主要通过容器存储接口CSI和Ceph进行交互。
Ceph官方文档:Block Devices and Kubernetes — Ceph Documentation

CSI的官方地址:GitHub - ceph/ceph-csi at release-v3.9
在部署CSI前需要确认好部署的CSI版本,在CSI的官网,可以看到CSI版本与K8S之间的对应关系。

CSI与Ceph之间的对应关系参考:GitHub - ceph/ceph-csi: CSI driver for Ceph
作者环境的K8S版本为1.24,Ceph版本为14,因此使用3.5.1版本的CSI。以下是部署过程。
2 Ceph侧资源创建
[root@ceph-1 ~]# ceph osd pool create k8s 64 64 ##创建k8s存储池
pool 'k8s' created
[root@ceph-1 ~]# ceph auth get-or-create client.k8s mon 'profile rbd' osd 'profile rbd pool=k8s' mgr 'profile rbd pool=k8s' ##新建一个ceph用户,用户名和key后续需要使用到
[client.k8s]key = AQBClIVj8usBLxAAxTl0DwZCz9prNRRRI9Bl5A==
[root@ceph-1 ~]# ceph -s |grep id ##查看ceph 的fsidid: 395b7a30-eb33-460d-8e38-524fc48c58cb
[root@ceph-1 ~]# ceph mon stat #查看ceph的mon服务ip,我们主要采用v1版本的ip和端口
e3: 3 mons at {
ceph-1=[v2:10.0.245.192:3300/0,v1:10.0.245.192:6789/0],
ceph-2=[v2:10.0.138.175:3300/0,v1:10.0.138.175:6789/0],
ceph-3=[v2:10.0.28.226:3300/0,v1:10.0.28.226:6789/0]},
election epoch 1112, leader 0 ceph-1, quorum 0,1,2 ceph-1,ceph-2,ceph-3
3 ceph-csi部署环境准备
主要步骤为下载官方csi部署文件,创建csi需要使用到的configmap及sa、secret。使用到的文件均位于ceph-csi/deploy/rbd/kubernetes/ 目录下,同时会新建以下三个文件用于保存ceph相关配置
- csi-kms-config-map.yaml
- ceph-config-map.yaml
- csi-rbd-secret.yaml
[root@k8s-master02 ~]# wget https://github.com/ceph/ceph-csi/archive/refs/tags/v3.5.1.tar.gz ##本次实验ceph版本为14,使用3.5.1版本有较好的兼容性
[root@k8s-master02 ~]# tar xvf v3.5.1.tar.gz
[root@k8s-master02 ~]# mv ceph-csi-3.5.1 ceph-csi
[root@k8s-master02 ~]# cd /root/ceph-csi/deploy/rbd/kubernetes/
[root@k8s-master02 kubernetes]# cat csi-config-map.yaml ##编辑config-map文件
#
# /!\ DO NOT MODIFY THIS FILE
#
# This file has been automatically generated by Ceph-CSI yamlgen.
# The source for the contents can be found in the api/deploy directory, make
# your modifications there.
#
---
apiVersion: v1
kind: ConfigMap
metadata:name: "ceph-csi-config"
data:config.json: |-[{"clusterID": "395b7a30-eb33-460d-8e38-524fc48c58cb", #ceph -s输出的id"monitors": ["10.0.245.192:6789", ##三个mon服务的ip地址"10.0.138.175:6789","10.0.28.226:6789"]}]
[root@k8s-master02 kubernetes]# kubectl create ns ceph-csi ##创建namespace
namespace/ceph-csi created
[root@k8s-master02 kubernetes]# kubectl -n ceph-csi create -f csi-config-map.yaml
configmap/ceph-csi-config created
[root@k8s-master02 kubernetes]# cat csi-kms-config-map.yaml ##新建kms-config文件
---
apiVersion: v1
kind: ConfigMap
data:config.json: |-{}
metadata:name: ceph-csi-encryption-kms-config
[root@k8s-master02 kubernetes]# kubectl create -n ceph-csi -f csi-kms-config-map.yaml
configmap/ceph-csi-encryption-kms-config created
[root@k8s-master02 kubernetes]# cat ceph-config-map.yaml ##新建一个ceph-config文件,ceph.conf中的内容与ceph集群中/etc/ceph/ceph.conf的内容保持一致
---
apiVersion: v1
kind: ConfigMap
data:ceph.conf: |[global]fsid = 395b7a30-eb33-460d-8e38-524fc48c58cbpublic_network = 10.0.0.0/16cluster_network = 10.0.0.0/16mon_initial_members = ceph-1mon_host = 10.0.245.192auth_cluster_required = cephxauth_service_required = cephxauth_client_required = cephxmon_allow_pool_delete = trueauth_allow_insecure_global_id_reclaim = falserbd_default_format = 2# keyring is a required key and its value should be emptykeyring: |
metadata:name: ceph-config
[root@k8s-master02 kubernetes]# kubectl -n ceph-csi create -f ceph-config-map.yaml
configmap/ceph-config created
[root@k8s-master02 kubernetes]# cat csi-rbd-secret.yaml ##新建一个secret文件
apiVersion: v1
kind: Secret
metadata:name: csi-rbd-secretnamespace: ceph-csi
stringData:userID: k8s ##ceph集群上创建额用户userKey: AQBClIVj8usBLxAAxTl0DwZCz9prNRRRI9Bl5A== ##用户的key
[root@k8s-master02 kubernetes]# kubectl create -f csi-rbd-secret.yaml
secret/csi-rbd-secret created
[root@k8s-master02 ~]# sed -i "s/namespace: default/namespace: ceph-csi/g" $(grep -rl "namespace: default" ./) #将所有yaml文件的namespace从default改成ceph-csi
[root@k8s-master02 kubernetes]# cat csi-provisioner-rbac.yaml ##检查配置文件中namespace是否更改成功
---
apiVersion: v1
kind: ServiceAccount
metadata:name: rbd-csi-provisioner# replace with non-default namespace namenamespace: ceph-csi ---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: rbd-external-provisioner-runner##创建rbac权限
[root@k8s-master02 kubernetes]# kubectl create -f csi-provisioner-rbac.yaml
serviceaccount/rbd-csi-provisioner created
clusterrole.rbac.authorization.k8s.io/rbd-external-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role created
role.rbac.authorization.k8s.io/rbd-external-provisioner-cfg created
rolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role-cfg created
[root@k8s-master02 kubernetes]# kubectl create -f csi-nodeplugin-rbac.yaml
serviceaccount/rbd-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/rbd-csi-nodeplugin created
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-nodeplugin created
4 部署ceph-csi相关容器
yaml中的镜像源需要替换,否则部署时镜像可能下载不成功。如果部署其他版本的csi,可以自己设置通过阿里云容器镜像服务托管下载http://k8s.gcr.io中相关csi版本的镜像。
[root@k8s-master02 kubernetes]# sed -i 's#k8s.gcr.io/sig-storage/#registry.cn-shanghai.aliyuncs.com/singless/#' csi-rbdplugin* ##替换yaml里的镜像源
[root@k8s-master02 kubernetes]# kubectl -n ceph-csi create -f csi-rbdplugin-provisioner.yaml ##部署sidecar容器,yaml文件里的所有镜像地址修改为registry.cn-shanghai.aliyuncs.com/singless/
service/csi-rbdplugin-provisioner created
deployment.apps/csi-rbdplugin-provisioner created
[root@k8s-master02 kubernetes]# kubectl -n ceph-csi create -f csi-rbdplugin.yaml ##部署RBD CSI driver容器
daemonset.apps/csi-rbdplugin created
service/csi-metrics-rbdplugin created
[root@k8s-master02 kubernetes]# kubectl get pod -n ceph-csi ##检查pod是否都已启动
NAME READY STATUS RESTARTS AGE
csi-rbdplugin-8s6cf 3/3 Running 0 60m
csi-rbdplugin-g74qd 3/3 Running 0 60m
csi-rbdplugin-provisioner-56d6d755c7-jhcwl 7/7 Running 0 14m
csi-rbdplugin-provisioner-56d6d755c7-lz2zf 7/7 Running 0 14m
csi-rbdplugin-provisioner-56d6d755c7-pxw7q 7/7 Running 0 14m
csi-rbdplugin-twjdh 3/3 Running 0 60m
csi-rbdplugin-v529x 3/3 Running 0 60m
csi-rbdplugin-wgh5c 3/3 Running 0 60m
5 创建StorageClass
[root@k8s-master02 kubernetes]# cat storageclass.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:clusterID: 395b7a30-eb33-460d-8e38-524fc48c58cb ##ceph集群IDpool: k8s ##ceph集群的pool名imageFeatures: layering ##定义创建的rbd featurescsi.storage.k8s.io/provisioner-secret-name: csi-rbd-secretcsi.storage.k8s.io/provisioner-secret-namespace: ceph-csicsi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secretcsi.storage.k8s.io/controller-expand-secret-namespace: ceph-csicsi.storage.k8s.io/node-stage-secret-name: csi-rbd-secretcsi.storage.k8s.io/node-stage-secret-namespace: ceph-csicsi.storage.k8s/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:- discard
[root@k8s-master02 kubernetes]# kubectl create -f storageclass.yaml
storageclass.storage.k8s.io/csi-rbd-sc created
6 创建PV
[root@k8s-master02 kubernetes]# cd /root/ceph-csi/examples/rbd/
[root@k8s-master02 rbd]# kubectl create -f pvc.yaml
persistentvolumeclaim/rbd-pvc created
本文主要介绍K8S对接Ceph使用RBD块的方法,对象存储或文件存储可以参考官方文档进行对接。
相关文章:
Kubernetes实战(三十一)-使用开源CEPH作为后端StorageClass
1 引言 K8S在1.13版本开始支持使用Ceph作为StorageClass。其中云原生存储Rook和开源Ceph应用都非常广泛。本文主要介绍K8S如何对接开源Ceph使用RBD卷。 K8S对接Ceph的技术栈如下图所示。K8S主要通过容器存储接口CSI和Ceph进行交互。 Ceph官方文档:Block Devices a…...
【Python爬虫】详解BeautifulSoup()及其方法
文章目录 🍔准备工作🌹BeautifulSoup()⭐代码实现✨打印标签里面的内容✨快速拿到一个标签里的属性✨打印整个文档🎆获取特定标签的特定内容 🌹查找标签🎈在文档查找标签 find_all🎈正则表达式搜索 &#x…...
C语言经典算法-8
文章目录 其他经典例题跳转链接41.基数排序法42.循序搜寻法(使用卫兵)43.二分搜寻法(搜寻原则的代表)44.插补搜寻法45.费氏搜寻法 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠…...
Panasonic松下PLC如何数据采集?如何实现快速接入IIOT云平台?
在工业自动化领域,数据采集与远程控制是提升生产效率、优化资源配置的关键环节。对于使用Panasonic松下PLC的用户来说,如何实现高效、稳定的数据采集,并快速接入IIOT云平台,是摆在他们面前的重要课题。HiWoo Box工业物联网关以其强…...
高性能 MySQL 第四版(GPT 重译)(四)
第十一章:扩展 MySQL 在个人项目中运行 MySQL,甚至在年轻公司中运行 MySQL,与在市��已经建立并且“呈现指数增长”业务中运行 MySQL 大不相同。在高速业务环境中,流量可能每年增长数倍,环境变得…...
整型数组按个位值排序 - 华为OD统一考试(C卷)
OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序,十进制最低位相同的元素…...
【React】Diff算法
1. React15 Diff算法(递归进行) 一句话概括:新虚拟DOM和旧虚拟DOM对比,找出差异,根据差异更新真实DOM Diff过程描述: 1. 树比较(DOM) 同层节点之间相互比较,不会跨层级比较。(当发现…...
【物联网】Modbus 协议及应用
Modbus 协议简介 QingHub设计器在设计物联网数据采集时不可避免的需要针对Modbus协议的设备做相关数据采集,这里就我们的实际项目经验分享Modbus协议 简介 Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太…...
Docker容器引擎
1、Docker是什么。 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的"虚拟机"。Docker的logo设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可以看作宿主机,而集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应…...
2.28线程
注意被抢占时是返回原队列,优先级不变。越往下优先级越小。往下没有优先级时,在最低的优先级队列里循环 到达了不一定会被服务,会进入就绪态进行等待 。核心等式就是周转时间运行时间等待时间,带权就是周转/运行, 随着…...
TCP/IP ⽹络模型
TCP/IP ⽹络模型 对于同⼀台设备上的进程间通信,有很多种⽅式,⽐如有管道、消息队列、共享内存、信号等⽅式,⽽对于不同设备上的进程间通信,就需要⽹络通信,⽽设备是多样性的,所以要兼容多种多样的设备&am…...
云原生:重塑未来应用的基石
随着数字化时代的不断深入,云原生已经成为了IT领域的热门话题。它代表着一种全新的软件开发和部署范式,旨在充分利用云计算的优势,并为企业带来更大的灵活性、可靠性和效率。今天我们就来聊一聊这个热门的话题:云原生~ Ǵ…...
蓝桥杯day4刷题日记
P8605 [蓝桥杯 2013 国 AC] 网络寻路 思路来源于https://www.luogu.com.cn/article/iat8irsf #include <iostream> using namespace std; int n,m; int q[10010]; int v[100010],u[100010]; long long res;int main() {cin>>n>>m;for(int i0;i<m;i){cin…...
[Qt学习笔记]Qt下使用Halcon实现采图时自动对焦的功能(Brenner梯度法)
目录 1、介绍2、实现方法2.1 算法实现过程2.2 模拟采集流程 3、总结4、代码展示 1、介绍 在机器视觉的开发中,现在有很多通过电机去做相机的聚焦调节,对比手工调节,自动调节效果更好,而且其也能满足设备自动的需求,尤…...
常州IGM机器人RTE497的日常维修保养方法
一、IGM机器人RTE497日常检查 每日工作前,进行以下检查: 外观检查:确认IGM机器人RTE497本体无明显损伤,各部件连接稳固。 电缆检查:检查所有电缆、气管等是否完好,无磨损、无挤压。 润滑检查:确…...
如何利用机器学习和Python编写预测模型来预测设备故障
预测设备故障是机器学习和数据科学的一个常见问题,通常可以通过以下几个步骤来解决: 1. 数据收集 首先,需要收集与设备运行相关的数据,包括: 设备的历史数据环境数据(如温度、湿度等)使用时间…...
mysql部署(2)主从复制
在前面的基础上,现有26、41两个mysql8的实例,下面以26为主41为从搭建主从复制: 机器主从端口号root密码主从复制账号密码xxx.xx.xxx.26主3306Mysql#26user1/user1#26xxx.xx.xxx.41从3306Mysql#41 一、master主库配置 1、修改mysql配置文件…...
FX-数组的使用
1一维数组 1.1一维数组的创建和初始化 1.1.1数组的创建 //代码1 int arr1[10]; char arr2[10]; float arr3[1]; double arr4[20]; //代码2 //用宏定义的方式 #define X 3 int arr5[X]; //代码3 //错误使用 int count 10; int arr6[count];//数组时候可以正常创建࿱…...
springboot283图书商城管理系统
图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理…...
FFmpeg-- c++实现:音频流aac和视频流h264封装
文章目录 流程api核心代码muxer.hmuxer.cpp aac 和 h264 封装为视频流,封装为c的Muxter类 流程 分配视频文件上下文 int Init(const char *url); 创建流,赋值给视频的音频流和视频流 int AddStream(AVCodecContext *codec_ctx); 写视频流的head int Se…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
