第28讲:Ceph集群使用RBD块存储与K8S Volumes集成

news/2024/7/3 15:21:26

文章目录

    • 1.Ceph集群使用RBD块存储与K8S集成简介
    • 2.Ceph集群RBD块存储与K8S Volume集成
      • 2.1.在Ceph集群中创建K8S集群使用的块存储
      • 2.2.创建用于K8S访问Ceph RBD块设备的认证用户
      • 2.3.将认证用户的Key存储在K8S Secret资源中
      • 2.4.在K8S集群的所有节点中安装Ceph命令
      • 2.5.创建Pod资源使用Ceph集群的RBD块存储进行数据持久化
      • 2.6.查看Pod资源挂载的RBD信息

1.Ceph集群使用RBD块存储与K8S集成简介

在K8S集群中为Pod资源提供数据持久化,大致分为三种解决方案:

  • Volume
    • Volume持久化有三种类型分别是EmptyDir、HostPath、NFS。
    • Volume是K8S集群中较为简单的数据持久化方案,无需创建其他资源,直接在Pod资源编排文件中声明Volume卷,即可挂载使用。
  • PV、PVC
    • PV和PVC是一种高级类型的持久化存储费方案,PV负责与底层存储系统进行对接,PVC从PV中分配一定的资源,最后由PVC挂载到Pod中。
  • StorageClass
    • 更加高级的一种持久化存储方案,由StorageClass提供一个数据持久化资源池,当Pod需要持久化数据时,直接从StorageClass中自动创建出PV和PVC,最后挂载到Pod资源中。

无论使用哪种持久化方案,最常用的方式是通过NFS或者NAS来实现,今天通过Ceph分布式集群中的RBD块存储来实现Pod数据的持久化。

2.Ceph集群RBD块存储与K8S Volume集成

2.1.在Ceph集群中创建K8S集群使用的块存储

1.创建一个Pool资源池
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_data 16 16
pool 'kubernetes_data' created2.在资源池中创建块存储设备
[root@ceph-node-1 ~]# rbd create --image-feature layering kubernetes_data/rbd_volume_data.img --size 10G3.查看创建的块存储设备
[root@ceph-node-1 ~]# rbd -p kubernetes_data ls
rbd_volume_data.img4.查看块存储设备的信息
[root@ceph-node-1 ~]# rbd info kubernetes_data/rbd_volume_data.img
rbd image 'rbd_volume_data.img':size 10 GiB in 2560 objectsorder 22 (4 MiB objects)snapshot_count: 0id: ad8a1b33e8bblock_name_prefix: rbd_data.ad8a1b33e8bformat: 2features: layeringop_features: flags: create_timestamp: Mon Apr 11 23:00:30 2022access_timestamp: Mon Apr 11 23:00:30 2022modify_timestamp: Mon Apr 11 23:00:30 2022

2.2.创建用于K8S访问Ceph RBD块设备的认证用户

K8S想要访问Ceph中的RBD块设备,必须通过一个认证用户才可以访问,如果没有认证用户则无法访问Ceph集群中的块设备。

命令格式:ceph auth get-or-create {用户名称} mon '{访问mon的方式}' osd '{访问osd的方式}'

[root@ceph-node-1 ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes_data'
[client.kubernetes]key = AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A==

命令解释:创建了一个client.kubernetes名称的Ceph认证用户,访问mon的方式是以RBD块存储形式访问,访问OSD的方式也是以块存储RBD方式访问Pool资源池。

查看创建的认证用户。

[root@ceph-node-1 ~]# ceph auth list 

可以看到Ceph的认证用户都是以client开头,每一个用户都有对mon和osd的访问方式。

image-20220411231844008

2.3.将认证用户的Key存储在K8S Secret资源中

将认证用户的key通过Base64进行加密,存储在K8S的Secret资源中。

1)将key通过Base64进行加密

[root@ceph-node-1 ~]# echo AQBlRVRibbqzJRAAD3lacYaxRloTVTio6e+10A== | base64
QVFCbFJWUmliYnF6SlJBQUQzbGFjWWF4UmxvVFZUaW82ZSsxMEE9PQo=

2)将加密后的Key存储在Secret资源中

[root@k8s-master volumes]# vim rbd-volume-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: rbd-volume-secret
type: "kubernetes.io/rbd"
data:key: QVFCbFJWUmliYnF6SlJBQUQzbGFjWWF4UmxvVFZUaW82ZSsxMEE9PQo=

3)创建Secret资源

RBD的Secret要与Pod在同一Namespace下,如果不同的Namespace的Pod都需要使用RBD进行存储,则需要在每个Namespace下都进行创建。

[root@k8s-master volumes]# kubectl apply -f rbd-volume-secret.yaml
secret/rbd-volume-secret created[root@k8s-master volumes]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
rbd-volume-secret     kubernetes.io/rbd                     1      16s
default-token-fbknq   kubernetes.io/service-account-token   3      60d

2.4.在K8S集群的所有节点中安装Ceph命令

不安装ceph命令将无法成功挂载块设备。

[root@k8s-master ~]# yum -y install ceph-common
[root@k8s-node1 ~]# yum -y install ceph-common
[root@k8s-node2 ~]# yum -y install ceph-common

2.5.创建Pod资源使用Ceph集群的RBD块存储进行数据持久化

1)编写Pod资源使用RBD块存储的资源编排文件

[root@k8s-master volumes]# vim rbd-volumes-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: rbd-volumes-pod
spec:nodeName: k8s-node1containers:- name: rbd-volumes-podimage: nginx:1.15imagePullPolicy: IfNotPresentports:- name: webcontainerPort: 80protocol: TCPvolumeMounts:- name: rbd-volumemountPath: /datavolumes:- name: rbd-volumerbd:monitors:- 192.168.20.20:6789- 192.168.20.21:6789- 192.168.20.22:6789pool: kubernetes_dataimage: rbd_volume_data.imgfsType: ext4 user: kubernetessecretRef:name: rbd-volume-secret

2)创建Pod资源

[root@k8s-master volumes]# kubectl apply -f rbd-volumes-pod.yaml
pod/rbd-volumes-pod created[root@k8s-master ~]# kubectl get pod
[root@k8s-master volumes]# kubectl get pod
NAME              READY   STATUS              RESTARTS   AGE
rbd-volumes-pod   1/1     Running			   0          3s

2.6.查看Pod资源挂载的RBD信息

1)进入Pod中查看挂载的RBD信息

可以看到Pod成功挂载上了RBD块存储,和之前做块设备映射一样,也是将块设备映射成了一块名为/dev/rbd0的裸磁盘,然后挂载到了/data目录中。

[root@k8s-master volumes]# kubectl exec -it rbd-volumes-pod bash
root@rbd-volumes-pod:/# df -hT /data
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/rbd0      ext4  9.8G   37M  9.7G   1% /data

2)在宿主机上查看挂载的RBD信息

为什么会在Pod中看到挂载的RBD块设备映射的磁盘,其实是宿主机将块设备映射的磁盘挂载到了容器的某个路径中,这才导致在Pod里显示的是一块RBD磁盘挂载。

首先查看Pod运行在了哪个Node节点上,然后查看RBD块设备的挂载信息。

[root@k8s-node1 ~]# df -HT /dev/rbd0
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/rbd0      ext4   11G   38M   11G    1% /var/lib/kubelet/plugins/kubernetes.io/rbd/mounts/kubernetes_data-image-rbd_volume_data.img

3)当Pod资源被删除后观察NOde节点挂载的RBD状态

当Pod资源被删除后,Node节点挂载的RBD块设备自动删除。

[root@k8s-master volumes]# kubectl delete -f rbd-volumes-pod.yaml
pod "rbd-volumes-pod" deleted[root@k8s-node1 ~]# df -HT /dev/rbd0
df: "/dev/rbd0": 没有那个文件或目录

4)多个Pod同时使用一个块存储设备会有什么效果

一个块设备映射的磁盘只能被一个节点进行挂载,如果多个Pod资源分布在不同Node节点上,多个Node节点都要挂载这一个块存储映射的磁盘将会报错。

  Warning  FailedMount             5s    kubelet                  MountVolume.WaitForAttach failed for volume "rbd-volume" : rbd image kubernetes_data/rbd_volume_data.img is still being used

若是多个Pod都调度在同一个Node节点上,那么可以同时使用同一块块存储设备持久化Pod中的数据,并且也Pod可以启动成功。

[root@k8s-master volumes]# kubectl get pod -o wide
NAME              	READY   STATUS    RESTARTS   AGE     IP                NODE        NOMINATED NODE   READINESS GATES
rbd-volumes-pod   	1/1     Running   0          7m12s   100.111.156.122   k8s-node1   <none>           <none>
rbd-volumes-pod-2   1/1     Running   0          8s      100.111.156.120   k8s-node1   <none>           <none>

类似于共享存储的效果,如下图所示,都是挂载的一块块设备,任何Pod在里面写数据,其他的Pod都可以读取。

image-20220412000333362

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Linux CentOS 环境 MySQL 主从复制集群搭建

环境说明 MySQL版本8.4.0 操作系统 Linux CentOS 7.9 官网文档 https://dev.mysql.com/doc/refman/8.4/en/replication-configuration.html 以下代码片段中带分号都是在MySQL命令行( mysql -uroot -p)中执行 1. 首先在两个节点上安装数据库 参考 Linux CentOS安装MySQL8.0 …

Python | Leetcode Python题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; MX5000000 is_prime [1] * MX is_prime[0]is_prime[1]0 for i in range(2, MX):if is_prime[i]:for j in range(i * i, MX, i):#循环每次增加iis_prime[j] 0 class Solution:def countPrimes(self, n: int) -> int:return sum(is_prim…

C++11

目录 1.可变参数模板 1.1概念 1.2参数包的展开 2.stl的emplace接口 3.lambda表达式 lambda表达式形式 demo代码 4.function包装器 5.bind包装器 1.可变参数模板 1.1概念 有了可变参数模板&#xff0c;可以创建任意参数的函数模板和类模板。 template <class ...A…

【刷题】初步认识深搜(DFS)

送给大家一句话&#xff1a; 拥有希望的人&#xff0c;和漫天的星星一样&#xff0c;是永远不会孤独的。 -- 《星游记》 初步认识深搜&#xff08;DFS&#xff09; dfs算法二叉树中的深搜Leetcode 129. 求根节点到叶节点数字之和题目描述算法思路 Leetcode 814. 二叉树剪枝题…

【Mac】iTerm for mac(终端工具)软件介绍及安装教程

软件介绍 iTerm 是 macOS 上一个非常受欢迎的终端仿真器&#xff0c;提供了比默认的 Terminal 应用更多的功能和定制选项。它是一款开源软件&#xff0c;主要用于命令行界面的操作和开发者工具。 主要特点和功能&#xff1a; 分页和标签&#xff1a; iTerm 允许用户在单个窗…

show-overflow-tooltip 解决elementui el-table标签自动换行的问题

elementui中 el-table中某一行的高度不想因为宽度不够而撑开换行展示的解决方法。可通过show-overflow-tooltip属性解决&#xff0c;如下 代码是这样的 <el-table-column width"80" prop"id" label"ID"></el-table-column> <el…