01-第14章 k8s 对接 ceph 实现持久化存储
本章所讲内容:
14.1 Ceph 概述 14.2 初始化实验环境 14.3 安装 ceph 集群 14.4 测试 k8s 挂载 ceph rbd 14.5 基于 ceph rbd 生成 pv 14.6 k8s 挂载 cephfs
14.1 Ceph 基本介绍
14.1.1 Ceph 介绍
ceph 官方文档 http://docs.ceph.org.cn/
ceph 中文开源社区 http://ceph.org.cn/
Ceph 是一个开源的分布式存储系统,提供高性能、可扩展性和可靠性的存储解决方案。
以下是 Ceph 的一些基本介绍:
- 分布式架构:Ceph 采用分布式架构,将数据分散存储在多个节点上。它将数据划分为多个对象,并使用对象存储的方式进行存储和访问。这种架构使得 Ceph 能够在大规模存储集群中实现高吞吐量和低延迟。
- 可扩展性:Ceph 的设计目标之一是可扩展性。它可以轻松地扩展到数百甚至数千台服务器,以满足不断增长的存储需求。通过添加新的节点,存储容量和吞吐量可以线性扩展,而无需中断现有的数据访问。
- 自我修复和数据冗余:Ceph 使用复制和纠删码等机制来实现数据冗余和容错性。它可以自动检测和修复数据损坏或节点故障导致的数据丢失。数据冗余可以在不同的节点之间进行复制,以确保数据的可靠性和高可用性。
- 统一存储:Ceph 提供了多种存储接口,包括块存储、文件系统和对象存储。它可以提供块级存储设备 (类似于传统的硬盘),也可以提供可挂载的分布式文件系统(如 CephFS),还可以提供 S3 和 Swift 兼容的对象存储接口。
- 弹性和灵活性:Ceph 支持动态扩容、缩容和重新平衡,使得存储集群能够根据需求自动调整和适应变化的工作负载。它还提供了多种配置选项和策略,以满足不同应用场景和性能要求。
总的来说,Ceph 是一个强大的开源分布式存储系统,具有高性能、可扩展性、可靠性和灵活性的特点。它可以应用于各种存储需求,包括大规模的对象存储、分布式文件系统和块存储设备。通过 Ceph, 用户可以构建可靠、高性能的存储基础设施,满足不断增长的数据存储和访问需求。
14.1.2 Ceph 各组件介绍
Ceph 由多个组件组成,每个组件承担不同的角色和功能。
以下是 Ceph 的主要组件的介绍:
- Ceph Monitor(监视器):Ceph Monitor 负责管理 Ceph 集群的状态和拓扑信息。它监控集群中各个节点的健康状态、数据分布和数据复制情况,并维护监视器集群的一致性。监视器还提供了一个集群管理的 API 和图形界面。
- Ceph OSD(对象存储守护进程):Ceph OSD 负责实际存储数据的节点。每个 OSD 在物理机或虚拟机上运行,负责管理存储设备、处理数据的读写请求,并在节点间复制和恢复数据。多个 OSD 构成了一个分布式存储集群。
- Ceph RADOS(可靠自动分布式对象存储):Ceph RADOS 是 Ceph 的核心组件,提供了对象存储的功能。它将数据划分为小块对象,使用分布式算法将这些对象存储在多个 OSD 上,以实现数据的冗余和容错性。RADOS 还负责数据的分片、分布和复制。
- Ceph Metadata Server(元数据服务器):Ceph Metadata Server 提供了 Ceph 文件系统 (CephFS)的元数据服务。它负责管理文件系统的目录结构、文件属性和权限等元数据信息。元数据服务器使用 Ceph RADOS 作为后端存储,可以提供高性能和可扩展的分布式文件系统服务。
- Ceph RadosGW(Rados 网关):Ceph RadosGW 是 Ceph 的对象存储网关,提供了 S3 和 Swift 兼容的对象存储接口。它使得用户可以通过标准的对象存储 API 访问 Ceph 集群,并可以与各种应用程序和服务集成,如 Web 应用程序、云存储客户端等。
这些组件共同协作,构成了 Ceph 的分布式存储体系结构。监视器提供集群管理和状态监控,OSD 负责实际存储和数据管理,RADOS 提供对象存储功能,元数据服务器支持 Ceph 文件系统,而 Rados 网关提供了对象存储接口。这种分布式架构使得 Ceph 能够提供高性能、可靠性和可扩展性的存储服务。
ceph 存储唯一的缺点就是当出现其中一个 osd 故障盘就出现慢请求,需要人工干预踢盘,out 出集群, 也会影响到 k8s 的集群卡顿,对读写性能高的建议用专业的 SAN 存储好。
14.2 初始化实验环境
机器配置:
Centos7.9
准备三台机器,每台机器需要三个硬盘,配置 2GiB/4vCPU/60G
master1-admin 是管理节点 :192.168.2.100
node1-monitor 是监控节点:192.168.2.101
node2-osd 是对象存储节点:192.168.1.202
14.2.1 配置静态 IP
把虚拟机或者物理机配置成静态 ip 地址,这样机器重新启动后 ip 地址也不会发生改变。以master1-admin 主机为例,修改静态 IP:
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.2.100
NETMASK=255.255.255.0
GATEWAY=192.168.2.199
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@localhost ~]# systemctl restart network
14.2.2 配置主机名
在 192.168.2.100 上执行如下:
在 192.168.2.101 上执行如下:
在 192.168.2.102 上执行如下:
14.2.3 配置 hosts 文件
修改 master1-admin、node1-monitor、node2-osd 机器的/etc/hosts 文件,增加如下三行:
14.2.4 配置互信
生成 ssh 密钥对
$ ssh-keygen -t rsa -b 2048
$ ssh-copy-id master1-admin
$ ssh-copy-id node1-monitor
$ ssh-copy-id node2-osd
14.2.5 关闭防火墙
$ systemctl stop firewalld ; systemctl disable firewalld
$ systemctl stop firewalld ; systemctl disable firewalld
$ systemctl stop firewalld ; systemctl disable firewalld
14.2.6 关闭 selinux
临时关闭setenforce 0
永久关闭
注意:修改 selinux 配置文件之后,重启机器,selinux 才能永久生效
14.2.7 时间同步
14.2.8 配置 Ceph 安装源
注意:若有局域网yum,可自行配置局域网yum源
配置在线 ceph 源,在线安装
[root@master1-admin ~]# vim /etc/yum.repos.d/ceph-yum.repo
[ceph]
name=ceph
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
gpgcheck=0
priority=1
enable=1
[ceph-noarch]
name=cephnoarch
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/
gpgcheck=0
priority=1
enable=1
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS/
gpgcheck=0
priority=1
enable=1
通过 scp 将 repo 文件传输到 ceph 各个节点 ,以及 K8S 各个节点
在线安装必须安装 epel 源
[root@master1-admin ~]# yum install -y epel-release
[root@node1-monitor ~]# yum install -y epel-release
[root@node2-osd ~]# yum install -y epel-release
[root@xuegod63 ~]# yum install -y epel-release
[root@xuegod64 ~]# yum install -y epel-release
14.3 安装 ceph 集群
14.3.1 安装 ceph-deploy
在 master1-admin 节点安装 ceph-deploy
在 master1-admin、node1-monitor 和 node2-osd 节点安装 ceph
[root@master1-admin ~]# yum -y install ceph ceph-radosgw
[root@node1-monitor ~]# yum -y install ceph ceph-radosgw
[root@node2-osd ~]# yum -y install ceph ceph-radosgw
[root@k8s-master01 ~]# yum -y install ceph ceph-radosgw
[root@k8s-node01 ~]# yum -y install ceph ceph-radosgw
[root@k8s-node02 ~]# yum -y install ceph ceph-radosgw
[root@master1-admin ~]# ceph --version
ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)
14.3.2 创建 monitor 节点
创建一个目录,用于保存 ceph-deploy 生成的配置文件信息的
[root@master1-admin ceph ~]# cd /etc/ceph
$ ceph-deploy new master1-admin node1-monitor node2-osd
$ ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring rbdmap
生成了如上配置文件
Ceph 配置文件、日志文件、keyring 是在增加 mon 的时候,mon 之间加密会用到
备注:ceph-deploy new 后面接的是要初始化成 monitor 的节点
14.3.3 安装 monitor 服务
1、修改 ceph 配置文件
把 ceph.conf 配置文件里的默认副本数从 3 改成 2。把 osd_pool_default_size = 2 加入[global]段,这样只有 2 个 osd 也能达到 active+clean 状态:
[root@master1-admin ~]# vim /etc/ceph/ceph.conf
[root@master1-admin ~]# cat /etc/ceph/ceph.conf
[global]
fsid = fad9be30-d019-4519-9982-9ddfafc0995d
mon_initial_members = master1-admin, node1-monitor, node2-osd
mon_host = 192.168.2.100,192.168.2.101,192.168.2.102
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
filestore_xattr_use_omap = true
osd_pool_default_size = 2
mon_clock_drift_allowed = 0.500
备注,上述配置参数解释说明:
- fsid:这是 Ceph 集群的唯一标识符,用于识别特定的 Ceph 集群。
- mon_initial_members:这是指定初始监视器节点的列表。监视器节点用于管理 Ceph 集群的状态和拓扑信息。
- mon_host:这是指定监视器节点的 IP 地址或主机名列表。它定义了监视器节点之间进行通信的网络地址。
- auth_cluster_required:这是指定 Ceph 集群中的各个组件之间进行身份验证所需的安全机制。在这种情况下,cephx 表示使用 Ceph 提供的基于令牌的身份验证机制。
- auth_service_required:这是指定在 Ceph 服务之间进行身份验证所需的安全机制。
- auth_client_required:这是指定 Ceph 客户端与Ceph 集群进行身份验证所需的安全机制。
- filestore_xattr_use_omap:这是用于配置 Ceph 对象存储守护进程(OSD)是否使用 OMAP 作为存储对象的扩展属性(extended attribute)的机制。当设置为 true 时,Ceph 将使用 OMAP 来存储扩展属性。OMAP 是 Ceph 中用于存储对象的扩展属性的有序映射数据结构。它提供了一种有效的方式来存储和检索与对象相关的元数据,同时支持按键排序和范围查询
- osd_pool_default_size:这是指定创建新存储池时的默认副本数量(数据冗余级别)。在这种情况下, osd_pool_default_size 设置为 2,表示每个对象将有两个副本
- mon_clock_drift_allowed:这是指定监视器节点之间允许的最大时钟偏差量。时钟偏差超过此阈值可能导致监视器之间的通信问题。
2、安装 monitor、收集所有的密钥
[root@master1-admin]# cd /etc/ceph
[root@master1-admin]# ceph-deploy mon create-initial
[root@master1-admin]# ls *.keyring
ceph.bootstrap-mds.keyring ceph.bootstrap-rgw.keyring
ceph.bootstrap-mgr.keyring ceph.client.admin.keyring
ceph.bootstrap-osd.keyring ceph.mon.keyring
备注,上述密钥文件解释说明:
- ceph.bootstrap-mds.keyring:这个文件包含了用于引导(bootstrap) MDS(Metadata Server)的密钥。MDS 是 Ceph 文件系统(CephFS)的一部分,负责管理文件系统的元数据和文件访问控制。
- ceph.bootstrap-mgr.keyring:这个文件包含了用于引导(bootstrap) Mgr(Manager)的密钥。Mgr 是 Ceph 的管理器组件,负责收集集群的监控数据和提供集群状态信息的查询接口。
- ceph.bootstrap-osd.keyring:这个文件包含了用于引导(bootstrap) OSD(Object Storage Daemon)的密钥。OSD 是 Ceph 存储集群中的存储守护进程,负责存储和管理对象数据。
- ceph.bootstrap-rgw.keyring:这个文件包含了用于引导(bootstrap) RGW(RADOS Gateway)的密钥。RGW 是 Ceph 的对象存储接口,提供与 S3 和 Swift 兼容的对象存储服务。
- ceph.client.admin.keyring:这个文件包含了用于 Ceph 管理员客户端的密钥。它是用于管理整个Ceph 集群的访问权限,可以执行各种集群管理操作。
- ceph.mon.keyring:这个文件包含了用于引导(bootstrap)和管理监视器(monitors)之间通信的密钥。监视器负责管理集群的状态和拓扑信息。
这些密钥文件在 Ceph 集群的启动和管理过程中起着关键的作用。它们用于引导和授权不同的组 件,确保安全的集群通信和访问控制。对这些文件的保护和安全性非常重要,只有授权的用户才能访问和使用它们。
14.3.4 部署 osd 服务
使用 ceph-deploy 工具在Ceph 集群每个节点上创建一个 OSD(对象存储设备)。这将把/dev/sdb 设备分配为一个存储设备,并将其用作 Ceph 集群中的一个 OSD。OSD(Object Storage Device)负责存储 Ceph 集群中的对象数据。
[root@ master1-admin ceph]# cd /etc/ceph/
[root@ master1-admin ceph]# ceph-deploy osd create --data /dev/sdb master1-admin
[root@ master1-admin ceph]# ceph-deploy osd create --data /dev/sdb node1-monitor
[root@ master1-admin ceph]# ceph-deploy osd create --data /dev/sdb node2-osd
查看状态:
要使用 Ceph 文件系统,你的Ceph 的存储集群里至少需要存在一个 Ceph 的元数据服务器(mds)。
14.3.5 创建 ceph 文件系统
1、创建 mds
2、查看 ceph 当前文件系统
使用 ceph fs ls 命令来检查 Ceph 当前是否存在文件系统。
如果输出为"No filesystems enabled",表示当前没有启用的文件系统
3、创建存储池
使用 ceph osd pool create 命令创建两个存储池:一个用于数据(data),另一个用于元数(metadata)。示例命令如下:
[root@ master1-admin ceph]# ceph osd pool create cephfs_data 8
[root@ master1-admin ceph]# ceph osd pool create cephfs_metadata 8
这将创建名为 cephfs_data 和 cephfs_metadata 的存储池,并且每个存储池将有 8 个 pg(Placement Group)。
注意事项:对于 cephfs_metadata 存储池,建议设置较高级别的副本级别,因为元数据的损坏可能导致整个文件系统无法使用。建议在元数据存储池中使用低延迟的存储介质,例如 SSD,以提高客户端的响应速度。
以下是一些常见的低延迟存储介质:
- 固态硬盘(Solid State Drives,SSD):SSD 相对于传统的机械硬盘具有更低的访问延迟,因为它们使用了闪存存储而不是机械部件。SSD 在随机读写操作中通常具有更好的性能,并且对于元数据存储等需要快速访问的应用非常适用。
- NVMe(Non-Volatile Memory Express):NVMe 是一种基于 PCIe(Peripheral Component Interconnect Express)总线的高性能存储协议。它可以提供比传统的 SATA 或 SAS 接口更低的延迟和更高的带宽,适用于需要极高性能和低延迟的应用。
- 原生闪存(Native Flash):原生闪存是指直接使用闪存芯片而不是通过传统的块设备接口(如 SATA 或 SAS)访问闪存。原生闪存提供更低的访问延迟和更高的吞吐量,适用于需要极高性能的应用。
- 光纤通道(Fibre Channel):光纤通道是一种用于连接存储设备的高速网络技术。它可以提供低延迟和高带宽,并广泛应用于企业级存储系统中。
- 内存(RAM):内存作为最快的存储介质之一,具有非常低的访问延迟。在一些高性能计算(HPC)和缓存应用中,使用内存作为存储介质可以实现极低的延迟和高吞吐量。
创建存储池的命令参数解释说明:
确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值: 少于 5 个 OSD 时可把 pg_num 设置为 128 OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512 OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096 OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值 *自己计算 pg_num 取值时可借助 pgcalc 工具 随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。
4、创建文件系统
创建好存储池后,就可以用 fs new 命令创建文件系统了
这将创建一个名为 yq 的文件系统,其中 cephfs_metadata 是元数据池,cephfs_data 是数据池。
[root@ master1-admin ceph]# ceph fs ls
name: yq, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@ master1-admin ceph]# ceph mds stat
yq:1 {0=master1-admin=up:active} 2 up:standby
显示结果如上:
active 是活跃的,另 1 个是处于热备份的状态
使用 ceph fs ls 命令可以查看创建后的 Ceph 文件系统
使用 ceph mds stat 命令可以查看MDS 节点的状态。
14.3.6 部署 mgr
安装 mgr 用于后面我们配置dashboard 监控,而且避免挂载 ceph 时可能会提示 warring 信息。
查看集群状态正常
[root@ master1-admin ceph]# ceph -s
cluster:
id: fad9be30-d019-4519-9982-9ddfafc0995d
health: HEALTH_OK
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum master1-admin,node1-monitor,node2-osd (age 19m)
mgr: master1-admin(active, since 2m), standbys: node2-osd, node1-monitor
mds: yq:1 {0=master1-admin=up:active} 2 up:standby
osd: 3 osds: 3 up (since 14m), 3 in (since 14m)
data:
pools: 2 pools, 16 pgs
objects: 22 objects, 2.7 KiB
usage: 3.0 GiB used, 177 GiB / 180 GiB avail
pgs: 16 active+clean
查看 ceph 守护进程
[root@master1-admin ~]# systemctl status ceph-osd.target
[root@master1-admin ~]# systemctl status ceph-mon.target
注意:如果 ceph -s 看到警告:
cluster 84469565-5d11-4aeb-88bd-204dc25b2d50
health HEALTH_WARN
too many PGs per OSD (320 > max 300)
互动 1:警告什么意思?
问题原是集群 osd 数量较少,测试过程中建立了大量的 pool,每个 pool 都要用一些 pg_num 和 pgs
解决办法如下:
1、修改 node1-monitor 节点 ceph 的配置文件 ceph.conf
最后一行增加如下内容:
2、重启 monitor 进程
[root@node1-monitor ~]# systemctl restart ceph-mon.target
[root@master1-admin ~]# systemctl restart ceph-mon.target
[root@node2-osd ~]# systemctl restart ceph-mon.target
3、再测试 ceph -s
[root@master1-admin ~]# ceph -s
cluster 84469565-5d11-4aeb-88bd-204dc25b2d50
health HEALTH_OK
monmap e1: 1 mons at {node1-monitor=192.168.1.201:6789/0}
election epoch 4, quorum 0 node1-monitor
osdmap e9: 1 osds: 1 up, 1 in
flags sortbitwise,require_jewel_osds
pgmap v107: 320 pgs, 2 pools, 16 bytes data, 3 objects
7371 MB used, 43803 MB / 51175 MB avail
320 active+clean
14.4 测试 k8s 挂载 ceph rbd
1、需要有一套 k8s 环境
[root@k8s-master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 28d v1.23.0
k8s-node01 Ready work 7d12h v1.23.0
k8s-node02 Ready work 7d12h v1.23.1
kubernetes 要想使用 ceph,需要在 k8s 的每个 node 节点安装 ceph-common
将 master1-admin 中 /etc/ceph/ 目录中所有的文件传输到K8S所有节点中
$ scp -r /etc/ceph/* 192.168.2.201:/etc/ceph/
$ scp -r /etc/ceph/* 192.168.2.201:/etc/ceph/
$ scp -r /etc/ceph/* 192.168.2.205:/etc/ceph/
2、创建 ceph rbd
在 k8srbd1 这个 pool 池中创建 rbd,大小是 1024M
-
k8srbd1/rbda: 这是 RBD 镜像的名称,k8srbd1 是池(pool)的名称,rbda 是镜像(image)的名称。
-
object-map: 这是一种 RBD 镜像特性(feature),用于启用或禁用镜像中的对象映射(object mapping)。对象映射是一种索引结构,用于加速随机读取操作,减少读取延迟。通过禁用此特性,将禁用对象映射功能。
-
fast-diff: 这是另一种 RBD 镜像特性,用于启用或禁用快速差异(fast diff)。快速差异是一种优化技术,用于加速增量镜像的操作,例如增量备份和快照回滚。通过禁用此特性,将禁用快速差异功能。
-
deep-flatten: 这也是一种 RBD 镜像特性,用于启用或禁用深度展平(deep flatten)。深度展平是一 种技术,用于减少镜像链的长度,以提高写入性能和快照管理效率。通过禁用此特性,将禁用深度展平功能。
rbd feature disable 命令允许禁用 RBD 镜像中的特定特性。禁用特性可能会影响到某些功能或性能,具体取决于应用程序对这些特性的使用方式和依赖程度。在禁用特性之前,请确保了解其影响,并根据具体需求进行决策。
3、创建 pod,挂载 ceph rbd
nginx.tar.gz 上传到工作节点
[root@k8s-node01 ~]# docker load -i nginx.tar.gz
[root@k8s-node01 ~]# docker load -i nginx.tar.gz
[root@k8s-master01 ceph]# pwd
/root/ceph
$ vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: testrbd
spec:
containers:
- image: nginx
name: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: testrbd
mountPath: /mnt
volumes:
- name: testrbd
rbd:
monitors:
- '192.168.2.100:6789'
- '192.168.2.101:6789'
- '192.168.2.102:6789'
pool: k8srbd1
image: rbda
fsType: xfs
readOnly: false
user: admin
keyring: /etc/ceph/ceph.client.admin.keyring
更新资源清单文件
查看 pod 是否创建成功
$ kubectl get pod testrbd -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testrbd 1/1 Running 0 65s 10.244.58.241 k8s-node02 <none> <none>
注意: k8srbd1 下的 rbda 被 pod 挂载了,那其他 pod 就不能占用这个 k8srbd1 下的 rbda 了
例:创建一个 pod-1.yaml
$ vim pod-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: testrbd1
spec:
containers:
- image: nginx
name: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: testrbd
mountPath: /mnt
volumes:
- name: testrbd
rbd:
monitors:
- '192.168.2.101:6789'
- '192.168.2.102:6789'
- '192.168.2.100:6789'
pool: k8srbd1
image: rbda
fsType: xfs
readOnly: false
user: admin
keyring: /etc/ceph/ceph.client.admin.keyring
$ kubectl apply -f pod-1.yaml
$ kubectl get pod |grep test
testrbd 1/1 Running 0 110s
testrbd1 0/1 ContainerCreating 0 90s
查看 testrbd1 详细信息
$ kubectl describe pod testrbd1 |grep -i warning
Warning FailedMount 8s (x2 over 59s) kubelet MountVolume.WaitForAttach failed for volume "testrbd" : rbd image k8srbd1/rbda is still being used
上面一直 pending 状态,通过 warnning 可以发现是因为我的 pool: k8srbd1 image: rbda已经被其他 pod 占用了。
14.5 基于 ceph rbd 生成 pv
1、创建 ceph-secret 这个k8s secret 对象
这个 secret 对象用于 k8s volume 插件访问 ceph 集群,获取 client.admin 的keyring 值,并用 base64 编码,在 master1-admin(ceph 管理节点)操作
[root@master1-admin ~]# ceph auth get-key client.admin | base64
QVFEQUJnZGxqRUtTTmhBQWpiMnRDRTlKNVBOeUs1NlBuNlhmdmc9PQ==
显示如上
在 Ceph 中,ceph auth get-key 命令用于获取指定客户端(client)的密钥(key)。该命令后面跟着客户端的名称,例如 client.admin 表示获取名为"admin"的客户端的密钥。
在给定客户端的密钥后,使用 base64 命令对密钥进行编码,将其转换为 Base64 格式。Base64 是一种常用的编码方式,用于将二进制数据表示为可打印的 ASCII 字符序列。
因此,ceph auth get-key client.admin | base64 的意思是,获取名为"admin"的客户端的密钥,并对该密钥进行 Base64 编码。这样做可能是为了以文本形式方便地传输或存储该密钥。
2、创建 ceph 的 secret,在 k8s 的控制节点操作:
$ vim ceph-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
data:
key: QVFEQUJnZGxqRUtTTmhBQWpiMnRDRTlKNVBOeUs1NlBuNlhmdmc9PQ==
$ kubectl apply -f ceph-secret.yaml
3. 回到 ceph 管理节点创建 pool 池
[root@master1-admin ~]# ceph osd pool create k8stest 6
[root@master1-admin ~]# rbd create rbda -s 1024 -p k8stest
[root@master1-admin ~]# rbd feature disable k8stest/rbda object-map fast-diff deep-flatten
4、创建 pv
[root@k8s-master01 ceph]# vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: ceph-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
rbd:
monitors:
- 192.168.2.101:6789
- 192.168.2.100:6789
- 192.168.2.102:6789
pool: k8stest
image: rbda
user: admin
secretRef:
name: ceph-secret
fsType: xfs
readOnly: false
persistentVolumeReclaimPolicy: Recycle
5、创建 pvc
$ vim pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ceph-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
$ kubectl apply -f pvc.yaml
$ kubectl get pvc ceph-pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
ceph-pvc Bound ceph-pv 1Gi RWO 12s
6、测试挂载 pvc
## 工作节点导入nginx镜像
$ docker load -i nginx.tar.gz
$ vim pod-2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 ## tells deployment to run 2 pods matching the template
template: ## create pods using pod definition in this template
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/ceph-data"
name: ceph-data
volumes:
- name: ceph-data
persistentVolumeClaim:
claimName: ceph-pvc
$ kubectl apply -f pod-2.yaml
$ kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-7dfd76f899-4x968 1/1 Running 0 35s
nginx-deployment-7dfd76f899-8rqhm 1/1 Running 0 35s
注意:把 rbd 块设备做成 pv,pvc 跟 pv 绑定,也不支持跨节点 pod 挂载。
如果有多个工作节点,可以结合亲和性完成此实验(指定节点调度)
比如:pod-2.yaml 改成如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 ## tells deployment to run 2 pods matching the template
template: ## create pods using pod definition in this template
metadata:
labels:
app: nginx
spec:
nodeName: k8s-node02
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/ceph-data"
name: ceph-data
volumes:
- name: ceph-data
persistentVolumeClaim:
claimName: ceph-pvc
ceph rbd 块存储的特点:
ceph rbd 块存储能在同一个 node 给多个 pod 共享挂载
ceph rbd 块存储不能给不同的 node 节点上的 pod 挂载
14.6 k8s 挂载 cephfs
[root@master1-admin ~]# ceph fs ls
name: yq, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
1、创建 ceph 子目录
为了别的地方能挂载 cephfs,先创建一个 secretfile
[root@master1-admin ~]# cat /etc/ceph/ceph.client.admin.keyring |grep key|awk -F" " '{print $3}' > /etc/ceph/admin.secret
创建一个名为 xuegod_data 的目录,用于将 Ceph 文件系统挂载到该目录。
[root@master1-admin ~]# mkdir /root/yq_data
[root@master1-admin ~]# mount -t ceph 192.168.2.100:6789,192.168.2.101:6789,192.168.2.102:6789:/ /root/yq_data -o name=admin,secretfile=/etc/ceph/admin.secret
将 Ceph 文件系统挂载到先前创建的 xuegod_data 目录。
-t ceph : 指定文件系统类型为 Ceph。
192.168.1.201:6789:/ : 指定 Ceph Monitor 的 IP 地址和端口号,并指定要挂载的根路径为根目录 (/)。
/root/xuegod_data : 指定要挂载到的目标目录。
-o name=admin,secretfile=/etc/ceph/admin.secret : 使用 admin 作为认证用户名,并通过指定的 /etc/ceph/admin.secret 文件提供认证密钥。
[root@master1-admin ~]# df -h |grep yq
192.168.2.100:6789,192.168.2.101:6789,192.168.2.102:6789:/ 84G 0 84G 0% /root/yq_data
在 cephfs 的根目录里面创建了一个子目录 lucky,k8s 以后就可以挂载这个目录
[root@master1-admin ~]# cd /root/yq_data/
[root@master1-admin yq_data]# mkdir lucky
[root@master1-admin yq_data]# chmod 0777 lucky/
2、测试 k8s 的 pod 挂载 cephfs
1)创建 k8s 连接 ceph 使用的secret
将/etc/ceph/ceph.client.admin.keyring 里面的key 的值转换为 base64,否则会有问题
[root@master1-admin yq_data]# echo "AQDABgdljEKSNhAAjb2tCE9J5PNyK56Pn6Xfvg==" |base64
QVFEQUJnZGxqRUtTTmhBQWpiMnRDRTlKNVBOeUs1NlBuNlhmdmc9PQo=
显示如上:
[root@k8s-master01 ceph]# vim cephfs-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: cephfs-secret
data:
key: QVFEQUJnZGxqRUtTTmhBQWpiMnRDRTlKNVBOeUs1NlBuNlhmdmc9PQo=
$ kubectl apply -f cephfs-secret.yaml
$ kubectl get secret cephfs-secret
NAME TYPE DATA AGE
cephfs-secret Opaque 1 16s
2)创建PV
$ vim cephfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: cephfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
cephfs:
monitors:
- 192.168.2.100:6789
- 192.168.2.101:6789
- 192.168.2.102:6789
path: /lucky
user: admin
readOnly: false
secretRef:
name: cephfs-secret
persistentVolumeReclaimPolicy: Recycle
$ kubectl apply -f cephfs-pv.yaml
$ kubectl get pv cephfs-pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
cephfs-pv 1Gi RWX Recycle Available 11s
3)创建PVC
$ vim cephfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: cephfs-pvc
spec:
accessModes:
- ReadWriteMany
volumeName: cephfs-pv
resources:
requests:
storage: 1Gi
$ kubectl apply -f cephfs-pvc.yaml
$ kubectl get pvc cephfs-pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
cephfs-pvc Bound cephfs-pv 1Gi RWX 20s
4)创建第一个 pod,挂载 cephfs-pvc
$ vim cephfs-pod-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: cephfs-pod-1
spec:
containers:
- image: nginx
name: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test-v1
mountPath: /mnt
volumes:
- name: test-v1
persistentVolumeClaim:
claimName: cephfs-pvc
$ kubectl apply -f cephfs-pod-1.yaml
$ kubectl get pod cephfs-pod-1
NAME READY STATUS RESTARTS AGE
cephfs-pod-1 1/1 Running 0 12s
5)创建第二个 pod,挂载 cephfs-pvc
$ vim cephfs-pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: cephfs-pod-2
spec:
containers:
- image: nginx
name: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test-v1
mountPath: /mnt
volumes:
- name: test-v1
persistentVolumeClaim:
claimName: cephfs-pvc
$ kubectl apply -f cephfs-pod-2.yaml
$ kubectl get pod |grep cephfs
cephfs-pod-1 1/1 Running 0 2m10s
cephfs-pod-2 1/1 Running 0 4s
6)验证
$ kubectl exec -it cephfs-pod-1 -- /bin/sh
## cd /mnt
## touch hello
$ kubectl exec -it cephfs-pod-2 -- /bin/sh
## cd /mnt
## touch welcome
回到 master1-admin 上,可以看到在 cephfs 文件目录下已经存在内容了



