kubernetes 以ceph为存储媒介创建 StorageClass

Lance.Wu 发表于: 2023-02-13   最后更新时间: 2023-02-13 18:11:53  
{{totalSubscript}} 订阅, 854 游览

下载代码 https://github.com/ceph/ceph-csi

1.环境准备 使用命令查看CEPH的环境信息

[root@ceph-01 ~]# ceph -s

  cluster:
    id:     c8ae7537-8693-40df-8943-733f82049642
    health: HEALTH_OK
  services:
    mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 5h)
    mgr: ceph-02(active, since 5d), standbys: ceph-03, ceph-01
    mds: cephfs-abcdocker:1 {0=ceph-01=up:active} 2 up:standby
    osd: 4 osds: 4 up (since 5h), 4 in (since 5h)
    rgw: 2 daemons active (ceph-01, ceph-02)
  task status:
  data:
    pools:   9 pools, 384 pgs
    objects: 3.16k objects, 11 GiB
    usage:   36 GiB used, 144 GiB / 180 GiB avail
    pgs:     384 active+clean

注意当前内容中的 cluster->id:重要信息:c8ae7537-8693-40df-8943-733f82049642

2. Ceph Csi 驱动部署

默认情况下,Ceph 块设备使用rbd池。为 Kubernetes 卷存储创建一个池。确保您的 Ceph 集群正在运行,然后创建池。

2.1 Ceph Csi 驱动部署

查看存储池,如果需要新创建存储池.

新创建的池必须在使用前进行初始化。使用该rbd工具初始化池:

[root@ceph-01 ~]# ceph osd pool ls
.mgr
[root@ceph-01 ~]# ceph osd pool create k8s 128 128

[root@ceph-01 ~]# rbd pool init k8s
.mgr
k8s

3. 配置CEPH-CSI

设置 CEPH 客户端身份验证 建议使用admin用户,如果需要安全使用权限,则需要自己创建用户信息
为 Kubernetes 和 ceph -csi创建一个新用户,当然也可以直接使用client.admin用户

[root@ceph-01 ~]# ceph auth get-or-create client.k8s mon 'profile rbd' osd 'profile rbd pool=k8s' mgr 'profile rbd pool=k8s'
[client.k8s]
    key = AQBYpZRiY/JmHRAAD6/jr3cE9E0B/7QjLGi8/w==

3.1 通过命令就可以查看到 客户端信息

ceph auth list

4.生成CEPH-CSI CONFIGMAP 配置信息

[root@ceph176 ~]# ceph mon dump
epoch 1
fsid b00ed62a-a91b-11ed-820c-00505686a3b8
last_changed 2023-02-10T08:34:13.518137+0000
created 2023-02-10T08:34:13.518137+0000
min_mon_release 17 (quincy)
election_strategy: 1
0: [v2:10.0.19.176:3300/0,v1:10.0.19.176:6789/0] mon.ceph176
dumped monmap epoch 1

当前获取的重要信息为连接地址信息:[v2:10.0.19.176:3300/0,v1:10.0.19.176:6789/0] mon.ceph176 提示当前连接信息地址:10.0.19.176:6789`,如果存储多个地址,都需要提取。

5.进入 deploy/rbd/kubernetes

5.1 部署CEPH-CSI RBAC

ceph中不推荐在ceph rbd模式下使用RWX访问控制,如果应用层没有访问锁机制,可能会造成数据损坏。所以rbd模式我们只可以使用一个节点
ceph-csi需要创建ServiceAccount和RBAC用于访问Kubernetes集群内部信息

kubectl create -f ceph-csi/deploy/rbd/kubernetes/csidriver.yaml
kubectl create -f ceph-csi/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
kubectl create -f ceph-csi/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml

5.2 在Kubernetes创建的configmap。

根据上述操作拿到了 ClusterId 和 连接信息,将内容填写到ceph-csi/deploy/rbd/kubernetes/csi-config-map.yaml当中

clusterID >> c8ae7537-8693-40df-8943-733f82049642
monitors >> "10.0.19.176:6789"

文件内容如下

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    desc: ''
  name: ceph-csi-config
  namespace: default
data:
  config.json: |-
    [
          {
            "clusterID": "c8ae7537-8693-40df-8943-733f82049642",
            "monitors": ["10.0.19.176:6789"]
          }
        ]

5.3 创建配置

kubectl create -f ceph-csi/deploy/rbd/kubernetes/csi-config-map.yaml

5.4 安装激活密钥

最新版本的ceph-csi还需要一个额外的ConfigMap对象来定义密钥管理服务 (KMS) 提供者的详细信息。如果未设置 KMS,请将空配置放入csi-kms-config-map.yaml

kubectl apply -f  ceph-csi/examples/kms/vault/kms-config.yaml

5.5 创建节点读取配置文件

ceph-csi还需要创建一个configmap,用于读取ceph节点中的ceph.conf中的配置文件,csi容器会读取这个配置文件

kubectl create -f ceph-csi/examples/ceph-conf.yaml

5.6 创建连接密钥

通过 ceph auth list 获取ceph用户,找到admin用户,复制后面的Key
写入对应的文件当中`ceph-csi/examples/rbd/secret.yaml

...
client.admin
        key: AQCFAeZjBGZ6BRAAt61/K9K6aoHgqZXJxQOxFg==
        caps: [mds] allow *
        caps: [mgr] allow *
        caps: [mon] allow *
        caps: [osd] allow *
...

文件内容如下

 cat <<EOF > /root/ceph/csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: default
stringData:
  userID: admin
  userKey: AQCFAeZjBGZ6BRAAt61/K9K6aoHgqZXJxQOxFg==
EOF

创建文件

kubectl apply -f ceph-csi/examples/rbd/secret.yaml

6.创建提供者,deploy/rbd/kubernetes目录

CEPH-CSI RBD 创建
ceph中不推荐在ceph rbd模式下使用RWX访问控制,如果应用层没有访问锁机制,可能会造成数据损坏。所以rbd模式我们只可以使用一个节点

部署CEPH-CSI RBAC
ceph-csi需要创建ServiceAccount和RBAC用于访问Kubernetes集群内部信息

kubectl create -f ceph-csi/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
kubectl create -f ceph-csi/deploy/rbd/kubernetes/csi-rbdplugin.yaml

6. 创建存储,找到CEPH当中的存储池

kubectl apply -f  ceph-csi/examples/rbd/storageclass.yaml

内容如下:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd #storageclass 名称
provisioner: rbd.csi.ceph.com # 驱动器
parameters:
clusterID: c8ae7537-8693-40df-8943-733f82049642 # ceph集群id
pool: k8s # pool空间
imageFeatures: "layering" # rbd特性
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete # pvc回收机制
allowVolumeExpansion: true # 对扩展卷进行扩展
mountOptions:

  • discard
    ···

验证

更新于 2023-02-13

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章