使用外部 Ceph 驱动

本文介绍如何在 RKE2 集群中使用外部 Ceph 驱动。如果你使用的是 RKE,则需要执行其他步骤。详情请参阅本节

要求

确保 ceph-common 和 xfsprogs 软件包安装在 SLE worker 节点上。

在 RKE 中使用 Ceph 驱动

以下资源与 RKE 集群完全兼容,但需要为 RKE 执行额外的 kubelet 配置。

在 RKE 集群上,kubelet 组件在 Docker 容器中运行,默认情况下无法像 rbd 和 libceph 一样访问主机的内核模块。

为了解决这个限制,你可以在 worker 节点上运行 modprobe rbd,或者配置 kubelet 容器以将主机中的 /lib/modules 目录自动挂载到容器中。

对于 kubelet 配置,在 RKE 集群配置之前,将以下内容放入 cluster.yml 文件中。你稍后还可以在 Rancher UI 中通过单击编辑集群 > 以 YAML 文件编辑并重新启动 worker 节点来修改 cluster.yml

  1. services:
  2. kubelet:
  3. extra_binds:
  4. - '/lib/modules:/lib/modules:ro'

有关 extra_binds 指令的更多信息,请参阅本节

在 RKE2 集群上安装 ceph-csi 驱动

使用外部 Ceph 驱动 - 图1备注

只有动态 RBD 配置需要执行这些步骤。

有关 ceph-csi-rbd chart 的更多信息,请参阅此页面

要获取有关 SES 集群的详细信息,请运行:

  1. ceph mon dump

查看输出:

  1. dumped monmap epoch 3
  2. epoch 3
  3. fsid 79179d9d-98d8-4976-ab2e-58635caa7235
  4. last_changed 2021-02-11T10:56:42.110184+0000
  5. created 2021-02-11T10:56:22.913321+0000
  6. min_mon_release 15 (octopus)
  7. 0: [v2:10.85.8.118:3300/0,v1:10.85.8.118:6789/0] mon.a
  8. 1: [v2:10.85.8.123:3300/0,v1:10.85.8.123:6789/0] mon.b
  9. 2: [v2:10.85.8.124:3300/0,v1:10.85.8.124:6789/0] mon.c

稍后你将需要 fsid 和 mon 地址值。

使用 Helm 安装 ceph-csi 驱动

运行以下命令:

  1. helm repo add ceph-csi https://ceph.github.io/csi-charts
  2. helm repo update
  3. helm search repo ceph-csi -l
  4. helm inspect values ceph-csi/ceph-csi-rbd > ceph-csi-rbd-values.yaml

修改 ceph-csi-rbd-values.yaml 文件并只保留所需的更改:

  1. # ceph-csi-rbd-values.yaml
  2. csiConfig:
  3. - clusterID: "79179d9d-98d8-4976-ab2e-58635caa7235"
  4. monitors:
  5. - "10.85.8.118:6789"
  6. - "10.85.8.123:6789"
  7. - "10.85.8.124:6789"
  8. provisioner:
  9. name: provisioner
  10. replicaCount: 2

确保可以从 RKE2 集群访问 ceph 监视器(例如通过 ping)。

  1. kubectl create namespace ceph-csi-rbd
  2. helm install --namespace ceph-csi-rbd ceph-csi-rbd ceph-csi/ceph-csi-rbd --values ceph-csi-rbd-values.yaml
  3. kubectl rollout status deployment ceph-csi-rbd-provisioner -n ceph-csi-rbd
  4. helm status ceph-csi-rbd -n ceph-csi-rbd

如果你想直接通过 Helm 修改配置,则可以使用 ceph-csi-rbd-values.yaml 文件并调用:

  1. helm upgrade \
  2. --namespace ceph-csi-rbd ceph-csi-rbd ceph-csi/ceph-csi-rbd --values ceph-csi-rbd-values.yaml

创建 RBD Ceph 资源

  1. # 创建一个 ceph 池:
  2. ceph osd pool create myPool 64 64
  3. # 创建一个块设备池:
  4. rbd pool init myPool
  5. # 创建一个块设备镜像:
  6. rbd create -s 2G myPool/image
  7. # 创建一个块设备用户并记录密钥:
  8. ceph auth get-or-create-key client.myPoolUser mon "allow r" osd "allow class-read object_prefix rbd_children, allow rwx pool=myPool" | tr -d '\n' | base64
  9. QVFDZ0R5VmdyRk9KREJBQTJ5b2s5R1E2NUdSWExRQndhVVBwWXc9PQ==
  10. # Base64 加密 ceph 用户 myPoolUser:
  11. echo "myPoolUser" | tr -d '\n' | base64
  12. bXlQb29sVXNlcg==
  13. # 创建一个块设备管理员并记录密钥:
  14. ceph auth get-or-create-key client.myPoolAdmin mds 'allow *' mgr 'allow *' mon 'allow *' osd 'allow * pool=myPool' | tr -d '\n' | base64
  15. QVFCK0hDVmdXSjQ1T0JBQXBrc0VtcVhlZFpjc0JwaStIcmU5M3c9PQ==
  16. # Base64 加密 ceph 用户 myPoolAdmin:
  17. echo "myPoolAdmin" | tr -d '\n' | base64
  18. bXlQb29sQWRtaW4=

配置 RBD Ceph 访问密钥

用户账号

对于静态 RBD 配置(ceph 池中的镜像必须存在),运行以下命令:

  1. cat > ceph-user-secret.yaml << EOF
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: ceph-user
  6. namespace: default
  7. type: kubernetes.io/rbd
  8. data:
  9. userID: bXlQb29sVXNlcg==
  10. userKey: QVFDZ0R5VmdyRk9KREJBQTJ5b2s5R1E2NUdSWExRQndhVVBwWXc9PQ==
  11. EOF
  12. kubectl apply -f ceph-user-secret.yaml

管理员账号

对于动态 RBD 配置(用于在给定 ceph 池中自动创建镜像),请运行以下命令:

  1. cat > ceph-admin-secret.yaml << EOF
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: ceph-admin
  6. namespace: default
  7. type: kubernetes.io/rbd
  8. data:
  9. userID: bXlQb29sQWRtaW4=
  10. userKey: QVFCK0hDVmdXSjQ1T0JBQXBrc0VtcVhlZFpjc0JwaStIcmU5M3c9PQ==
  11. EOF
  12. kubectl apply -f ceph-admin-secret.yaml

创建 RBD 测试资源

在 Pod 中使用 RBD

  1. # pod
  2. cat > ceph-rbd-pod-inline.yaml << EOF
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. name: ceph-rbd-pod-inline
  7. spec:
  8. containers:
  9. - name: ceph-rbd-pod-inline
  10. image: busybox
  11. command: ["sleep", "infinity"]
  12. volumeMounts:
  13. - mountPath: /mnt/ceph_rbd
  14. name: volume
  15. volumes:
  16. - name: volume
  17. rbd:
  18. monitors:
  19. - 10.85.8.118:6789
  20. - 10.85.8.123:6789
  21. - 10.85.8.124:6789
  22. pool: myPool
  23. image: image
  24. user: myPoolUser
  25. secretRef:
  26. name: ceph-user
  27. fsType: ext4
  28. readOnly: false
  29. EOF
  30. kubectl apply -f ceph-rbd-pod-inline.yaml
  31. kubectl get pod
  32. kubectl exec pod/ceph-rbd-pod-inline -- df -k | grep rbd

在持久卷中使用 RBD

  1. # pod-pvc-pv
  2. cat > ceph-rbd-pod-pvc-pv-allinone.yaml << EOF
  3. apiVersion: v1
  4. kind: PersistentVolume
  5. metadata:
  6. name: ceph-rbd-pv
  7. spec:
  8. capacity:
  9. storage: 2Gi
  10. accessModes:
  11. - ReadWriteOnce
  12. rbd:
  13. monitors:
  14. - 10.85.8.118:6789
  15. - 10.85.8.123:6789
  16. - 10.85.8.124:6789
  17. pool: myPool
  18. image: image
  19. user: myPoolUser
  20. secretRef:
  21. name: ceph-user
  22. fsType: ext4
  23. readOnly: false
  24. ---
  25. kind: PersistentVolumeClaim
  26. apiVersion: v1
  27. metadata:
  28. name: ceph-rbd-pvc
  29. spec:
  30. accessModes:
  31. - ReadWriteOnce
  32. resources:
  33. requests:
  34. storage: 2Gi
  35. ---
  36. apiVersion: v1
  37. kind: Pod
  38. metadata:
  39. name: ceph-rbd-pod-pvc-pv
  40. spec:
  41. containers:
  42. - name: ceph-rbd-pod-pvc-pv
  43. image: busybox
  44. command: ["sleep", "infinity"]
  45. volumeMounts:
  46. - mountPath: /mnt/ceph_rbd
  47. name: volume
  48. volumes:
  49. - name: volume
  50. persistentVolumeClaim:
  51. claimName: ceph-rbd-pvc
  52. EOF
  53. kubectl apply -f ceph-rbd-pod-pvc-pv-allinone.yaml
  54. kubectl get pv,pvc,pod
  55. kubectl exec pod/ceph-rbd-pod-pvc-pv -- df -k | grep rbd

在存储类中使用 RBD

此示例用于动态配置。需要 ceph-csi 驱动。

  1. # pod-pvc-sc
  2. cat > ceph-rbd-pod-pvc-sc-allinone.yaml <<EOF
  3. apiVersion: storage.k8s.io/v1
  4. kind: StorageClass
  5. metadata:
  6. name: ceph-rbd-sc
  7. annotations:
  8. storageclass.kubernetes.io/is-default-class: "true"
  9. provisioner: rbd.csi.ceph.com
  10. parameters:
  11. clusterID: 79179d9d-98d8-4976-ab2e-58635caa7235
  12. pool: myPool
  13. imageFeatures: layering
  14. csi.storage.k8s.io/provisioner-secret-name: ceph-admin
  15. csi.storage.k8s.io/provisioner-secret-namespace: default
  16. csi.storage.k8s.io/controller-expand-secret-name: ceph-admin
  17. csi.storage.k8s.io/controller-expand-secret-namespace: default
  18. csi.storage.k8s.io/node-stage-secret-name: ceph-admin
  19. csi.storage.k8s.io/node-stage-secret-namespace: default
  20. reclaimPolicy: Delete
  21. allowVolumeExpansion: true
  22. mountOptions:
  23. - discard
  24. ---
  25. kind: PersistentVolumeClaim
  26. apiVersion: v1
  27. metadata:
  28. name: ceph-rbd-sc-pvc
  29. spec:
  30. accessModes:
  31. - ReadWriteOnce
  32. resources:
  33. requests:
  34. storage: 2Gi
  35. storageClassName: ceph-rbd-sc
  36. ---
  37. apiVersion: v1
  38. kind: Pod
  39. metadata:
  40. name: ceph-rbd-pod-pvc-sc
  41. spec:
  42. containers:
  43. - name: ceph-rbd-pod-pvc-sc
  44. image: busybox
  45. command: ["sleep", "infinity"]
  46. volumeMounts:
  47. - mountPath: /mnt/ceph_rbd
  48. name: volume
  49. volumes:
  50. - name: volume
  51. persistentVolumeClaim:
  52. claimName: ceph-rbd-sc-pvc
  53. EOF
  54. kubectl apply -f ceph-rbd-pod-pvc-sc-allinone.yaml
  55. kubectl get pv,pvc,sc,pod
  56. kubectl exec pod/ceph-rbd-pod-pvc-sc -- df -k | grep rbd

RKE2 Server/Master 配置

  1. sudo su
  2. curl -sfL https://get.rke2.io | sh -
  3. systemctl enable --now rke2-server
  4. cat > /root/.bashrc << EOF
  5. export PATH=$PATH:/var/lib/rancher/rke2/bin/
  6. export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
  7. EOF
  8. cat /var/lib/rancher/rke2/server/node-token
  9. token: K10ca0c38d4ff90d8b80319ab34092e315a8b732622e6adf97bc9eb0536REDACTED::server:ec0308000b8a6b595da000efREDACTED

RKE2 Agent/Worker 配置

  1. mkdir -p /etc/rancher/rke2/
  2. cat > /etc/rancher/rke2/config.yaml << EOF
  3. server: https://10.100.103.23:9345
  4. token: K10ca0c38d4ff90d8b80319ab34092e315a8b732622e6adf97bc9eb0536REDACTED::server:ec0308000b8a6b595da000efREDACTED
  5. EOF
  6. curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh -
  7. systemctl enable --now rke2-agent.service

要将集群导入 Rancher,请单击 ☰ > 集群管理。然后在集群页面上,单击导入已有集群。然后在 server/master 上运行提供的 kubectl 命令。

测试版本

运行 RKE2 节点的操作系统:安装了 kernel-default-5.3.18-24.49 的 JeOS SLE15-SP2

  1. kubectl version
  2. Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.4", GitCommit:"c96aede7b5205121079932896c4ad89bb93260af", GitTreeState:"clean", BuildDate:"2020-06-22T12:00:00Z", GoVersion:"go1.13.11", Compiler:"gc", Platform:"linux/amd64"}
  3. Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7+rke2r1", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-20T01:50:52Z", GoVersion:"go1.15.5b5", Compiler:"gc", Platform:"linux/amd64"}
  4. helm version
  5. version.BuildInfo{Version:"3.4.1", GitCommit:"c4e74854886b2efe3321e185578e6db9be0a6e29", GitTreeState:"clean", GoVersion:"go1.14.12"}

RKE2 集群上的 Kubernetes 版本:v1.19.7+rke2r1

故障排除

如果你使用的是基于 SES7 的 SUSE ceph-rook,你可以通过编辑 rook-1.4.5/ceph/cluster.yaml 并设置 spec.network.hostNetwork=true 来公开 hostNetwork 上的监视器。

如果要操作 ceph-rook 集群,则可以在 Kubernetes 集群上部署一个工具箱,其中 ceph-rook 通过 kubectl apply -f rook-1.4.5/ceph/toolbox.yaml 配置。然后所有与 ceph 相关的命令都可以在 toolbox pod 中执行,例如,运行 kubectl exec -it -n rook-ceph rook-ceph-tools-686d8b8bfb-2nvqp -- bash

ceph 操作 - 基本命令:

  1. ceph osd pool stats
  2. ceph osd pool delete myPool myPool --yes-i-really-really-mean-it
  3. rbd list -p myPool
  4. > csi-vol-f5d3766c-7296-11eb-b32a-c2b045952d38
  5. > image

删除镜像:rbd rm csi-vol-f5d3766c-7296-11eb-b32a-c2b045952d38 -p myPool

rook 工具箱中的 CephFS 命令:

  1. ceph -s
  2. ceph fs ls
  3. ceph fs fail cephfs
  4. ceph fs rm cephfs --yes-i-really-mean-it
  5. ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it
  6. ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it

要准备 cephfs 文件系统,你可以在 rook 集群上运行以下命令:

  1. kubectl apply -f rook-1.4.5/ceph/filesystem.yaml