8.云原生存储之Ceph集群

1. 私有云实战之基础环境搭建
2. 云原生实战之kubesphere搭建
3.云原生之kubesphere运维
4. 云原生之kubesphere基础服务搭建
5.云原生安全之kubesphere应用网关配置域名TLS证书
6.云原生之DevOps和CICD
7.云原生之jenkins集成SonarQube
8.云原生存储之Ceph集群

文章目录

  • 为什么要用Ceph?
    • glusterfs、ceph、nfs对比
    • 使用阿里云nas作为日志存储,多个服务写nas出现日志丢失和混乱
    • k8s将数据文件挂载到nas可能会出现的问题
    • k8s将数据文件挂载到nas并发写问题
    • Ceph 并发写问题(存在瓶颈)
  • 部署前准备
    • os与ceph版本
    • rook与ceph版本
    • ceph与kubenetes版本
    • ceph磁盘要求
  • 境外镜像拉取处理
    • 方式1:部署镜像代理服务
    • 方式2:导入离线docker镜像
  • 使用Rook安装Ceph集群(常规)
    • 部署Admission Controller
    • 部署RooK Operator
    • 修改cluster.yaml文件
    • 创建ceph集群
    • Ceph toolbox 命令行工具
    • 暴露dashboard
  • helm安装ceph集群
  • 删除ceph集群(重要)
    • 常规部署ceph情况
    • helm部署ceph情况
      • 删除Terminating状态命名空间
      • cephcluster无法删除
      • ConfigMap和Secret删除不了处理
    • 通用删除ceph集群方式

Ceph官网文档

为什么要用Ceph?

简单总结:使用nfs作为nas存在并发写和数据一致性问题,ceph提供并发写支持

glusterfs、ceph、nfs对比

特性GlusterFSCephNFS
架构分布式文件系统对象存储客户端-服务器模型
数据一致性强一致性和弱一致性可配置副本和一致性协议强一致性
可扩展性良好的横向扩展性高度可扩展性有限的扩展性
性能适用于大文件和顺序访问适用于并发写入和随机访问受限于网络和服务器性能
管理复杂性相对简单相对复杂相对简单

GlusterFS、Ceph和NFS(Network File System)都是分布式存储系统,但它们在架构、功能和适用场景上有所不同。下面是对它们进行比较的一些关键方面:

  1. 架构:
    • GlusterFS:采用分布式文件系统的方式,将数据分布在多个存储节点上,通过集中式管理器(glusterd)来管理和协调数据访问。
    • Ceph:采用对象存储的方式,将数据分片并分布在多个存储节点上,通过 CRUSH 算法计算数据位置,并使用 OSD 处理数据存储和访问。
    • NFS:基于客户端-服务器模型,客户端通过网络挂载远程存储服务器上的文件系统,使用标准的文件系统接口进行数据访问。
  2. 数据一致性:
    • GlusterFS:提供强一致性和弱一致性两种模式,可以根据需求进行配置。
    • Ceph:通过副本和一致性协议来保证数据的一致性和可靠性。
    • NFS:提供强一致性,客户端对文件的修改会立即反映到服务器上。
  3. 可扩展性:
    • GlusterFS:具有良好的横向扩展性,可以通过添加存储节点来扩展存储容量和性能。
    • Ceph:具有高度可扩展性,可以通过添加 OSD 和存储节点来扩展存储容量和吞吐量。
    • NFS:不太适合大规模存储集群,扩展性有限。
  4. 性能:
    • GlusterFS:适用于大文件和顺序访问,对小文件和随机访问的性能可能较差。
    • Ceph:具有较好的性能,尤其在并发写入和随机访问方面表现出色。
    • NFS:性能受限于网络和服务器的性能,对小文件和随机访问的性能可能较差。
  5. 管理和配置复杂性:
    • GlusterFS:相对较简单,使用命令行工具或图形界面进行管理和配置。
    • Ceph:相对复杂,需要配置 CRUSH 算法、数据分片策略等,但提供了更高级的管理和配置选项。
    • NFS:相对简单,采用标准的文件系统接口,易于管理和配置。

综合来说,GlusterFS适用于大文件和顺序访问,易于部署和管理;Ceph适用于大规模存储集群,具有高度可扩展性和并发写入能力;NFS适用于简单的文件共享和标准文件系统访问。选择哪个系统取决于具体的需求、数据访问模式和规模。

使用阿里云nas作为日志存储,多个服务写nas出现日志丢失和混乱

使用阿里云 NAS(Network Attached Storage)作为日志存储时,多个服务同时写入 NAS 可能会导致日志丢失和混乱的问题。这是因为 NAS 是一个共享存储设备,多个服务同时写入同一个文件可能会引发以下问题:

  1. 写冲突:多个服务同时写入同一个文件可能导致写冲突,其中一个服务的写入可能会覆盖其他服务的写入内容,导致日志丢失或混乱。
  2. 文件锁定:某个服务正在写入文件时,其他服务可能无法同时写入,需要等待文件解锁。这可能会导致服务之间的延迟和性能问题。

为了避免这些问题,可以考虑以下解决方案:

  1. 使用分离的日志文件:每个服务使用独立的日志文件,避免多个服务写入同一个文件。这样可以降低写冲突的风险。
  2. 使用日志收集工具:将每个服务的日志发送到一个中央日志收集工具,如 Elasticsearch、Fluentd、Logstash 等。这样每个服务可以独立写入自己的日志文件,而中央日志收集工具负责收集和聚合所有日志,并存储到 NAS 或其他存储后端。
  3. 使用分布式日志系统:使用分布式日志系统如 Apache Kafka、RabbitMQ 等,每个服务将日志写入消息队列中,然后由消费者服务将日志写入 NAS 或其他存储后端。这样可以实现解耦和水平扩展。

无论选择哪种解决方案,都应该注意日志的并发写入和文件锁定问题,以确保日志的完整性和一致性。此外,还应该考虑日志文件的大小和定期归档,以避免单个文件过大导致的性能问题。

k8s将数据文件挂载到nas可能会出现的问题

将数据文件挂载到 Kubernetes 中的 NAS 存储时,可能会遇到以下问题:

  1. 性能问题:NAS 存储通常与节点通过网络连接,相对于本地存储,它的性能可能会较低。这可能会影响应用程序的读写性能和响应时间。因此,在将数据文件挂载到 NAS 上时,需要评估 NAS 存储的性能是否满足应用程序的需求。
  2. 网络稳定性:由于 NAS 存储是通过网络连接的,因此网络的稳定性和延迟可能会对数据访问产生影响。如果网络连接不稳定或延迟较高,可能会导致应用程序对数据的读写操作变慢或超时。
  3. 并发访问:如果多个 Pod 或节点同时访问 NAS 存储上的同一数据文件,可能会导致并发访问冲突。这可能会引发数据一致性问题或导致文件损坏。在设计应用程序时,需要考虑并发访问的情况,并采取适当的并发控制措施,如使用文件锁定机制或设计合适的数据访问模式。
  4. 数据保护和备份:NAS 存储通常需要进行数据保护和备份,以防止数据丢失。确保定期备份数据,并采取适当的容灾措施,如使用 RAID 或者跨区域备份,以保护数据免受硬件故障或其他意外事件的影响。

在使用 NAS 存储时,建议进行充分的测试和评估,确保它能满足应用程序的性能、可靠性和数据一致性要求。同时,还可以考虑其他存储选项,如分布式存储系统(如 Ceph、GlusterFS)或云原生存储解决方案(如云提供商的对象存储服务),根据具体需求选择最适合的存储方案。

k8s将数据文件挂载到nas并发写问题

将数据文件挂载到 Kubernetes 中的 NAS 存储时,如果多个 Pod 并发写入同一个文件,可能会出现并发写问题。这种情况下,可能会发生以下问题:

  1. 写冲突:多个 Pod 同时写入同一个文件时,写冲突可能会导致数据损坏或丢失。如果多个写操作同时发生,可能会导致文件内容混乱,其中一个写入的内容可能会覆盖其他写入的内容。
  2. 文件锁定:当一个 Pod 正在写入文件时,其他 Pod 可能无法同时写入,需要等待文件解锁。这可能会导致其他 Pod 的写入延迟和性能下降。

为了避免并发写问题,可以考虑以下解决方案:

  1. 使用独立的文件:每个 Pod 使用独立的文件进行写入,避免多个 Pod 写入同一个文件。这样可以降低写冲突的风险。
  2. 使用文件锁定机制:在访问共享文件时,可以使用文件锁定机制,如 POSIX 文件锁定或分布式锁,以确保只有一个 Pod 可以写入文件。其他 Pod 在写入之前需要等待锁定的释放。
  3. 使用分布式文件系统:考虑使用分布式文件系统,如 Ceph、GlusterFS 等,这些系统可以提供并发写入的支持,并确保数据一致性。
  4. 使用分布式日志系统:如果是写入日志文件,可以考虑使用分布式日志系统,如 Elasticsearch、Fluentd、Logstash 等,这些系统可以提供并发写入和聚合日志的功能。

无论选择哪种解决方案,都需要根据实际需求和负载特性进行评估和测试,以确保数据的完整性和一致性,并避免并发写问题导致的数据损坏或丢失。

Ceph 并发写问题(存在瓶颈)

Ceph 的并发写入能力是其设计的一个关键特性,但在实际应用中,也可能会面临一些与并发写入相关的问题。以下是一些可能出现的问题和相应的解决方法:

  1. 写入冲突:当多个客户端同时写入相同的对象时,可能会发生写入冲突。这可能导致数据不一致或丢失。

解决方法:可以使用一致性协议(如分布式锁)来保证对同一对象的并发写入的顺序。另外,可以使用版本控制或乐观并发控制机制来处理冲突,以确保数据的一致性。

  1. 性能瓶颈:并发写入可能会导致存储集群的性能瓶颈,特别是在写入密集型工作负载下。

解决方法:可以通过增加 OSD 的数量、调整 CRUSH 算法的配置、优化网络带宽和延迟等方式来提高存储集群的性能。另外,可以使用缓存、批处理写入等技术来减轻写入压力。

  1. 数据一致性和持久性:并发写入可能会导致数据一致性和持久性方面的挑战。如果写入操作没有正确完成或失败,可能会导致数据丢失或不一致。

解决方法:Ceph 提供了数据副本和故障恢复机制,可以通过配置适当数量的副本来提高数据的冗余和可靠性。此外,可以使用写入确认机制来确保写入操作的完成,并进行适当的错误处理和故障恢复。

  1. 网络和带宽限制:并发写入可能会对网络和带宽造成压力,特别是在跨多个节点的分布式存储集群中。

解决方法:可以通过增加网络带宽、优化网络拓扑、使用链路聚合技术等方式来缓解网络和带宽限制。另外,可以使用数据本地化和就近复制等策略来减少跨节点的写入操作。

需要根据具体的应用场景和需求来评估并解决并发写入问题。Ceph 提供了一系列的配置选项和优化策略,可以根据实际情况进行调整和优化,以提供更好的并发写入性能和数据一致性保证。

部署前准备

环境版本
系统centos7.5
k8sv1.23.10
docker20.10.8
kubesphere3.3.2
rookv1.9.12
cephv15.2.17

os与ceph版本

OS Recommendations — Ceph Documentationimage.png

  • A:Ceph 提供了软件包,并对其中的软件进行了全面测试。
  • B:Ceph 提供了软件包,并对其中的软件进行了基本测试。
  • C:Ceph 仅提供软件包。尚未对这些版本进行任何测试。

centos7.x系统ceph版本最好选择Pacific(16.2.z)版本

rook与ceph版本

Ceph Upgrades - Rook Ceph Documentation 选择版本如下图
image.png
image.pngimage.pngimage.pngimage.png
centos7.x系统ceph版本最好选择Pacific(16.2.z)版本,综上rook最好选择v1.9版本

ceph与kubenetes版本

ceph版本k8s版本要求
rook v1.12v1.22及以上
rook v1.9v1.17及以上

ceph磁盘要求

  1. ceph磁盘要求
  1. 原始设备(没有分区或格式化的文件系统)
  2. 原始分区(没有格式化的文件系统)
  3. LVM逻辑卷(没有格式化的文件系统)
  4. 块模式存储类中可用的持久卷
  1. 查看当前磁盘并添加

image.png
image.png

  1. 添加磁盘后查看

image.png

境外镜像拉取处理

由于容器镜像均无法正常访问,

  1. 推荐安装镜像代理服务,自动使用镜像代理服务拉取新创建的 Pod 中的外网容器镜像(仅限公有镜像)
  2. 推荐在能访问外网的机器上拉取docker镜像子在离线,该放弃要求较高,需在yaml找到docker镜像版本

方式1:部署镜像代理服务

  1. 安装 cert-manager

官方文档: Install cert-manager

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml# 代理地址
kubectl apply -f https://ghproxy.com/https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml
  1. 安装 registry-proxy

官方网站: https://ketches.cn/registry-proxy/

# 整个命令的作用是从 GitHub 仓库的最新发布版本的重定向 URL 中提取文件名,并将其赋值给名为 LATEST 的环境变量。这样,变量 LATEST 就包含了最新发布版本的文件名,可以在后续的脚本中使用
export LATEST=$(basename $(curl -s -w %{redirect_url} https://github.com/ketches/registry-proxy/releases/latest))
# 打印LATEST -- v1.0.0
echo $LATEST             
kubectl apply -f https://raw.githubusercontent.com/ketches/registry-proxy/$LATEST/deploy/manifests.yaml
# 代理地址
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/ketches/registry-proxy/$LATEST/deploy/manifests.yaml

export逐步解释这个命令:

  1. curl -s -w %{redirect_url} https://github.com/ketches/registry-proxy/releases/latest:这部分命令使用 curl 命令从指定的 GitHub 仓库的 /releases/latest 页面获取重定向的 URL。-s 参数表示静默模式,不显示进度或错误信息,-w %{redirect_url} 参数表示输出重定向的 URL。
  2. basename:这个命令用于从给定的路径中提取文件名部分。
  3. $(…):这个语法用于执行命令,并将命令的输出结果作为变量的值。

image.png

  1. 配置

registry-proxy 安装后自动创建 ConfigMap registry-proxy-config,ConfigMap 内容为默认配置,可以通过修改 ConfigMap 来修改默认配置。默认配置如下:

apiVersion: v1
kind: ConfigMap
metadata:name: registry-proxy-confignamespace: registry-proxy
data:config.yaml: |proxies:docker.io: docker.ketches.cnregistry.k8s.io: k8s.ketches.cnquay.io: quay.ketches.cnghcr.io: ghcr.ketches.cngcr.io: gcr.ketches.cnk8s.gcr.io: k8s-gcr.ketches.cndocker.cloudsmith.io: cloudsmith.ketches.cnexcludeNamespaces:- kube-system- kube-public- kube-node-leaseincludeNamespaces:- *
  1. 默认使用 ketches/cloudflare-registry-proxy 镜像代理服务;
  2. 默认排除 kube-system、kube-public、kube-node-lease 命名空间下的 Pod 容器镜像代理;
  3. 修改上述配置实时生效,无需重启 registry-proxy;
  4. 可以自定义代理地址,例如:docker.io: docker.m.daocloud.io;
  5. 可以去除代理地址,免去代理;
  6. 可以增加代理地址,例如:mcr.microsoft.com: mcr.dockerproxy.com;
  7. 可以通过向 ketches/cloudflare-registry-proxy 项目 提交 Issue 来申请添加新的国外镜像代理服务

方式2:导入离线docker镜像

  1. 若不能访问外网,安装过程下载镜像会失败

image.png

  1. 可以在可以访问外网的机器上下载镜像,或者修改镜像源,以下是rook-v1.13.1版本
docker pull rook/ceph:v1.13.1docker pull quay.io/cephcsi/cephcsi:v3.10.1
docker pull registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1
docker pull registry.k8s.io/sig-storage/csi-resizer:v1.9.2
docker pull registry.k8s.io/sig-storage/csi-provisioner:v3.6.2
docker pull registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2
docker pull registry.k8s.io/sig-storage/csi-attacher:v4.4.2docker pull quay.io/ceph/ceph:v18.2.1docker save -o D:/rook-1.13.1.tar rook/ceph:v1.13.1 quay.io/cephcsi/cephcsi:v3.10.1 registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.1 registry.k8s.io/sig-storage/csi-resizer:v1.9.2 registry.k8s.io/sig-storage/csi-provisioner:v3.6.2 registry.k8s.io/sig-storage/csi-snapshotter:v6.3.2 registry.k8s.io/sig-storage/csi-attacher:v4.4.2 
  1. 将镜像打包成tar
docker save -o D:/RooKOperator.tar registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.8.0 registry.k8s.io/sig-storage/csi-resizer:v1.8.0 registry.k8s.io/sig-storage/csi-provisioner:v3.5.0 registry.k8s.io/sig-storage/csi-snapshotter:v6.2.2 registry.k8s.io/sig-storage/csi-attacher:v4.3.0docker save -o D:/storage-cephcsi.tar k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0 k8s.gcr.io/sig-storage/csi-resizer:v1.3.0 k8s.gcr.io/sig-storage/csi-attacher:v3.3.0 k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.0 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0 quay.io/cephcsi/cephcsi:v3.4.0 docker save -o D:/toolbox.tar quay.io/ceph/ceph:v18.2.1docker save -o D:/ceph.tar registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.8.0 registry.k8s.io/sig-storage/csi-resizer:v1.8.0 registry.k8s.io/sig-storage/csi-provisioner:v3.5.0 registry.k8s.io/sig-storage/csi-snapshotter:v6.2.2 registry.k8s.io/sig-storage/csi-attacher:v4.3.0 k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0 k8s.gcr.io/sig-storage/csi-resizer:v1.3.0 k8s.gcr.io/sig-storage/csi-attacher:v3.3.0 k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.0 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0 quay.io/cephcsi/cephcsi:v3.4.0 quay.io/ceph/ceph:v18.2.1# 删除镜像
docker rmi registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.8.0 registry.k8s.io/sig-storage/csi-resizer:v1.8.0 registry.k8s.io/sig-storage/csi-provisioner:v3.5.0 registry.k8s.io/sig-storage/csi-snapshotter:v6.2.2 registry.k8s.io/sig-storage/csi-attacher:v4.3.0 k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0 k8s.gcr.io/sig-storage/csi-resizer:v1.3.0 k8s.gcr.io/sig-storage/csi-attacher:v3.3.0 k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.0 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0 quay.io/cephcsi/cephcsi:v3.4.0 quay.io/ceph/ceph:v18.2.1
  1. 将tar上传到服务器,执行如下命令导入镜像:

小编已经准备好离线安装包RooKOperator.tar,storage-cephcsi.tar

docker load -i ceph.tar
  1. 将tar拷贝到其他机器脚本
#!/bin/bash# 定义要传输的文件和目标路径
file_to_transfer="./storage-cephcsi.tar"
destination_path="/opt"# 定义远程主机列表
remote_hosts=("root@192.168.31.20""root@192.168.31.22""root@192.168.31.23""root@192.168.31.24""root@192.168.31.25""root@192.168.31.26""root@192.168.31.27"
)# 循环遍历远程主机列表,并执行文件传输
for remote_host in "${remote_hosts[@]}"; doecho "Transferring file to ${remote_host}..."scp "${file_to_transfer}" "${remote_host}:${destination_path}"
done

使用Rook安装Ceph集群(常规)

部署Admission Controller

启用Rook准入控制器,以确保使用自定义资源(CR)设置正确配置了Rook。
cert-manager.yaml

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml

部署RooK Operator

用 Helm 托管安装 Ceph 集群并提供后端存储 · Kubernetes 中文指南——云原生应用架构实战手册

  1. 修改operator.yaml

还是operator文件,新版本rook默认关闭了自动发现容器的部署,如果没有指定osd节点的位置,这层配置一定要打开,来让自动发现容器帮助我们去发现设备上的块设备,可以找到ROOK_ENABLE_DISCOVERY_DAEMON改成true即可

  1. 下载rook源码:https://github.com/rook/rook,部署RooK Operator
# 进入源码/deploy/examples目录
kubectl apply -f crds.yaml -f common.yaml -f operator.yaml
# 删除部署
kubectl delete -f crds.yaml -f common.yaml -f operator.yaml
# 查看rook Operator是否running
kubectl get pods -n rook-ceph
  1. 部署完成内容如下

image.png
image.pngimage.png
image.png

修改cluster.yaml文件

Linux 命令大全 | 菜鸟教程

  1. 查看k8s node
kubectl get node -o wide

image.png

  1. 放开注释,表明可以在k8s集群之外使用ceph集群
provider: host
  1. 设置ceph集群节点和磁盘
# 修改ceph镜像版本关闭更新检查
cephClusterSpec:cephVersion:image: quay.io/ceph/ceph:v18.2.1# 关闭更新检查
cephClusterSpec:skipUpgradeChecks: true# dashboard关闭ssl
dashboard:enabled: trueport: 8443ssl: false# 选择自定义挂载卷storage: # cluster level storage configuration and selectionuseAllNodes: falseuseAllDevices: falsenodes:- name: "ksnode20"devices: - name: "sdb"- name: "ksnode24"devices: - name: "sdb"- name: "ksnode25"devices: - name: "sdb"- name: "ksnode26"devices: - name: "sdb"- name: "ksnode27"devices: - name: "sdb" 

其中nodes下name只能填hostname,不能填写ip地址
device下name为磁盘盘符,新版必须采用裸盘,即未格式化的磁盘。建议最少三个节点,否则后面的试验可能会出现问题

创建ceph集群

  1. 创建ceph集群
# 创建ceph集群
kubectl create -f cluster.yaml 
# 删除
kubectl delete -f cluster.yaml 
# 查看Ceph部署情况
kubectl describe node <节点名称>
# 查看Ceph部署情况
kubectl get pods -n rook-ceph

image.png

出现该现象则是存在污点

  1. 若cluster.yaml中配置使用到master节点磁盘,则将master污点取消

master节点存在污点,是不允许调度的。取消污点:
image.png
或者删除 node-role.kubernetes.io/master
image.pngimage.png

  1. 查看部署情况

image.png
登录kubesphere控制台查看image.pngimage.png

Ceph toolbox 命令行工具

  1. 部署toolbox
# 部署toolbox
kubectl  create -f toolbox.yaml -n rook-ceph
# 删除toolbox
kubectl  delete -f toolbox.yaml -n rook-ceph# 查看toolbox部署情况
kubectl  get po -n rook-ceph -l app=rook-ceph-tools
  1. 验证ceph集群状态
# 进入toolbox容器内部
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bashbash-4.4$ ceph osd status
ID  HOST       USED  AVAIL  WR OPS  WR DATA  RD OPS  RD DATA  STATE
0  ksnode25  26.3M   499G      0        0       0        0   exists,up
1  ksnode24  26.8M   499G      0        0       0        0   exists,up
2  ksnode26  26.8M   499G      0        0       0        0   exists,up
3  ksnode27  26.8M   499G      0        0       0        0   exists,up# 查看ceph磁盘情况
bash-4.4$ ceph df
--- RAW STORAGE ---
CLASS     SIZE    AVAIL     USED  RAW USED  %RAW USEDhdd    2.0 TiB  2.0 TiB  107 MiB   107 MiB          0TOTAL  2.0 TiB  2.0 TiB  107 MiB   107 MiB          0--- POOLS ---POOL  ID  PGS   STORED  OBJECTS     USED  %USED  MAX AVAIL.mgr   1    1  449 KiB        2  1.3 MiB      0    633 GiB

image.png

暴露dashboard

  1. 查看内部访问方式
# 查看mgr service
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
bash-4.4$ ceph mgr services
{"dashboard": "https://192.168.31.24:8443/","prometheus": "http://192.168.31.24:9283/"
}

image.png

  1. 内部访问测试

image.png

  1. nodeport方式暴露

image.png

  1. 获取ceph dashboard访问密码

用户名admin 密码获取使用如下命令:

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

登录ceph控制台
image.png

  1. rook-ceph-mgr-dashboard服务端口漂移问题

有的版本存在端口漂移问题,测试1.9.12无该问题,1.13.1存在该问题

kubectl get svc rook-ceph-mgr-dashboard -n rook-ceph

image.png
image.png
发现容器端口漂移从8443漂移到7000,等一会服务nodePort端口会重置关闭
image.png

修改port,重新部署

helm安装ceph集群

参考:k8s部署rook-ceph记录_k8s安装rook-ceph1.10

  1. 先安装rook-operator , 运行正常后安装rook-cluster
  2. 添加应用仓库:https://charts.rook.io/release

image.png

  1. 从应用仓库中安装ceph

image.png

  1. 修改vlues.yml该配置参考cluster.yaml配置文件,主要修改内容如下:
# 修改ceph镜像版本关闭更新检查
cephClusterSpec:cephVersion:image: quay.io/ceph/ceph:v18.2.1# 关闭更新检查
cephClusterSpec:skipUpgradeChecks: true# dashboard关闭ssl
dashboard:enabled: trueport: 8443ssl: false# 选择自定义挂载卷
storage: # cluster level storage configuration and selectionuseAllNodes: falseuseAllDevices: falsenodes:- name: "node180"devices: # specific devices to use for storage can be specified for each node- name: "sdc"- name: "node181"devices:- name: "sdc"- name: "node182"devices:- name: "sdc"
  1. 开启其他功能(可选)Ceph Docs

删除ceph集群(重要)

在搭建过程存在反复搭建删除的情况,删除集群存在很多坑,这儿小编特别说明,删除小编参考kubernetes上的分布式存储集群搭建(Rook/ceph)

常规部署ceph情况

  1. 常规部署ceph情况,执行下述命令即可删除
kubectl delete -f cluster.yaml 
kubectl delete -f crds.yaml -f common.yaml -f operator.yaml

helm部署ceph情况

小编通过下述命令先部署了operator

kubectl apply -f crds.yaml -f common.yaml -f operator.yaml

小编在kubesphere应用仓库部署了
image.png
上诉在应用仓库部署ceph相当于

kubectl create -f cluster.yaml 

部署过程没有问题,当小编想删除ceph时

  1. 小编直接在应用删除了ceph应用

image.png
该操作不等价kubectl delete -f cluster.yaml ,资源没有被删除,此时小编直接在kubesphere控制台删除了rook-ceph项目,出现现象rook-ceph命名空间一直处于Terminating,
image.png
rook-ceph命名空间删除后,该空间下的ConfigMap资源rook-ceph-mon-endpoints和Secret资源rook-ceph-mon删除不了

删除Terminating状态命名空间

  1. 查看命名空间下是否还存在资源没删除干净
kubectl api-resources -o name --verbs=list --namespaced | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <命名空间>
  1. 若存在着删除
kubectl api-resources -o name --verbs=list --namespaced | xargs -n 1 kubectl delete --ignore-not-found --all -n <命名空间>
  1. 强制删除命名空间
kubectl delete namespace <命名空间> --grace-period=0 --force
  1. 大多数情况下,命名空间下的资源无法强制删除,您可以使用原生接口进行删除
kubectl  get ns <命名空间>  -o json > <命名空间>.json# 删除json文件下述内容:"spec": {"finalizers": ["kubernetes"]},
  1. 开启代理接口
[root@ksmaster21 opt]# kubectl proxy
Starting to serve on 127.0.0.1:8001
  1. 调用接口删除namespace,注意修改要删除的<命名空间>
curl -k -H "Content-Type: application/json" -X PUT --data-binary @<命名空间>.json http://127.0.0.1:8001/api/v1/<命名空间>/rook-ceph/finalize

cephcluster无法删除

# 查看cephcluster
kubectl -n rook-ceph get cephcluster
# 查看资源
kubectl api-resources --namespaced=true -o name|xargs -n 1 kubectl get --show-kind --ignore-not-found -n rook-ceph
# 编辑资源,进行删除
kubectl edit  cephcluster.ceph.rook.io -n rook-ceph
# 把finalizers的值删掉,cephcluster.ceph.rook.io便会自己删除

ConfigMap和Secret删除不了处理

当您尝试删除 Kubernetes 命名空间时,如果出现错误消息 “Some content in the namespace has finalizers remaining”,并且提到了特定的 finalizer(例如 ceph.rook.io/disaster-protection),这意味着该命名空间中的某些资源仍然具有未删除的 finalizer。
Finalizers 是 Kubernetes 中用于确保资源在删除过程中执行特定逻辑的机制。如果资源具有 finalizer,Kubernetes 将阻止删除该资源,直到 finalizer 的逻辑完成。

  1. 确定具有 finalizers 的资源:使用以下命令查找具有 finalizers 的资源
安装jq工具
sudo yum install epel-release
sudo yum install jq
# 确定具有 finalizers 的资源
kubectl get <resource-type> -n <namespace> -o json | jq '.items[] | select(.metadata.finalizers!=null) | .metadata.name'

将 替换为具有 finalizers 的资源类型(例如 Deployment、StatefulSet、Pod 等),将 替换为命名空间名称

  1. 删除 finalizers:对于每个具有 finalizers 的资源,您可以使用以下命令删除 finalizers
kubectl patch <resource-type> <resource-name> -n <namespace> -p '{"metadata":{"finalizers":[]}}' --type=merge

将 替换为具有 finalizers 的资源类型,将 替换为资源名称,将 替换为命名空间名称

通用删除ceph集群方式

  1. 删除Cephcluster CRD
kubectl -n rook-ceph delete cephcluster rook-ceph# 确实是否删除
kubectl -n rook-ceph get cephcluster
  1. 删除Operator 和相关的资源
kubectl delete -f operator.yaml
kubectl delete -f common.yaml
kubectl delete -f crds.yaml
  1. 删除主机上的数据

rook创建cluster的时候会把部分数据卸载本机的/var/lib/rook(dataDirHostPath指定的目录)中,如果不删除会影响下次集群部署,rook据说下个版本会增加k8s 本地存储调用的功能,就不会直接存在硬盘上了

rm -rf /var/lib/rook
  1. 擦除硬盘上的数据

创建osd时被写入了数据,需要擦除,否则无法再次创建ceph集群,脚本中有各种硬盘的擦除命令,不需要全部执行成功,根据当前机器的硬盘情况确定。
安装依赖组件

sudo yum install gdisk

执行如下脚本:

#!/usr/bin/env bash
# 定义了一个变量 DISK,表示要进行清理的磁盘设备路径
DISK="/dev/sdb"
# 使用 sgdisk 命令对指定的磁盘设备进行全盘擦除,将磁盘分区表和分区信息清除
sgdisk --zap-all $DISK# 使用 dd 命令将 /dev/zero 的内容写入指定的磁盘设备,以清除设备上的数据。bs=1M 指定每次写入的块大小为 1MB,count=100 指定写入 100 个块。oflag=direct,dsync 用于将数据直接写入设备并确保数据同步到物理设备上
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync# 使用 blkdiscard 命令对指定的磁盘设备进行块丢弃操作,将设备上的数据块标记为可回收状态
blkdiscard $DISK
# 列出以 /dev/mapper/ceph- 开头的设备映射,并使用 dmsetup 命令逐个移除这些设备映射
ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %
# 递归删除以 /dev/ceph- 开头的设备节点
rm -rf /dev/ceph-*
# 递归删除以 /dev/mapper/ceph-- 开头的设备映射节点
rm -rf /dev/mapper/ceph--*

这个脚本的目的是清理 Ceph 存储集群相关的设备和映射,以便重新配置或删除 Ceph 存储集群。请注意,运行此脚本将会清除指定磁盘上的数据,因此在运行之前,请确保您已经备份了重要的数据,并且明确了脚本中 DISK 变量指定的磁盘设备是正确的。

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

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

相关文章

(超详细)3-YOLOV5改进-添加SE注意力机制

1、在yolov5/models下面新建一个SE.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import initclass SEAttention(nn.Module):def __init__(self, channel512,reduction16):super()._…

OpenWrt智能路由器Wan PPPoE拨号配置方法

OpenWrt智能路由器的wan PPPoE拨号配置方法和我们常见的不太一样, 需要先找到wan网卡,然后将协议切换为 PPPoE然后才能看到输入上网账号和密码的地方. 首先登录路由器 http://openwrt.lan/ 然后找到 Network --> Interfaces 这里会显示你当前的路由器的所有接口, 选择 …

java求链表中倒数第k个结点

下面我用两种方法求解&#xff1a; 第一种方法&#xff1a;通常我们做这种题就是求出链表的长度length&#xff0c;然后呢length-k的值就是我们要从链表头部走几步就可以了&#xff0c;代码解释&#xff1a; public class Solution {public class ListNode {int val;ListNode…

BitMap源码解析

文章目录 前言数据结构添加与删除操作 JDK中BitSet源码解析重要成员属性初始化添加数据清除数据获取数据size和length方法集合操作&#xff1a;与、或、异或优缺点 前言 为什么称为bitmap&#xff1f; bitmap不仅仅存储介质以及数据结构不同于hashmap&#xff0c;存储的key和v…

selenium模拟浏览器查询导出参考文献

通过使用Selenium和BeautifulSoup&#xff0c;在CNKI网站上&#xff0c;以"知识图谱"为关键词&#xff0c;通过自动化工具在搜索页面提取相关文章信息。点击清楚并全选进行文献导出&#xff0c;随后从导出页面和管理导出的页面提取参考文献。 浏览器及WebDriver下载…

【模块系列】STM32BMP280

前言 最进想练习下I2C的应用&#xff0c;手上好有BMP280也没用过&#xff0c;就看着机翻手册和原版手册&#xff0c;开始嘎嘎写库函数了。库的命名应该还1是比较规范了吧&#xff0c;就是手册对于最终值的计算方式很迷糊&#xff0c;所以现在也不能保证有可靠性啊&#xff0c;大…

2023极客大挑战web小记

拿到题目提示post传参还以为是道签到题 刚开始直接把自己极客大挑战的username以及password怼上去&#xff0c;但是不对。看看F12&#xff0c;有提示。 当一个搜索蜘蛛访问一个站点时&#xff0c;它会首先检查该站点根目录下是否存在robots.txt&#xff0c;如果存在&#xff0c…

24-1-9 bilibilic++音视频

下午两点面试&#xff0c;面试官迟到了一会&#xff0c;面试官人很好&#xff0c;整体面试经历很不错&#xff0c;但是我人太紧张了&#xff0c;基础知识掌握的深度不够&#xff0c;没有深挖&#xff0c; 是做音视频的底层相关的&#xff0c; 实习要求只要每天打卡够九个小时就…

精细微调技术在大型预训练模型优化中的应用

目录 前言1 Delta微调简介2 参数微调的有效性2.1 通用知识的激发2.2 高效的优化手段3 Delta微调的类别3.1 增量式微调3.2 指定式微调3.3 重参数化方法 4 统一不同微调方法4.1 整合多种微调方法4.2 动态调整微调策略4.3 超参数搜索和优化 结语 前言 随着大型预训练模型在自然语…

全网唯一!Matlab周杰伦专辑配色包MJay

前段时间杰伦出了新歌&#xff0c;第一时间听完&#xff0c;感觉没过瘾&#xff0c;便又翻出他以前的作品&#xff0c;想着继续回忆青春。 翻着翻着&#xff0c;突然发现每张专辑封面的配色都别有一番味道&#xff0c;似乎可以搞些事情…… 于是&#xff0c;我默默打开了Matl…

【博士每天一篇论文-理论分析】Dynamical systems, attractors, and neural circuits

阅读时间&#xff1a;2023-11-19 1 介绍 年份&#xff1a;2016 作者&#xff1a;Paul Miller 马萨诸塞州沃尔瑟姆市布兰代斯大学Volen国家复杂系统中心 期刊&#xff1a; F1000Research 引用量&#xff1a;63 这篇论文主要关注神经回路中的动力系统和吸引子。作者指出神经回路…

C# Cad2016二次开发HelloWorld(一)

1 新建类库 二 引用 acdbmgd.dll、acmgd.dll、accoremgd.dll 三 HelloWorld代码 public class Class1{/// <summary>/// 程序入口标识/// </summary>[CommandMethod("HelloWorld")]public void HelloWorld(){Document adoc Autodesk.AutoCAD.Applicatio…

数据结构实战:变位词侦测

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;逐个比较法1、编写源程序2、代码解释说明&#xff08;1&#xff09;函数逻辑解释&#xff08;2&#xff09;主程序部分 3、运行程序&#xff0c;查看结果4、计算时间复杂度 &#xff08;二&#xff09;排序比较法1…

设计模式之访问者模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

What does `HandlerInterceptor` do?

HandlerInterceptor 是 SpringMVC 中的一个接口&#xff0c;在SpringMVC应用中它提供了一种实现应用级拦截器的机制。 第1步&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web<…

基于SSM中小型医院管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【Golang】IEEE754标准二进制字符串转为浮点类型

IEEE754介绍 IEEE 754是一种标准&#xff0c;用于表示和执行浮点数运算的方法。在这个标准中&#xff0c;单精度浮点数使用32位二进制表示&#xff0c;分为三个部分&#xff1a;符号位、指数位和尾数位。 符号位(s)用一个位来表示数的正负&#xff0c;0表示正数&#xff0c;1表…

不带控制器打包exe,转pdf文件时失败的原因

加了注释的两条代码后&#xff0c;控制器会显示一个docx转pdf的进度条。这个进度条需要控制器的实现&#xff0c;如果转exe不带控制器的话&#xff0c;当点击转换为pdf的按钮就会导致程序出错和闪退。 __init__.py文件的入口

【排序算法】一、排序概念和直接插入排序(C/C++)

「前言」文章内容是排序算法之直接插入排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、排序概念的介绍二、直接插入排序2.1 原理2.2 代码实现&#xff08;C/C&#xf…

移除两个双向链表中的重复元素,每个链表中的元素不重复

移除两个双向链表中的重复元素&#xff0c;每个链表中的元素不重复&#xff0c;请给出算法。 ans: 该问题比单向链表要更加复杂一些&#xff0c;必须考虑并更新前向节点的指向情况&#xff0c;具体编码中存在一些难度&#xff0c;加上链表调试相对不容易&#xff0c;因此难度系…