当前位置: 首页 > news >正文

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 题目描述 给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序,十进制最低位相同的元素&#xf…...

【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领域的热门话题。它代表着一种全新的软件开发和部署范式,旨在充分利用云计算的优势,并为企业带来更大的灵活性、可靠性和效率。今天我们就来聊一聊这个热门的话题:云原生~ &#x1f4…...

蓝桥杯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、介绍 在机器视觉的开发中&#xff0c;现在有很多通过电机去做相机的聚焦调节&#xff0c;对比手工调节&#xff0c;自动调节效果更好&#xff0c;而且其也能满足设备自动的需求&#xff0c;尤…...

常州IGM机器人RTE497的日常维修保养方法

一、IGM机器人RTE497日常检查 每日工作前&#xff0c;进行以下检查&#xff1a; 外观检查&#xff1a;确认IGM机器人RTE497本体无明显损伤&#xff0c;各部件连接稳固。 电缆检查&#xff1a;检查所有电缆、气管等是否完好&#xff0c;无磨损、无挤压。 润滑检查&#xff1a;确…...

如何利用机器学习和Python编写预测模型来预测设备故障

预测设备故障是机器学习和数据科学的一个常见问题&#xff0c;通常可以通过以下几个步骤来解决&#xff1a; 1. 数据收集 首先&#xff0c;需要收集与设备运行相关的数据&#xff0c;包括&#xff1a; 设备的历史数据环境数据&#xff08;如温度、湿度等&#xff09;使用时间…...

mysql部署(2)主从复制

在前面的基础上&#xff0c;现有26、41两个mysql8的实例&#xff0c;下面以26为主41为从搭建主从复制&#xff1a; 机器主从端口号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];//数组时候可以正常创建&#xff1…...

springboot283图书商城管理系统

图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理…...

FFmpeg-- c++实现:音频流aac和视频流h264封装

文章目录 流程api核心代码muxer.hmuxer.cpp aac 和 h264 封装为视频流&#xff0c;封装为c的Muxter类 流程 分配视频文件上下文 int Init(const char *url); 创建流&#xff0c;赋值给视频的音频流和视频流 int AddStream(AVCodecContext *codec_ctx); 写视频流的head int Se…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...