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

文章目录

  • ceph应用场景
  • ceph应用
    • 在k8s集群外使用块设备
      • ceph客户端配置
      • 创建块挂载使用
      • 删除pool
    • 在k8s集群内使用块设备
      • 创建块池和StorageClass
      • 使用存储
  • 块存储映射问题处理
    • 问题现象
    • 事件分析
    • csi-rbdplugin pod日志分析
    • 问题小结
    • CentOS 7 编译安装 nbd 模块
      • nbd内核模块介绍
      • 安装 nbd 模块
    • 重新使用块存储验证
      • 升级centos验证
      • 验证小结
      • 操作系统选择考虑
    • Rocky 8替换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

image.png

删除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

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

使用存储

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

  1. 创建PVC资源

image.pngimage.png
上述操作生成的资源文件内容如下:

# 指定要创建的资源类型为持久卷声明
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

上述命令执行现象如下:
image.png

事件分析

	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需要重新安装
image.png

重新运行发现运行正常

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

image.png
查看rdb映射情况,进入mon pod终端执行:rbd showmapped
在这里插入图片描述
进入升级centos机器查看dev设备信息如下,说明验证成功
在这里插入图片描述

验证小结

升级centos后部署成功,由于centos不在维护,生产环境建议更换操作系统:

  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搞崩溃,小编这儿推荐一种做法:

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

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

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

相关文章

模型评估:ROC曲线

二值分类器&#xff08;Binary Classifier&#xff09;是机器学习领域中最常见也是应用最广泛的分类器。评价二值分类器的指标很多&#xff0c;比如precision、recall、F1 score、P-R曲线等。相比而言&#xff0c;ROC曲线有很多优点&#xff0c;经常作为评估而知分类器最重要的…

web前端算法简介之栈

栈 栈的基本操作包括&#xff1a; 初始化栈&#xff08;InitStack&#xff09;&#xff1a;判断栈是否为空&#xff08;IsStackEmpty&#xff09;&#xff1a;入栈&#xff08;Push&#xff09;&#xff1a;出栈&#xff08;Pop&#xff09;&#xff1a;获取栈顶元素&#xff0…

【动态规划】 【字典树】C++算法:472 连接词

作者推荐 【动态规划】458:可怜的小猪 涉及知识点 动态规划 字典树 LeetCode472 连接词 给你一个 不含重复 单词的字符串数组 words &#xff0c;请你找出并返回 words 中的所有 连接词 。 连接词 定义为&#xff1a;一个完全由给定数组中的至少两个较短单词&#xff08;不…

Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent

文章目录 概述Code源码分析 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#xff0c;使得应用程序中的不同组件可以独立地改变和复用逻辑&#xff0c;而无需直接进行通信。 …

C#上位机与欧姆龙PLC的通信11----【爆肝】上位机应用开发(Winform版)

1、先上图 前面10讲&#xff0c;让你爽煹了肝&#xff0c;已经进入最后收尾阶段&#xff0c;这节来个常规应用&#xff0c;让前面的技能直接飞上天&#xff0c;我们要做的界面软件是这样的&#xff0c;虽然没有潘金莲漂亮&#xff0c;但也是爆抱&#xff1a; 2、如何爆&#x…

win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程

Windows系统搭建我的世界世界服务器&#xff0c;Minecraft开服教程&#xff0c;小白开服教程&#xff0c;MC 1.19.4版本服务器搭建教程。 此教程使用 Mohist 1.19.4 服务端&#xff0c;此服务端支持Forge模组和Bukkit/Spigot/Paper插件&#xff0c;如果需要开其他服务端也可参…

应用在LCD显示器电源插头里的氮化镓(GaN)MTC-65W1C

LCD&#xff08;Liquid Crystal Display&#xff09;显示器是利用液晶显示技术来进行图像表现的显示装置&#xff0c;从液晶显示器的结构来看&#xff0c;无论是笔记本电脑还是桌面系统&#xff0c;采用的LCD显示屏都是由不同部分组成的分层结构。LCD显示器按照控制方式不同可分…

网络编程的理论基础

文章目录 1 重点知识2 应用层3 再谈 "协议"4 HTTP协议4.1 认识URL4.2 urlencode和urldecode4.3 HTTP协议格式4.4 HTTP的方法4.5 HTTP的状态码4.6 HTTP常见Header4.7 最简单的HTTP服务器 3 传输层4 再谈端口号4.1 端口号范围划分4.2 认识知名端口号(Well-Know Port Nu…

2024美赛数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

Linux动态分配IP与正向解析DNS

目录 一、DHCP分配 1. 动态分配 1.1 服务端服务安装 1.2 修改服务端dhcp配置 1.3 修改客户端dhcp&#xff0c;重启查询网卡信息 2. 根据mac固定分配 2.1 修改服务器端dhcp服务配置 2.2 客户端自动获取&#xff0c;查看网卡信息 二、时间同步 1. 手动同步 2. 自动同…

小汪,TCP连接和断连夺命6连问你可能扛得住?

目录 TCP三次握手连接和四次挥手断连的几处疑问 一、建立连接&#xff0c;为什么是三次握手&#xff0c;而不是二次握手&#xff1f; 二、为什么每次建立 TCP 连接时&#xff0c;初始化的序列号都要求不一样呢&#xff1f; 三、断开连接&#xff0c;为什么是四次握手&#x…

【C语言】ipoib驱动 - ipoib_cm_post_receive_srq_rss函数

一、ipoib_cm_post_receive_srq_rss函数定义 static int ipoib_cm_post_receive_srq_rss(struct net_device *dev,int index, int id) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_recv_ring *recv_ring priv->recv_ring index;struct ib_sge *sge;stru…

聚乙烯PE的特性有哪些?UV胶水能够粘接聚乙烯PE吗?

聚乙烯&#xff08;Polyethylene&#xff0c;PE&#xff09;是一种聚合物&#xff0c;是由乙烯&#xff08;ethylene&#xff09;单体通过聚合反应形成的合成塑料。以下是聚乙烯的一些主要化学特性&#xff1a; 1.化学式&#xff1a; 聚乙烯的基本化学式是 (C2H4)n&#xff0c;…

Camunda Sub Process

一&#xff1a;内嵌子流程 repositoryService.createDeployment().name("内嵌子流程").addClasspathResource("bpmn/embed_sub_process.bpmn").deploy(); identityService.setAuthenticatedUserId("huihui"); ProcessInstance processInstance …

【已解决】c++如何打印变量的类型

本博文源于笔者正在编写的c代码&#xff0c;在c/c中我们经常用auto去接一个变量&#xff0c;这样我们既可以不用知道变量或函数结果的类型&#xff0c;就可以轻松愉快编码&#xff0c;如果想要知道变量的类型呢&#xff1f;那就需要这样一个函数。 问题再现 想要用函数去打印…

使用numpy处理图片——90度旋转

在《使用numpy处理图片——镜像翻转和旋转》一文中&#xff0c;我们介绍了如何将图片旋转的方法。本文将使用更简单的方法旋转图片90度。 左旋转90度 import numpy as np import PIL.Image as Imagedata np.array(Image.open(the_starry_night.jpg))# left 90 rot90LeftWith…

SQL-条件查询与聚合函数的使用

目录 DQL-条件查询 1.语法 2.条件 常用的比较运算符如下: 常用的逻辑运算符如下: 案例: 聚合函数 1.常见的聚合函数 2.聚合函数的语法 案例&#xff1a; &#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客…

pycharm导入etree报Cannot find reference ‘etree‘ in ‘__init__.py‘ more... (Ctrl+F1)

问题 发现 from lxml import etree的时候&#xff0c;etree报错了。提示Cannot find reference etree in __init__.py more... (CtrlF1)。 解决办法 后面发现是pycharm自己的BUG&#xff0c;所以写了新的写法

turnjs实现翻书效果

需求&#xff1a;要做一个效果&#xff0c;类似于阅读器上的翻书效果。 咱们要实现这个需求就需要使用turnjs这个插件&#xff0c;他的官网是turnjs官网。 进入官网后可以点击 这个按钮去下载官网的demo。 这个插件依赖于jQuery&#xff0c;所以你的先安装jQuery. npm insta…

SwiftUI之深入解析Frame Behaviors

一、Frame 简介 当开始使用 SwiftUI 时&#xff0c;可能接触到的第一个修饰符是 frame(width:height:alignment)&#xff0c;定义 frame 是 SwiftUI 最具挑战性的任务之一&#xff0c;当我们使用修饰符&#xff08;如 .frame().&#xff09;时&#xff0c;会发生很多事情。Swi…
最新文章