9.云原生存储之ceph在k8s中应用及问题处理

这篇具有很好参考价值的文章主要介绍了9.云原生存储之ceph在k8s中应用及问题处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

云原生专栏大纲

ceph应用场景

官网文档:Ceph Docs

  1. 对象存储(Ceph Object Storage):
    对象存储适用于需要存储和访问大量非结构化数据的场景,例如图像、视频、日志文件等。在 Kubernetes 中,可以使用 Ceph Rados Gateway 提供的对象存储接口,将应用程序的对象数据存储在 Ceph 集群中。对象存储提供了高可扩展性和高可靠性,并且可以通过 HTTP 或 S3 API 进行访问。
  2. 块存储(Ceph Block Storage):
    块存储适用于需要将持久化数据作为块设备挂载到容器中的场景,例如数据库、文件系统等应用。在 Kubernetes 中,可以使用 Ceph RBD(Rados Block Device)提供的块存储功能。通过创建和管理 RBD 卷,可以将块设备挂载到 Pod 中,以提供高性能和可靠的块存储。
  3. 文件系统(Ceph File System):
    文件系统适用于需要共享文件数据的场景,例如共享配置文件、共享存储卷等。在 Kubernetes 中,可以使用 CephFS(Ceph File System)作为持久化存储卷,将文件系统挂载到多个 Pod 中,实现文件级别的共享和访问。CephFS 提供了高性能和可扩展的分布式文件系统功能。

总结来说,Ceph 对象存储适用于存储大量非结构化数据,块存储适用于需要挂载块设备的应用,文件系统适用于需要共享文件数据的场景。根据应用的需求和特点,选择适合的 Ceph 存储方式可以提供高性能、可靠性和可扩展性的存储解决方案。

ceph应用

在k8s集群外使用块设备

ceph客户端配置

  1. 通过rook-ceph-tools工具查看配置
sh-4.4$ cat /etc/ceph/ceph.conf
[global]
mon_host = 192.168.31.25:6789,192.168.31.24:6789,192.168.31.20:6789

[client.admin]
keyring = /etc/ceph/keyring


sh-4.4$ cat /etc/ceph/keyring
[client.admin]
key = AQBaFp1lEAyWNRAAmSeFCljy78bBBH3+D0qkmw==
  1. 将上述配置在其他机器创建,

确保其他机器能访问上述mon_host配置的ip:port。mon_host配置ip为宿主集群ip,需将cluster.yaml中provider: host配置注释放开,不然使用的是k8s集群中service的虚拟vip,需修改上述配置

# 宿主机上查看是否暴露端口
[root@ksnode20 ~]# ss -anput | grep ":6789"
tcp    LISTEN     0      128    192.168.31.20:6789                  *:*                   users:(("ceph-mon",pid=19223,fd=28))
  1. 确定centos版本和下载源
# 查看el版本
cat /etc/redhat-release
#CentOS Linux release 7.5.1804 (Core) 
# 对应el7版本

# rook-ceph-tools中查看
sh-4.4$ cat /etc/redhat-release
CentOS Stream release 8
  1. 查看版本
# rook-ceph-tools中查看ceph版本
sh-4.4$ ceph -v
ceph version 16.2.10 (45fa1a083152e41a408d15505f594ec5f1b4fe17) pacific (stable)
  1. 下载ceph客户端
vi /etc/yum.repos.d/ceph.repo

# 添加如下内容,https://mirrors.aliyun.com/ceph找到相应版本
[ceph]
name=ceph
baseurl=https://mirrors.aliyun.com/ceph/rpm-16.2.10/el8/x86_64/
enabled=1
gpgcheck=0


####安装客户端
yum install ceph-common -y

  1. 测试
sh-4.4$ ceph -s
  cluster:
    id:     b4e4ce76-8a0c-4171-a5ec-27da6394983e
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum a,b,c (age 21h)
    mgr: b(active, since 21h), standbys: a
    osd: 5 osds: 5 up (since 21h), 5 in (since 21h)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   27 MiB used, 2.4 TiB / 2.4 TiB avail
    pgs:     1 active+clean


Ceph是一个开源的分布式存储系统,提供了丰富的命令行工具来管理和操作Ceph集群。以下是一些常用的Ceph命令:

1. ceph-deploy: 用于在Ceph集群中部署和管理节点。
2. ceph: 主要命令行工具,用于执行各种Ceph管理操作。
  ceph health: 检查Ceph集群的健康状态。
  ceph status: 显示Ceph集群的状态信息。
  ceph osd status: 显示Ceph集群中每个OSD(对象存储设备)的状态信息。
  ceph df: 显示Ceph集群的存储使用情况。
  ceph osd pool ls: 列出Ceph集群中的所有存储池。
  ceph osd pool stats: 显示Ceph集群中每个存储池的统计信息。
  ceph osd tree: 显示Ceph集群中的OSD树结构。
  ceph pg stat: 显示Ceph集群中PGPlacement Group)的状态信息。
  ceph pg dump: 显示Ceph集群中PG的详细信息。
  ceph osd crush tree: 显示Ceph集群中的CRUSH映射树结构。
  ceph osd lspools: 列出Ceph集群中的所有存储池。
3. rados: 用于执行与RADOS(可靠自动分布式对象存储)相关的操作。
  rados df: 显示RADOS集群的存储使用情况。
  rados ls: 列出RADOS集群中的所有对象。
  rados rm: 删除RADOS集群中的对象。
  rados put: 将文件上传为RADOS对象。
  rados get:RADOS集群中下载对象。
4. rbd: 用于执行与RBD(块设备)相关的操作。
  rbd create: 创建一个RBD镜像。
  rbd ls: 列出RBD镜像。
  rbd info: 显示RBD镜像的详细信息。
  rbd map:RBD镜像映射为块设备。
  rbd unmap: 解除RBD镜像的块设备映射。
  rbd resize: 调整RBD镜像的大小。
  rbd snap create: 创建RBD镜像的快照。
  rbd snap ls: 列出RBD镜像的快照。
  rbd snap rm: 删除RBD镜像的快照。

创建块挂载使用

  1. 创建pool
#  该命令的作用是在 Ceph 存储集群中创建一个名为 "rook"OSD 池,初始设置为具有 16PG 和至少 16 个副本
sh-4.4$ ceph osd pool create rook 16 16
pool 'rook' created

# 用于列出 Ceph 存储集群中存在的所有 OSD 池
sh-4.4$ ceph osd lspools
1 device_health_metrics
2 rook
  • ceph osd pool create:这是 Ceph 命令行工具的一部分,用于创建 OSD 池。
  • rook:这是要创建的 OSD 池的名称。您可以根据自己的需求选择一个合适的名称。
  • 16:这是指定 OSD 池的初始 PG(Placement Group)数量。PG 是 Ceph 存储集群中数据分布和负载均衡的单位。选择适当的 PG 数量对于性能和数据分布非常重要。根据集群的大小和负载情况,您可以根据需要调整这个数字。
  • 16:这是指定 OSD 池的最小副本数。Ceph 使用副本(replication)来提供数据冗余和高可用性。设置最小副本数将确保在发生故障时仍然有足够的副本可用。同样,您可以根据需求调整这个数字。
  1. 在pool上创建RDB块
# 在名为 "rook"OSD 池中创建一个名为 "rook-rbd.img"RBD 镜像,其大小为 1GB
sh-4.4$ rbd create -p rook --image rook-rbd.img --size 1G

# 获得名为 "rook"OSD 池中所有 RBD 镜像的列表
sh-4.4$ rbd ls -p rook
rook-rbd.img


  1. 客户端挂载块
# 将指定的 RBD 镜像映射到本地系统中,使其在本地系统上可用。映射后,该镜像将作为块设备出现,并可以像其他块设备一样进行读取和写入操作。
rbd map rook/rook-rbd.img

# 在/dev/rbd0设备上创建一个XFS文件系统。这将格式化该设备,并将其准备好以存储文件和目录
mkfs.xfs /dev/rbd0

# 挂载
mount /dev/rbd0 /media

9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes

删除pool

要删除 Ceph 中的池(Pool),可以按照以下步骤进行操作:

  1. 检查池状态:运行以下命令,确保要删除的池处于健康状态(HEALTH_OK):
ceph -s
  1. 停止池中的操作:在删除池之前,最好停止对该池的任何操作,以确保数据的完整性。可以使用以下命令暂停池中的 I/O 操作:
#查看pool列表
ceph osd pool ls

ceph osd pool set <pool-name> size 0
  1. 删除池:运行以下命令删除池:
ceph osd pool delete <pool-name> <pool-name> --yes-i-really-really-mean-it

ceph osd pool delete rook rook --yes-i-really-really-mean-it

将 替换为要删除的池的名称。请注意,这是一个不可逆的操作,所有池中的数据将被永久删除。因此,请谨慎执行此命令,并确保已备份重要数据。

  1. 确认删除:运行以下命令确认池已被删除:
ceph osd lspools

检查输出中是否不再包含已删除的池。
请注意,删除池是一个潜在的危险操作,需要谨慎处理。在执行删除操作之前,请确保已备份重要数据,并确保不再需要该池中的任何数据。建议在删除池之前,仔细评估并确认操作的后果,并参考 Ceph 官方文档获取更多详细的指导和建议。

在k8s集群内使用块设备

块存储允许单个 Pod 挂载存储。官网参考文档:https://rook.io/docs/rook/v1.9/ceph-block.html

创建块池和StorageClass

  1. 编辑storageclass.yaml
# 指定所使用的API版本,这里使用的是Ceph Rook的API版本
apiVersion: ceph.rook.io/v1
# 指定资源的类型为CephBlockPool,表示创建一个Ceph块池。
kind: CephBlockPool
# 元数据部分,用于定义资源的元数据信息。
metadata:
  # 指定资源的名称为"replicapool",这是创建的Ceph块池的名称。
  name: replicapool
  # 指定资源所属的命名空间为"rook-ceph",命名空间用于对资源进行逻辑隔离和管理。
  namespace: rook-ceph
# 规格部分,用于定义资源的配置规格
spec:
  # 指定故障域为"host",表示块池的数据副本将在不同的主机上进行分布,以提高数据的容错性和可用性。
  failureDomain: host
  # 指定块池的复制方式为"replicated",表示数据将以复制的方式进行存储。
  replicated:
    # 指定复制的副本数为3,表示每个数据块将被复制为3个副本。
    size: 3
	# 设置为true,表示要求每个副本都处于安全状态,确保数据的完整性和可靠性。
    requireSafeReplicaSize: true
---
# 指定所使用的API版本,这里使用的是Kubernetes的存储API版本。
apiVersion: storage.k8s.io/v1
# 指定资源的类型为StorageClass,表示创建一个存储类。
kind: StorageClass
# 元数据部分,用于定义资源的元数据信息。
metadata:
  # 指定资源的名称为"rook-ceph-block",这是创建的存储类的名称。
  name: rook-ceph-block
# 指定存储类的提供者为"rook-ceph.rbd.csi.ceph.com",表示使用Rook Ceph提供的CSI插件进行存储。
provisioner: rook-ceph.rbd.csi.ceph.com
# 参数部分,用于定义存储类的配置参数
parameters:
  # 指定集群ID为"rook-ceph",表示使用名为"rook-ceph"的Ceph集群。
  clusterID: rook-ceph # namespace:cluster
  # 指定使用的Ceph块池为"replicapool",表示存储数据的块池名称。
  pool: replicapool
  # 指定存储的镜像格式为"2",表示使用Ceph的版本2镜像格式。
  imageFormat: "2"
  # 指定镜像特性为"layering",表示启用镜像层级特性。
  imageFeatures: layering
  # 指定CSI插件的提供者密钥名称为"rook-csi-rbd-provisioner",用于访问Rook Ceph提供的存储。
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
  # 指定CSI插件的提供者密钥所在的命名空间为"rook-ceph"。
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  # 指定CSI插件的控制器扩展密钥名称为"rook-csi-rbd-provisioner"。
  csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
  # 指定CSI插件的控制器扩展密钥所在的命名空间为"rook-ceph"。
  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
  # 指定CSI插件的节点阶段密钥名称为"rook-csi-rbd-node"。
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
  # 指定CSI插件的节点阶段密钥所在的命名空间为"rook-ceph"。
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
  # 指定文件系统类型为"ext4",表示使用ext4文件系统进行挂载。
  csi.storage.k8s.io/fstype: ext4
# 设置为true,表示允许对该存储类的卷进行扩展。
allowVolumeExpansion: true
# 指定回收策略为"Delete",表示当卷被删除时,相关的存储资源也会被删除。
reclaimPolicy: Delete
  1. 创建资源
kubectl create -f deploy/examples/csi/rbd/storageclass.yaml

9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes
9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes
9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes
ALLOWVOLUMEEXPANSION是Kubernetes中存储类(StorageClass)的一个属性,用于指示该存储类是否允许卷的扩展(容量增加)。
当存储类的 ALLOWVOLUMEEXPANSION 属性设置为 true 时,表示该存储类允许动态卷的扩展。这意味着在使用该存储类创建的卷上,可以通过修改卷的容量来增加其存储空间。扩展卷的过程可以是在线的,而不需要中断应用程序的运行。
如果存储类的 ALLOWVOLUMEEXPANSION 属性设置为 false 或未设置(默认值为 false),则不允许对使用该存储类创建的卷进行扩展。在这种情况下,如果需要增加卷的容量,通常需要创建一个新的卷,并将数据从旧卷迁移到新卷。
要注意的是,存储后端必须支持卷的扩展功能,并且相应的存储插件和驱动程序也必须进行相应的配置和支持。因此,在使用 ALLOWVOLUMEEXPANSION 属性之前,需要确保存储后端和相关组件都支持卷扩展操作。
要查看存储类是否允许卷扩展,可以使用 kubectl describe storageclass <storageclass_name> 命令,并查找 AllowVolumeExpansion 字段的值。

使用存储

下述操作可直接在kubesphere中可视化操作

  1. 创建PVC资源

9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes
上述操作生成的资源文件内容如下:

# 指定要创建的资源类型为持久卷声明
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
	# 指定持久卷声明的名称为 "rook-ceph-block-pvc"
  name: rook-ceph-block-pvc
  namespace: rook-ceph
  annotations:
    kubesphere.io/creator: admin
    pv.kubernetes.io/bind-completed: 'yes'
    pv.kubernetes.io/bound-by-controller: 'yes'
    volume.beta.kubernetes.io/storage-provisioner: rook-ceph.rbd.csi.ceph.com
    volume.kubernetes.io/storage-provisioner: rook-ceph.rbd.csi.ceph.com
  finalizers:
    - kubernetes.io/pvc-protection
# 指定持久卷声明的规格和配置
spec:
  # 指定卷的访问模式,这里使用了 "ReadWriteOnce",表示该卷可以被单个节点以读写方式挂载。
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      # # 指定需要 10GB 的存储容量
      storage: 10Gi
  volumeName: pvc-23ae523d-6b0c-423f-b2ed-748a7758d7b9
  # # 指定存储类的名称为 "rook-ceph-block"。这将告诉 Kubernetes 使用名为 "rook-ceph-block" 的存储类来提供持久卷。
  storageClassName: rook-ceph-block
  volumeMode: Filesystem
  1. pod引用PVC
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
    tier: mysql
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
        - image: mysql:5.6
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: changeme
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pv-claim

块存储映射问题处理

问题现象

参考:https://rook.io/docs/rook/v1.9/ceph-block.html

当操作执行如下命令:

kubectl create -f deploy/examples/csi/rbd/storageclass.yaml
kubectl create -f mysql.yaml
kubectl create -f wordpress.yaml

上述命令执行现象如下:
9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes

事件分析

	MountVolume.MountDevice failed for volume "pvc-541330c2-c399-4d33-a6dc-a2e1146ae87d" : rpc error: code = Internal desc = rbd: map failed with error an error (exit status 95) occurred while running rbd args: [--id csi-rbd-node -m 192.168.31.24:6789,192.168.31.20:6789,192.168.31.25:6789 --keyfile=***stripped*** map replicapool/csi-vol-b6def63c-afa0-11ee-a3c0-923efe8ba7cc --device-type krbd --options noudev], rbd error output: rbd: sysfs write failed rbd: map failed: (95) Operation not supported

具体是由于 rbd(RADOS Block Device)映射失败而导致的。错误消息中提到了 “Operation not supported”,这可能是由于以下原因之一引起的:

  1. 内核模块未加载:确保在执行 rbd 操作之前,已加载了正确的内核模块。在节点上执行以下命令加载内核模块: modprobe rbd
  2. 缺少依赖软件包:确保节点上安装了必要的软件包,包括 Ceph 和 RBD 相关的软件包。具体所需的软件包可能因操作系统和安装方式而异。请参考 Ceph 和 Rook 的官方文档,查找正确的软件包依赖关系并进行安装。
  3. 内核版本不兼容:某些内核版本可能不完全支持 rbd 映射功能。尝试升级或更换到支持的内核版本。请参考 Ceph 和 Rook 的官方文档,了解支持的内核版本要求。
  4. 硬件限制:某些硬件环境可能不支持 rbd 映射操作。确保硬件环境满足 rbd 映射的要求。如果使用的是虚拟化环境,请检查虚拟化平台的文档,确认是否支持 rbd 映射。
  5. SELinux 或安全策略限制:如果启用了 SELinux 或其他安全策略,可能会限制 rbd 映射操作。请检查安全策略配置,并相应地调整以允许 rbd 映射。

请根据你的环境和具体情况逐一检查这些可能的原因,并采取适当的措施来解决问题。如果问题仍然存在,建议参考 Ceph、Rook 和 Kubernetes 相关的官方文档和社区支持资源,以获取更深入的故障排除和解决方案。

Unable to attach or mount volumes: unmounted volumes=[wordpress-persistent-storage], unattached volumes=[kube-api-access-54dwt wordpress-persistent-storage]: timed out waiting for the condition

这个错误消息表明在附加或挂载卷时遇到了问题。错误消息中提到了超时等待条件,可能是由于以下原因之一引起的:

  1. 存储类配置错误:检查所使用的存储类(StorageClass)配置是否正确。确保存储类指定了正确的卷插件和参数,并与底层存储系统兼容。可以通过运行 kubectl describe storageclass 命令来查看存储类的详细信息,并确保其配置正确。
  2. 存储系统故障:如果底层存储系统出现故障或不可用,可能导致挂载卷超时。确保存储系统正常运行,并且与 Kubernetes 集群连接正常。检查存储系统的日志和状态,以确定是否存在任何问题。
  3. 节点资源不足:如果节点上的资源(例如 CPU、内存、存储)不足,可能导致挂载卷超时。检查节点的资源使用情况,确保节点具有足够的资源来处理卷挂载操作。
  4. 网络问题:网络问题可能导致挂载卷超时。确保网络连接正常,并且 Kubernetes 集群中的各个组件可以相互通信。检查网络配置和防火墙设置,确保没有阻止卷挂载所需的流量。
  5. 存储系统性能问题:如果底层存储系统的性能不足,可能导致挂载卷超时。检查存储系统的性能指标,并确保其能够处理所需的读写操作。

在解决问题之前,建议备份重要数据,并参考 Kubernetes 和底层存储系统的官方文档,以获取更详细的故障排除步骤和支持。此外,查看 Kubernetes 事件日志和存储系统日志,以获取更多关于超时问题的详细信息。

0/8 nodes are available: 8 pod has unbound immediate PersistentVolumeClaims.

这个错误消息表明在调度 Pod 时遇到了问题,没有可用的节点。错误消息中提到有 8 个 Pod 的 PersistentVolumeClaims(PVC)处于未绑定状态,这可能是由以下原因之一引起的:

  1. 存储类配置错误:检查所使用的存储类(StorageClass)配置是否正确。确保存储类指定的卷插件和参数与底层存储系统兼容,并且有足够的可用存储容量。如果存储类配置错误,可能导致 PVC 无法绑定到可用的持久卷(PersistentVolume)。
  2. 持久卷不足:如果没有足够的可用持久卷来满足 PVC 的需求,可能导致 PVC 无法绑定。检查持久卷的状态和可用性,确保有足够的持久卷供应给 PVC 使用。
  3. 节点资源不足:如果节点上的资源(例如 CPU、内存、存储)不足,可能导致 Pod 无法调度。检查节点的资源使用情况,确保节点具有足够的资源来运行 Pod,并满足 PVC 的需求。
  4. 节点标签不匹配:如果节点的标签与 Pod 的调度要求不匹配,可能导致 Pod 无法调度到节点上。检查节点的标签和 Pod 的调度要求,确保它们匹配。
  5. 网络问题:网络问题可能导致节点无法与存储系统通信,从而导致 PVC 无法绑定。确保网络连接正常,并且节点可以访问存储系统。
  6. 存储系统故障:如果底层存储系统出现故障或不可用,可能导致 PVC 无法绑定。检查存储系统的状态和日志,以确定是否存在任何问题。

解决此问题的步骤可能包括检查存储类配置、持久卷可用性、节点资源、节点标签和网络连接。此外,查看 Kubernetes 事件日志和存储系统日志,以获取更多关于 PVC 绑定问题的详细信息。如果问题仍然存在,建议参考 Kubernetes 和底层存储系统的官方文档,以获取更详细的故障排除步骤和支持。

csi-rbdplugin pod日志分析

W0110 10:42:47.457179   30223 rbd_attach.go:226] nbd modprobe failed (an error (exit status 1) occurred while running modprobe args: [nbd]): "modprobe: FATAL: Module nbd not found in directory /lib/modules/3.10.0-862.el7.x86_64\n"

错误消息 “modprobe: FATAL: Module nbd not found in directory /lib/modules/3.10.0-862.el7.x86_64” 表明在您的 CentOS 系统中找不到名为 “nbd” 的内核模块。
nbd 是 Network Block Device 的缩写,它允许通过网络连接将远程块设备映射到本地系统。通常,nbd 模块应该存在于 /lib/modules/<kernel_version> 目录中,其中 <kernel_version> 是您当前使用的内核版本。

W0111 01:23:26.200423   43637 util.go:250] kernel 3.10.0-862.el7.x86_64 does not support required features

 W0111 01:23:26.814313   43637 rbd_attach.go:469] ID: 3562 Req-ID: 0001-0009-rook-ceph-0000000000000005-b22dcee8-b01d-11ee-879c-dab0780880f4 rbd: map error an error (exit status 95) occurred while running rbd args: [--id csi-rbd-node -m 192.168.31.25:6789,192.168.31.24:6789,192.168.31.20:6789 --keyfile=***stripped*** map replicapool/csi-vol-b22dcee8-b01d-11ee-879c-dab0780880f4 --device-type krbd --options noudev], rbd output: rbd: sysfs write failed

 rbd: map failed: (95) Operation not supported

错误消息 “rbd: map failed,kernel 3.10.0-862.el7.x86_64 does not support required features” 表明您的 CentOS 操作系统内核版本不支持所需的功能。
这个问题通常发生在使用 RBD (Rados Block Device) 时,该设备需要在内核中启用一些特定的功能。您的内核版本可能过旧,不支持所需的功能。
解决此问题的一种方法是升级您的内核版本。

问题小结

操作系统内核版本过低,内核中没有RBD内核模块,两种解决方案:(推荐安装rdb内核)

  1. 升级内核(影响大)
  2. 安装rdb内核模块(影响小)

CentOS 上升级内核可能对运行在其上的 Kubernetes (K8s) 环境产生一些影响。以下是一些可能的影响和注意事项:

  1. 容器运行时兼容性:在升级内核之前,您需要确保所选的内核版本与您使用的容器运行时兼容。不同的容器运行时可能对内核版本有特定的要求。您应该查看容器运行时的文档或支持页面,以了解其支持的内核版本范围。
  2. 内核模块和功能:升级内核可能会导致某些内核模块或功能的更改或移除。如果您的 Kubernetes 集群依赖于特定的内核模块或功能,您需要确保新的内核版本仍然支持这些要求。
  3. 容器网络:升级内核可能会对容器网络产生一些影响。某些网络插件或驱动程序可能需要与特定的内核版本配合使用。在升级内核之前,您应该检查您使用的容器网络插件或驱动程序的兼容性和支持情况。
  4. 安全性和性能改进:升级内核通常会带来安全性和性能方面的改进。新的内核版本可能修复了一些已知的漏洞或改进了系统性能。这些改进可能会对您的 Kubernetes 集群产生积极的影响,提供更好的安全性和性能。
  5. 测试和验证:在升级内核之前,建议您在非生产环境中进行测试和验证。您可以创建一个与生产环境相似的测试环境,并在该环境中进行内核升级。这样可以帮助您发现潜在的问题并解决它们,以确保升级过程顺利进行。

在进行任何重要的系统更改之前,包括内核升级,都建议您备份重要的数据和配置,以便在需要时进行恢复。此外,您还应该参考 CentOS 和 Kubernetes 的官方文档,以获取更详细的指导和建议,以确保您的升级过程正确无误。

CentOS 7 编译安装 nbd 模块

CentOS 7 编译安装 nbd 模块-CSDN博客
CentOS 7 安装 nbd - OrcHome

nbd内核模块介绍

“nbd” 是 Network Block Device(网络块设备)的缩写,它是一种允许通过网络连接将远程块设备映射到本地系统的内核模块。它提供了一种将远程存储设备(如硬盘、分区或镜像文件)映射为本地块设备的方法。
通过使用 nbd 内核模块,您可以在本地系统上像使用本地块设备一样使用远程存储设备。这对于需要远程访问和操作存储设备的应用程序和系统非常有用。
一些常见的用例包括:

  • 在分布式存储系统中使用 nbd 将远程存储设备映射到本地系统,以实现高可用性和容错性。
  • 在虚拟化环境中,将远程存储设备映射到虚拟机实例,以实现共享存储和迁移虚拟机的能力。
  • 在云环境中,将远程存储设备映射到云实例,以实现持久化存储和数据共享。

要使用 nbd 内核模块,您需要加载该模块到内核中,并使用相应的工具配置和管理映射的远程块设备。具体操作和配置可能因操作系统和使用的工具而有所不同。
请注意,nbd 内核模块的可用性和功能取决于您的操作系统和内核版本。某些发行版可能已经将 nbd 内核模块包含在默认内核中,而其他发行版可能需要手动安装和配置。
在 Linux 系统中,nbd 内核模块通常位于 /lib/modules/<kernel_version>/kernel/drivers/block/nbd.ko 路径下,其中 <kernel_version> 是您当前使用的内核版本。
如果您需要使用 nbd 内核模块,请确保您的系统具有适当的权限,并按照操作系统和工具的文档进行安装和配置。

安装 nbd 模块

  1. 确认nbd内核模块是否安装
[root@localhost ~]# modprobe nbd
modprobe: FATAL: Module nbd not found.
  1. 查看 linux 版本
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)   #查看系统版本
 
[root@localhost ~]# uname -r         #查看linux的内核信息
3.10.0-957.el7.x86_64
  1. 安装相关包
yum install kernel-devel kernel-headers elfutils-libelf-devel gcc+ gcc-c++ -y
  1. 下载内核包

找对应的kernel源码包,一般yum都是升级到最新的,因此到 http://vault.centos.org/ 的整个7系列的最新版本目录下去找:

wget https://vault.centos.org/7.9.2009/os/Source/SPackages/kernel-3.10.0-1160.el7.src.rpm

# 根据自己的系统版本去下载
# 7.9.2009                为 redhat-release 系统版本
# 3.10.0-1160.102.1.el7   为 uname -r 内核信息
  1. 编译

安装bzip2

sudo yum install bzip2

开始编译

rpm -ivh kernel-3.10.0-957.el7.src.rpm
 
cd ~/rpmbuild/SOURCES/

# 验证文件,如果显示的类型不是 "XZ compressed data",则可能是文件本身损坏或者文件类型不正确。
file linux-3.10.0-862.el7.tar.xz

#解压 -C 指定目录 /usr/src/kernels
tar Jxvf linux-3.10.0-957.el7.tar.xz -C /usr/src/kernels/
# 注意,这里使用的是大写的 J 选项,而不是之前的小写 j 选项。J 选项告诉 tar 命令使用 xz 工具来解压缩文件。
 
#解压后生成两个文件
ll /usr/src/kernels/
drwxr-xr-x. 22 root root 4096 96 08:07 3.10.0-957.27.2.el7.x86_64
drwxrwxr-x. 24 root root 4096 96 08:17 linux-3.10.0-957.el7

###############################
cd /usr/src/kernels/linux-3.10.0-957.el7
 
#删除所有编译生成文件,内核配置文件
make mrproper
 
cp /usr/src/kernels/3.10.0-957.27.2.el7.x86_64/Module.symvers ./
 
cp /boot/config-3.10.0-957.el7.x86_64 ./.config
 
#备份当前.config文件为.config.old
make oldconfig
 
make prepare
 
make scripts
  1. 编译

修改配置

vi drivers/block/nbd.c

#######################
// sreq.cmd_type = REQ_TYPE_SPECIAL;
sreq.cmd_type = 7;  #修改为7

编译

make CONFIG_BLK_DEV_NBD=m M=drivers/block

如果报以下错误:

make[1]: *** No rule to make target tools/objtool/objtool', needed bydrivers/block/floppy.o'. Stop.

则执行:

make CONFIG_BLK_DEV_NBD=m M=drivers/block CONFIG_STACK_VALIDATION=
  1. 复制文件
cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/

depmod -a
  1. 验证nbd是否安装成功
modinfo nbd

输出

filename:       /lib/modules/3.10.0-1160.102.1.el7.x86_64/kernel/drivers/block/nbd.ko
license:        GPL
description:    Network Block Device
retpoline:      Y
rhelversion:    7.9
srcversion:     171F87FBEBE350C33C34226
depends:        
vermagic:       3.10.0 SMP mod_unload modversions 
parm:           nbds_max:number of network block devices to initialize (default: 16) (int)
parm:           max_part:number of partitions per device (default: 0) (int)
parm:           debugflags:flags for controlling debug output (int)

重新使用块存储验证

  1. 重建驱动程序
kubectl delete po -l app=csi-cephfsplugin-provisioner -n rook-ceph
kubectl delete po -l app=csi-rbdplugin-provisioner -n rook-ceph
kubectl delete po -l app=csi-rbdplugin -n rook-ceph
kubectl delete po -l app=csi-cephfsplugin -n rook-ceph
  1. 查看csi-rbdplugin
 W0111 05:13:24.427112   65526 util.go:250] kernel 3.10.0-862.el7.x86_64 does not support required features

 W0111 05:13:24.427606   65526 rbd_attach.go:241] kernel version "3.10.0-862.el7.x86_64" doesn't support cookie feature

最终确认是centos内核不支持,建议使用centos8或者升级centos,建议依据如下:

升级centos验证

先升级CentOS 操作系统验证,你可以按照以下步骤进行操作:

  1. 备份数据:在进行任何操作之前,强烈建议你备份重要的数据。升级过程可能会对系统进行更改,因此备份可以保护你的数据免受意外损失。
  2. 更新当前系统:在升级之前,确保你的当前系统已经是最新的状态。运行以下命令来更新已安装的软件包:
sudo yum update -y

这将更新系统上的所有已安装软件包到最新版本。

  1. 安装升级工具:CentOS 提供了一个名为 yum-utils 的软件包,其中包含了用于升级 CentOS 的工具。如果你的系统上没有安装该软件包,可以通过以下命令进行安装:
sudo yum install yum-utils
  1. 运行系统升级:一旦你安装了 yum-utils 工具,你可以使用 yum 命令来执行实际的系统升级。运行以下命令来升级 CentOS:
sudo yum upgrade

这将检查可用的更新并升级系统上的软件包。根据系统的大小和网络速度,升级过程可能需要一些时间。

  1. 重启系统:升级完成后,建议重新启动系统以应用所有更改。使用以下命令重新启动系统:
sudo reboot

# 重启后内核才会重新加载
  1. 验证升级:系统重新启动后,可以通过运行以下命令来验证 CentOS 的版本:
[root@ksnode25 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

[root@ksnode25 ~]# uname -r
3.10.0-1160.105.1.el7.x86_64

[root@ksnode25 ~]# modprobe nbd
modprobe: FATAL: Module nbd not found.

升级后nbd需要重新安装
9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes

重新运行发现运行正常

kubectl create -f mysql.yaml
kubectl create -f wordpress.yaml

9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes
查看rdb映射情况,进入mon pod终端执行:rbd showmapped
9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes
进入升级centos机器查看dev设备信息如下,说明验证成功
9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes

验证小结

升级centos后部署成功,由于centos不在维护,生产环境建议更换操作系统:
9.云原生存储之ceph在k8s中应用及问题处理,私有云+云原生实战,云原生,ceph,kubernetes

  1. Pacific(16.2.z)支持centos7和8
  2. ceph客户端发现只有el8版本,https://mirrors.aliyun.com/ceph/rpm-16.2.10/el8/x86_64/
  3. CentOS Linux停止维护,推出了CentOS Stream项目
  4. 查看rook-ceph-tools系统版本:CentOS Stream release 8

总结:综合上图可选择centos8和Ubuntu20.04替换centos7,但是生产环境不建议使用CentOS Linux(停止维护),也不建议使用CentOS Stream(无法保证系统的稳定性与兼容性),老项目不建议更换操作系统稳定运行就行。新项目可以考虑使用其他稳定操作系统。

操作系统选择考虑

CentOS 7 停止维护后如何平替你的生产系统?
从习惯和兼容性考虑,CentOS Linux 和 Rocky Linux。您可能想知道Rocky Linux是否适合您。如果您依赖CentOS而不想运行CentOS Stream或为RHL付费,那么当稳定版本可用时,您可以考虑Rocky Linux 。
rockylinux安装包下载_开源镜像站-阿里云
重庆大学开源软件镜像站
CentOS Linux 和 Rocky Linux 都是基于 RHEL(Red Hat Enterprise Linux)的操作系统,它们有很多相似之处,但也有一些区别。

  1. 起源和维护:
    • CentOS Linux:CentOS Linux 是一个由社区维护的开源操作系统,它是基于 RHEL 的重构版本。在过去,CentOS Linux 通过重新编译 RHEL 的源代码来创建一个免费的替代品,并提供长期支持。
    • Rocky Linux:Rocky Linux 是由 CentOS 创始人之一创建的一个社区驱动的企业级操作系统。它的目标是提供一个免费、开源的替代方案,以填补 CentOS Linux 停止维护的空白。
  2. 继承和兼容性:
    • CentOS Linux:CentOS Linux 的目标是与 RHEL 完全兼容,并提供与 RHEL 相同的功能和特性。它通常会在 RHEL 发布后的一段时间内推出相应的更新,以确保与 RHEL 的兼容性。
    • Rocky Linux:Rocky Linux 也是基于 RHEL 的代码构建的,旨在提供与 RHEL 完全兼容的功能和特性。它的设计目标是与 CentOS Linux 8 的二进制兼容,以便用户可以平滑地从 CentOS Linux 迁移到 Rocky Linux。
  3. 社区支持:
    • CentOS Linux:CentOS Linux 依赖于社区支持,用户可以通过邮件列表、论坛和社区文档等途径获取帮助。在过去,CentOS 社区一直提供了广泛的支持和资源。
    • Rocky Linux:Rocky Linux 同样依赖于社区支持,它的目标是建立一个活跃的社区,提供用户支持和贡献。

总的来说,CentOS Linux 和 Rocky Linux 在目标和理念上非常相似,都致力于提供一个免费、开源的 RHEL 替代方案。主要区别在于起源和维护方面,以及社区的背景和发展。如果你已经在使用 CentOS Linux,Rocky Linux 可能是一个平滑的过渡选择,因为它的设计目标是与 CentOS Linux 8 兼容。无论选择哪个操作系统,都需要评估其社区支持、更新和兼容性等因素,以选择适合你需求的操作系统。

Rocky 8替换k8s节点验证

不管是将centos7升级还是替换为Rocky 8,都要考虑对k8s集群的影响,防止操作将k8s搞崩溃,小编这儿推荐一种做法:文章来源地址https://www.toymoban.com/news/detail-819091.html

  1. 验证可行版本的centos后,将其加入k8s集群
  2. 保证可行版本的centos集群有,etcd、控制面板、worker节点
  3. 下架以前的老节点

到了这里,关于9.云原生存储之ceph在k8s中应用及问题处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生Kubernetes:K8S存储卷

    目录 一、理论 1.存储卷 2.emptyDir 存储卷 3.hostPath卷 4.NFS共享存储 5.PVC 和 PV 6.静态创建PV 7.动态创建PV 二、实验  1.emptyDir 存储卷 2.hostPath卷 3.NFS共享存储 4.静态创建PV 5.动态创建PV 三、问题 1.生成pod一直pending 2.shoumount -e未显示共享目录 3.静态创建pv 报错 4.使用 Deployment 来创建

    2024年02月07日
    浏览(74)
  • K8s 持久化存储有几种方式?一文了解本地盘/CSI 外接存储/K8s 原生存储的优缺点

    当今云原生环境中,Kubernetes(K8s)已成为既定的容器编排工具。随着 K8s 的普及,存储也成为 K8s 用户关注的一个重要问题:为了满足不同的场景需求,K8s 可以支持基于不同架构的多种存储方案。这些方案间有什么区别?用户应如何选择? 本文将从架构角度出发,详细介绍本

    2024年02月10日
    浏览(46)
  • 云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

    基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。 Note: 由于是测试环境,以下创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。 共用到了三台

    2024年02月19日
    浏览(48)
  • 【云原生】K8S存储卷:PV、PVC详解

    容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共

    2024年02月12日
    浏览(42)
  • 【云原生-Kubernetes篇】K8s的存储卷/数据卷+PV与PVC

    容器部署过程中一般有以下三种数据: • 启动时需要的 初始数据 :例如配置文件 (init container) • 启动过程中产生的 临时数据 :该临时数据需要多个容器间共享 • 启动过程中产生的 持久化数据 :例如MySQL的data目录 (业务数据–很重要) 而容器中的文件在磁盘上是 临时

    2024年02月05日
    浏览(41)
  • 【云原生,k8s】Helm应用包管理器介绍

    目录 一、为什么需要Helm? (一)Helm介绍 (二)Helm有3个重要概念: (三)Helm特点 二、Helm V3变化 (一)架构变化 (二)自动创建名称空间 三、Helm应用包管理器部署 1、部署Helm客户端工具 2、Helm常用命令 3、配置国内的Chart仓库 4、使用chart部署一个Nginx应用 5、使用chart部

    2024年02月12日
    浏览(36)
  • 【云原生、k8s】管理Kubernetes应用搭建与部署

    官方提供Kubernetes部署3种方式 (一)minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。 官方文档:https://kubernetes.io/docs/setup/minikube/ (二)二进制包 从官方下载发行版的二进制包,手动部署每个组件,

    2024年01月21日
    浏览(78)
  • 云原生Kubernetes:简化K8S应用部署工具Helm

    目录 一、理论 1.HELM ​编辑 2.部署HELM2 3.部署HELM3(2to3方式) 4.部署HELM3(单独安装) 二、实验 1.部署 HELM2 2.部署HELM3(2to3方式) 3.部署HELM3(单独安装) 三、问题 1.api版本过期 2.helm初始化报错 3.pod状态为ImagePullBackOff 4.helm 命令显示 no repositories to show 的错误 5.Helm安装报错

    2024年02月07日
    浏览(65)
  • 后端SpringBoot应用向云原生K8S平台迁移

    传统后端Java Spring单体架构在向微服务架构升级的过程中,我们引入了Spring Cloud(Netflex、Alibaba等)框架,Spring Cloud帮我们解决了分布式服务的注册发现、服务的动态配置等等。以目前国内比较流行的Spring Cloud Alibaba为例,我们需要在我们的代码中集成Spring Cloud Alibaba的相关依

    2024年02月13日
    浏览(44)
  • 云上攻防-云原生篇&K8s安全&Config泄漏&Etcd存储&Dashboard鉴权&Proxy暴露

    如上图所示:etcd服务是运行在master节点上的,master节点上查看该服务 默认通过证书认证,主要存放节点的数据,如一些token和证书。 当然,初始安全情况下,该服务是安全的(2379不对外开放,本地可访问),下面三种主要是配置问题 配置文件:/etc/kubernetes/manifests/etcd.yaml 注释

    2024年02月08日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包