Rook简介

Rook是一个用于 Kubernetes的开源云原生存储,可在生产环境中对文件存储、块存储和对象存储进行管理。Rook 由云原生计算基金会(CNCF) 作为毕业级项目托管。Rook 是用 golang 实现的。Ceph 是用 C++ 实现的,其中数据路径经过高度优化。

Rook 使用 Kubernetes 平台的强大功能通过 Kubernetes Operator 为每个存储提供商提供服务。Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务,它通过自动化部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监控和资源管理来实现此目的。

ffmpeg 云原生分布式转码 云原生分布式存储_TCP


Rook使用Kubernetes原语使Ceph存储系统能够在Kubernetes上运行。下图是rook与kubernetes集成的架构图:

ffmpeg 云原生分布式转码 云原生分布式存储_TCP_02


Rook官网:https://rook.io Github地址:https://github.com/rook/rook

部署环境准备

1、前提条件:

  • 至少准备3个节点、并且全部可以调度pod,满足ceph副本高可用要求
  • 节点存在可用的裸盘或裸分区,无格式化文件系统
  • 如果需要LVM,节点必须安装lvm2软件包 Ceph需要使用RBD模块构建的Linux内核,可以通过运行modprobe
    rbd来测试Kubernetes节点。
  • 如果要从Ceph共享文件系统(CephFS)创建卷,建议的最低内核版本为4.17。

下面以3节点k8s集群为例,集群包含1个master节点,2个node节点,必须去除master节点污点,允许调度pod。

kubectl taint nodes k8s-master node-role.kubernetes.io/master-

2、添加新磁盘

默认节点只有/dev/sda 根磁盘,这里在所有节点添加1块50GB的新磁盘:/dev/sdb,作为OSD盘,提供存储空间,添加完成后扫描磁盘,确保主机能够正常识别到:

#扫描 SCSI总线并添加 SCSI 设备
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done

#重新扫描 SCSI 总线
for scsi_device in $(ls /sys/class/scsi_device/); do echo 1 > /sys/class/scsi_device/$scsi_device/device/rescan; done

#查看已添加的磁盘,能够看到sdb说明添加成功
lsblk

本次搭建的基本原理图:

ffmpeg 云原生分布式转码 云原生分布式存储_TCP_03


3、Rook Ceph支持的三种存储类型使用场景

  • 块存储: 创建块存储以供 单个Pod (RWO) 使用
  • 文件存储:创建一个文件系统以在多个 pod 之间共享 (RWX)
  • 对象存储:创建可在 Kubernetes 集群内部或外部访问的对象存储

无另外说明,以下全部操作都在master节点执行。

部署Rook Operator

1、克隆release正式发布版本仓库:

git clone --single-branch --branch v1.8.6 https://github.com/rook/rook.git
cd rook-1.8.6/deploy/examples/

2、查看需要的镜像列表,部分镜像无法访问,可以结合GithubAction拉取并推送到dockerhub或国内阿里云仓库:

[root@Ops-repo examples]# cat images.txt 
 k8s.gcr.io/sig-storage/csi-attacher:v3.4.0
 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.5.0
 k8s.gcr.io/sig-storage/csi-provisioner:v3.1.0
 k8s.gcr.io/sig-storage/csi-resizer:v1.4.0
 k8s.gcr.io/sig-storage/csi-snapshotter:v5.0.1
 quay.io/ceph/ceph:v16.2.7
 quay.io/cephcsi/cephcsi:v3.5.1
 quay.io/csiaddons/k8s-sidecar:v0.2.1
 quay.io/csiaddons/volumereplication-operator:v0.3.0
 rook/ceph:v1.8.6

3、修改operator.yaml,涉及镜像的参数修改为可拉取到的仓库地址:

[root@Ops-repo examples]# cp operator.yaml{,.bak}

[root@Ops-repo examples]# cat operator.yaml |grep -i image:
  ROOK_CSI_CEPH_IMAGE: "willdockerhub/cephcsi:v3.5.1"
  ROOK_CSI_REGISTRAR_IMAGE: "willdockerhub/csi-node-driver-registrar:v2.5.0"
  ROOK_CSI_RESIZER_IMAGE: "willdockerhub/csi-resizer:v1.4.0"
  ROOK_CSI_PROVISIONER_IMAGE: "willdockerhub/csi-provisioner:v3.1.0"
  ROOK_CSI_SNAPSHOTTER_IMAGE: "willdockerhub/csi-snapshotter:v5.0.1"
  ROOK_CSI_ATTACHER_IMAGE: "willdockerhub/csi-attacher:v3.4.0"
  CSI_VOLUME_REPLICATION_IMAGE: "willdockerhub/volumereplication-operator:v0.3.0"
  ROOK_CSIADDONS_IMAGE: "willdockerhub/k8s-sidecar:v0.2.1"
          image: rook/ceph:v1.8.6

4、部署Rook Operator

[root@Ops-repo examples]# kubectl create -f crds.yaml -f common.yaml -f operator.yaml

查看创建的operator pod

[root@Ops-repo examples]# kubectl -n rook-ceph get pods
NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-operator-7b4f6fd594-jdglb   1/1     Running   0          165m

5、创建 Ceph 集群

修改镜像为可拉取的地址

[root@Ops-repo examples]# cat cluster.yaml  |grep image:
    image: willdockerhub/ceph:v16.2.7

创建ceph集群

[root@Ops-repo examples]# kubectl create -f cluster.yaml

查看创建的pods

[root@Ops-repo examples]# kubectl -n rook-ceph get pods -o wide
NAME                                              READY   STATUS      RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
csi-cephfsplugin-9s5tz                            3/3     Running     0          39m     192.168.0.24   node3   <none>           <none>
csi-cephfsplugin-j88wj                            3/3     Running     0          31m     192.168.0.22   node1   <none>           <none>
csi-cephfsplugin-jhqcz                            3/3     Running     0          39m     192.168.0.23   node2   <none>           <none>
csi-cephfsplugin-provisioner-6f54f6c477-blcxw     6/6     Running     0          39m     10.233.96.50   node2   <none>           <none>
csi-cephfsplugin-provisioner-6f54f6c477-g49tw     6/6     Running     0          39m     10.233.92.30   node3   <none>           <none>
csi-rbdplugin-jjhmz                               3/3     Running     0          39m     192.168.0.23   node2   <none>           <none>
csi-rbdplugin-nt6sn                               3/3     Running     0          31m     192.168.0.22   node1   <none>           <none>
csi-rbdplugin-provisioner-6d765b47d5-hslsf        6/6     Running     0          39m     10.233.92.31   node3   <none>           <none>
csi-rbdplugin-provisioner-6d765b47d5-vjwcp        6/6     Running     0          39m     10.233.96.49   node2   <none>           <none>
csi-rbdplugin-zzm7m                               3/3     Running     0          39m     192.168.0.24   node3   <none>           <none>
rook-ceph-crashcollector-node1-54b78567c5-fhj2p   1/1     Running     0          59s     10.233.90.12   node1   <none>           <none>
rook-ceph-crashcollector-node2-69d4577554-dmwhw   1/1     Running     0          29m     10.233.96.55   node2   <none>           <none>
rook-ceph-crashcollector-node3-f4758c5df-7wxgj    1/1     Running     0          29m     10.233.92.38   node3   <none>           <none>
rook-ceph-mgr-a-b557c664-92bpn                    1/1     Running     1          29m     10.233.90.3    node1   <none>           <none>
rook-ceph-mon-a-c4484c877-msrjn                   1/1     Running     1          31m     10.233.92.37   node3   <none>           <none>
rook-ceph-mon-b-6468c84f59-b9rwx                  1/1     Running     1          30m     10.233.90.2    node1   <none>           <none>
rook-ceph-mon-c-7966fdfc5b-6nqp2                  1/1     Running     0          29m     10.233.96.54   node2   <none>           <none>
rook-ceph-operator-7b4f6fd594-fjhv7               1/1     Running     0          5m6s    10.233.90.8    node1   <none>           <none>
rook-ceph-osd-0-7757bd7dd8-j64hm                  1/1     Running     0          3m54s   10.233.96.59   node2   <none>           <none>
rook-ceph-osd-1-5f746cfbd4-c2psg                  1/1     Running     0          3m51s   10.233.92.44   node3   <none>           <none>
rook-ceph-osd-2-6548745b8c-xbqxm                  1/1     Running     0          60s     10.233.90.11   node1   <none>           <none>
rook-ceph-osd-prepare-node1-xqgvm                 0/1     Completed   0          94s     10.233.90.10   node1   <none>           <none>
rook-ceph-osd-prepare-node2-5l8mc                 0/1     Completed   0          91s     10.233.96.60   node2   <none>           <none>
rook-ceph-osd-prepare-node3-sflcx                 0/1     Completed   0          86s     10.233.92.46   node3   <none>           <none>

配置ceph dashboard

在cluster.yaml文件中默认已经启用了ceph dashboard,查看dashboard的service:

[centos@k8s-master ~]$ kubectl get service -n rook-ceph
NAME                                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
rook-ceph-mgr                            ClusterIP   10.107.77.188    <none>        9283/TCP         3h33m
rook-ceph-mgr-dashboard                  ClusterIP   10.96.135.98     <none>        8443/TCP         3h33m
rook-ceph-mon-a                          ClusterIP   10.105.153.93    <none>        6790/TCP         3h35m
rook-ceph-mon-b                          ClusterIP   10.105.107.254   <none>        6790/TCP         3h34m
rook-ceph-mon-c                          ClusterIP   10.104.1.238     <none>        6790/TCP         3h34m
[centos@k8s-master ~]$

rook-ceph-mgr-dashboard监听的端口是8443,创建nodeport类型的service以便集群外部访问。

kubectl apply -f dashboard-external-https.yaml

查看一下nodeport暴露的端口,这里是32483端口:

[centos@k8s-master ~]$ kubectl get service -n rook-ceph | grep dashboard
rook-ceph-mgr-dashboard                  ClusterIP   10.96.135.98     <none>        8443/TCP         3h37m
rook-ceph-mgr-dashboard-external-https   NodePort    10.97.181.103    <none>        8443:32483/TCP   3h29m

获取Dashboard的登陆账号和密码

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

默认用户名为admin,打开浏览器输入任意一个Node的IP+nodeport端口,这里使用master节点 ip访问:

ffmpeg 云原生分布式转码 云原生分布式存储_bc_04


登录后界面如下:

ffmpeg 云原生分布式转码 云原生分布式存储_bc_05


查看hosts状态,运行了1个mgr、3个mon和3个osd

ffmpeg 云原生分布式转码 云原生分布式存储_TCP_06


查看monitors状态:

ffmpeg 云原生分布式转码 云原生分布式存储_docker_07


查看OSD状态,3个osd状态正常,每个容量50GB.

ffmpeg 云原生分布式转码 云原生分布式存储_ffmpeg 云原生分布式转码_08

部署Ceph toolbox

默认启动的Ceph集群,是开启Ceph认证的,这样你登陆Ceph组件所在的Pod里,是没法去获取集群状态,以及执行CLI命令,这时需要部署Ceph toolbox,命令如下:

kubectl apply -f toolbox.yaml

部署成功后,pod如下:

[root@Ops-repo examples]# kubectl -n rook-ceph get pods -l app=rook-ceph-tools 
NAME                               READY   STATUS    RESTARTS   AGE
rook-ceph-tools-55ddbc9f78-5wzm9   1/1     Running   1          10d

然后可以登陆该pod后,执行Ceph CLI命令:

[root@Ops-repo examples]# kubectl -n rook-ceph exec -it rook-ceph-tools-55ddbc9f78-5wzm9 -- bash
[rook@rook-ceph-tools-55ddbc9f78-5wzm9 /]$

查看ceph集群状态

[rook@rook-ceph-tools-55ddbc9f78-5wzm9 /]$ ceph status
  cluster:
    id:     c6f86599-925b-4d8a-8cda-9c7874ffe3d2
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum a,b,c (age 47m)
    mgr: a(active, since 19h)
    mds: 1/1 daemons up, 1 hot standby
    osd: 3 osds: 3 up (since 3d), 3 in (since 3d)
    rgw: 1 daemon active (1 hosts, 1 zones)
 
  data:
    volumes: 1/1 healthy
    pools:   11 pools, 177 pgs
    objects: 16.71k objects, 62 GiB
    usage:   187 GiB used, 713 GiB / 900 GiB avail
    pgs:     177 active+clean
 
  io:
    client:   3.3 MiB/s rd, 3.0 MiB/s wr, 134 op/s rd, 80 op/s wr

查看ceph配置文件

[rook@rook-ceph-tools-55ddbc9f78-5wzm9 /]$ cat /etc/ceph/ceph.conf 
[global]
mon_host = 10.233.49.193:6789,10.233.1.227:6789,10.233.11.169:6789

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

rook部署块存储

创建块存储池和storageclass

[root@Ops-repo examples]# kubectl apply -f storageclass.yaml

查看创建的storageclass:

[root@Ops-repo examples]# kubectl get storageclass
NAME                      PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block           rook-ceph.rbd.csi.ceph.com      Delete          Immediate           true                   10d

登录ceph dashboard查看创建的存储池:

ffmpeg 云原生分布式转码 云原生分布式存储_ffmpeg 云原生分布式转码_09


使用存储,以官方wordpress示例为例,创建一个经典的wordpress和mysql应用程序来使用Rook提供的块存储,这两个应用程序都将使用Rook提供的block volumes。

查看yaml文件配置,主要看定义的pvc和挂载volume部分,以wordpress.yaml为例:

[centos@k8s-master ~]$ cat wordpress.yaml 
......
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  storageClassName: rook-ceph-block
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
......
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
[centos@k8s-master ~]$

yaml文件里定义了一个名为wp-pv-claim的pvc,指定storageClassName为rook-ceph-block,申请的存储空间大小为20Gi。最后一部分创建了一个名为wordpress-persistent-storage的volume,并且指定 claimName为pvc的名称,最后将volume挂载到pod的/var/lib/mysql目录下。
启动mysql和wordpress :

kubectl apply -f mysql.yaml
kubectl apply -f wordpress.yaml

这2个应用都会创建一个块存储卷,并且挂载到各自的pod中,查看声明的pvc和pv:

[centos@k8s-master ~]$ kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
mysql-pv-claim   Bound    pvc-5bfbe28e-0fc9-11e9-b90d-000c291c25f3   20Gi       RWO            rook-ceph-block   32m
wp-pv-claim      Bound    pvc-5f56c6d6-0fc9-11e9-b90d-000c291c25f3   20Gi       RWO            rook-ceph-block   32m

[centos@k8s-master ~]$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS      REASON   AGE
pvc-5bfbe28e-0fc9-11e9-b90d-000c291c25f3   20Gi       RWO            Delete           Bound    default/mysql-pv-claim   rook-ceph-block            32m
pvc-5f56c6d6-0fc9-11e9-b90d-000c291c25f3   20Gi       RWO            Delete           Bound    default/wp-pv-claim      rook-ceph-block            32m
[centos@k8s-master ~]$

注意:这里的pv会自动创建,当提交了包含 StorageClass 字段的 PVC 之后,Kubernetes 就会根据这个 StorageClass 创建出对应的 PV,这是用到的是Dynamic Provisioning机制来动态创建pv,PV 支持 Static 静态请求,和动态创建两种方式。

在Ceph集群端检查:

[centos@k8s-master ceph]$ kubectl -n rook-ceph exec -it rook-ceph-tools-76c7d559b6-8w7bk bash
......
[root@k8s-node2 /]# rbd info -p replicapool pvc-5bfbe28e-0fc9-11e9-b90d-000c291c25f3 
rbd image 'pvc-5bfbe28e-0fc9-11e9-b90d-000c291c25f3':
        size 20 GiB in 5120 objects
        order 22 (4 MiB objects)
        id: 88156b8b4567
        block_name_prefix: rbd_data.88156b8b4567
        format: 2
        features: layering
        op_features: 
        flags: 
        create_timestamp: Fri Jan  4 02:35:12 2019

登陆pod检查rbd设备:

[centos@k8s-master ~]$ kubectl get pod -o wide
NAME                               READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
wordpress-7b6c4c79bb-t5pst         1/1     Running   0          135m   10.244.1.16   k8s-node1   <none>           <none>
wordpress-mysql-6887bf844f-9pmg8   1/1     Running   0          135m   10.244.2.14   k8s-node2   <none>           <none>

[centos@k8s-master ~]$ kubectl exec -it wordpress-7b6c4c79bb-t5pst bash
root@wordpress-7b6c4c79bb-t5pst:/var/www/html#
root@wordpress-7b6c4c79bb-t5pst:/var/www/html#  mount | grep rbd
/dev/rbd0 on /var/www/html type xfs (rw,relatime,attr2,inode64,sunit=8192,swidth=8192,noquota)
root@wordpress-7b6c4c79bb-t5pst:/var/www/html# df -h
Filesystem               Size  Used Avail Use% Mounted on
......
/dev/rbd0                 20G   59M   20G   1% /var/www/html
......

登录ceph dashboard查看创建的images

ffmpeg 云原生分布式转码 云原生分布式存储_kubernetes_10


一旦wordpress和mysql pods处于运行状态,获取wordpress应用程序的集群IP并使用浏览器访问:

[centos@k8s-master ~]$ kubectl get svc wordpress
NAME        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
wordpress   LoadBalancer   10.98.178.189   <pending>     80:30001/TCP   136m
[centos@k8s-master ~]$

访问wordpress:

ffmpeg 云原生分布式转码 云原生分布式存储_ffmpeg 云原生分布式转码_11

rook部署对象存储

对象存储向存储集群公开了一个 S3 API,供应用程序放置和获取数据。Rook 能够在 Kubernetes 中部署对象存储或连接到外部 RGW 服务。最常见的是,对象存储将由 Rook 在本地配置。或者,如果您有一个带有 Rados 网关的现有 Ceph 集群。

1、在本地集群启动一个RGW服务

kubectl create -f object.yaml

查看创建的rgw服务

[root@Ops-repo ~]# kubectl -n rook-ceph get pod -l app=rook-ceph-rgw
NAME                                        READY   STATUS    RESTARTS   AGE
rook-ceph-rgw-my-store-a-56f7949684-pdpgk   1/1     Running   0          32m

2、创建存储桶

现在对象存储已配置完毕,接下来我们需要创建一个存储桶,客户端可以在其中读取和写入对象。可以通过定义存储类来创建存储桶,类似于块和文件存储使用的模式。

kubectl create -f storageclass-bucket-delete.yaml

基于此存储类,对象客户端现在可以通过创建对象存储桶声明 (OBC) 来请求存储桶。

kubectl create -f object-bucket-claim-delete.yaml

现在声明已创建,operator将创建存储桶并生成其他工件以启用对存储桶的访问。secret和 ConfigMap 是使用与 OBC 相同的名称并在相同的命名空间中创建的。该密钥包含应用程序 pod 用于访问存储桶的凭据。ConfigMap 包含存储桶端点信息,也被 pod 使用。

3、客户端连接

以下命令从secret和configmap中提取关键信息:

export AWS_HOST=$(kubectl -n default get cm ceph-delete-bucket -o jsonpath='{.data.BUCKET_HOST}')
export AWS_ACCESS_KEY_ID=$(kubectl -n default get secret ceph-delete-bucket -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 --decode)
export AWS_SECRET_ACCESS_KEY=$(kubectl -n default get secret ceph-delete-bucket -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 --decode)

4、使用对象存储

现在您已配置对象存储并创建了存储桶,您可以从 S3 客户端使用对象存储。本节将指导您测试与CephObjectStore 的连接以及从中上传和下载。连接到Rook 工具箱后运行以下命令。

连接环境变量

为了简化 s3 客户端命令,您需要设置四个环境变量供您的客户端使用(即在工具箱内)。

export AWS_HOST=<host>
export AWS_ENDPOINT=<endpoint>
export AWS_ACCESS_KEY_ID=<accessKey>
export AWS_SECRET_ACCESS_KEY=<secretKey>
  • Host:在集群中找到 rgw 服务的 DNS 主机名。假设您使用的是默认rook-ceph集群,它将是rook-ceph-rgw-my-store.rook-ceph.
  • Endpoint: rgw 服务正在侦听的端点。运行kubectl -n rook-ceph get svc rook-ceph-rgw-my-store,然后结合 clusterIP 和端口。
  • Access key:用户access_key如上所示
  • Secret key:用户secret_key如上所示

此示例中为用户生成的变量可能是:

export AWS_HOST=rook-ceph-rgw-my-store.rook-ceph
export AWS_ENDPOINT=10.104.35.31:80
export AWS_ACCESS_KEY_ID=XEZDB3UJ6X7HVBE7X7MA
export AWS_SECRET_ACCESS_KEY=7yGIZON7EhFORz0I40BFniML36D2rl8CQQ5kXU6l

或者配置 s5cmd

要测试CephObjectStore,请在工具箱 pod 中为该s5cmd工具设置对象存储凭据。

[root@Ops-repo examples]# kubectl -n rook-ceph exec -it rook-ceph-tools-55ddbc9f78-5wzm9 -- bash
mkdir ~/.aws
cat > ~/.aws/credentials << EOF
[default]
aws_access_key_id = ${AWS_ACCESS_KEY_ID}
aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}
EOF

查看bucket名称

[rook@rook-ceph-tools-55ddbc9f78-5wzm9 ~]$ s5cmd --endpoint-url http://$AWS_ENDPOINT ls
2022/03/13 13:37:19  s3://ceph-bkt-702f6d0f-2cb3-4253-b3c1-84e5d59707d1

PUT 或 GET 一个对象,将文件上传到新创建的存储桶

echo "Hello Rook" > /tmp/rookObj
s5cmd --endpoint-url http://$AWS_ENDPOINT cp /tmp/rookObj s3://ceph-bkt-702f6d0f-2cb3-4253-b3c1-84e5d59707d1

从存储桶下载并验证文件

s5cmd --endpoint-url http://$AWS_ENDPOINT cp s3://ceph-bkt-702f6d0f-2cb3-4253-b3c1-84e5d59707d1/rookObj /tmp/rookObj-download
cat /tmp/rookObj-download

5、集群外部访问rook对象存储

Rook 设置对象存储,以便 pod 可以访问集群内部。如果您的应用程序在集群外运行,则需要通过NodePort.

现在创建外部服务。

kubectl create -f rgw-external.yaml

查看两个 rgw 服务正在运行,并注意外部服务在哪个端口上运行:

# kubectl -n rook-ceph get service rook-ceph-rgw-my-store rook-ceph-rgw-my-store-external
> NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
> rook-ceph-rgw-my-store            ClusterIP   10.104.82.228    <none>        80/TCP         4m
> rook-ceph-rgw-my-store-external   NodePort    10.111.113.237   <none>        80:31536/TCP   39s

在内部,rgw 服务正在端口上运行80。在这种情况下,外部端口是31536。现在您可以CephObjectStore从任何地方访问!您只需要集群中任何机器的主机名、外部端口和用户凭据。

创建用户

如果您需要创建一组独立的用户凭证来访问 S3 端点,请创建一个CephObjectStoreUser.用户将用于使用 S3 API 连接到集群中的 RGW 服务。用户将独立于您在本文档前面的说明中创建的任何对象存储桶声明。

# Create the object store user
kubectl create -f object-user.yaml

AccessKey 和 SecretKey 数据字段可以作为环境变量安装在 pod 中。要直接检索secret:

kubectl -n rook-ceph get secret rook-ceph-object-user-my-store-my-user -o jsonpath='{.data.AccessKey}' | base64 --decode
kubectl -n rook-ceph get secret rook-ceph-object-user-my-store-my-user -o jsonpath='{.data.SecretKey}' | base64 --decode

rook部署文件存储

共享文件系统可以从多个 pod 以读/写权限挂载共享文件系统。这对于可以使用共享文件系统进行集群的应用程序可能很有用。

1、创建文件系统

CephFilesystem通过为CRD中的元数据池、数据池和元数据服务器指定所需的设置来创建文件系统。在此示例中,我们创建了具有三个复制的元数据池和一个具有三个复制的单个数据池。

Rook Operator将创建启动服务所需的所有池和其他资源。这可能需要一分钟才能完成。

kubectl create -f filesystem.yaml

查看创建的mds pod

# kubectl -n rook-ceph get pod -l app=rook-ceph-mds
NAME                                      READY     STATUS    RESTARTS   AGE
rook-ceph-mds-myfs-7d59fdfcf4-h8kw9       1/1       Running   0          12s
rook-ceph-mds-myfs-7d59fdfcf4-kgkjp       1/1       Running   0          12s

要查看文件系统的详细状态,请启动并连接到Rook 工具箱

$ ceph status
...
 services:
   mds: myfs-1/1/1 up {[myfs:0]=mzw58b=up:active}, 1 up:standby-replay

该服务将显示一个新行mds。在此示例中,有一个 MDS 的活动实例已启动,其中一个 MDS 实例处于standby-replay故障转移模式。

2、配置存储

在 Rook 开始配置存储之前,需要基于文件系统创建一个 StorageClass。这是 Kubernetes 与 CSI 驱动程序互操作以创建持久卷所必需的。

如果您已将 Rook 运算符部署在“rook-ceph”以外的命名空间中,那么通常更改配置器中的前缀以匹配您使用的命名空间。例如,如果 Rook 操作符在“rook-op”中运行,则配置器值应该是“rook-op.rbd.csi.ceph.com”。

创建存储类。

kubectl create -f deploy/examples/csi/cephfs/storageclass.yaml

3、配额

重要提示:CephFS CSI 驱动程序使用配额来强制执行请求的 PVC 大小。只有较新的内核支持 CephFS 配额(内核版本至少为 4.17)。如果您需要强制执行配额并且内核驱动程序不支持它,您可以禁用内核驱动程序并使用 FUSE 客户端。这可以通过CSI_FORCE_CEPHFS_KERNEL_CLIENT: false在操作员部署 (operator.yaml) 中进行设置来完成。但是,重要的是要知道,当启用 FUSE 客户端时,会出现一个问题,即在升级过程中,应用程序 pod 将与挂载断开连接,需要重新启动。有关详细信息,请参阅升级指南。

4、使用共享文件系统:K8s Registry 示例

例如,我们将使用共享文件系统作为后备存储启动 kube-registry pod。将以下规范另存为kube-registry.yaml

创建 Kube 注册表部署:

kubectl create -f deploy/examples/csi/cephfs/kube-registry.yaml

您现在有一个 docker 注册表,它是具有持久存储的 HA。

内核版本要求:如果 Rook 集群有多个文件系统,并且应用程序 pod 被调度到内核版本早于 4.7 的节点,则可能会出现不一致的结果,因为早于 4.7 的内核不支持指定文件系统命名空间。

5、使用共享文件系统:工具箱

将映像推送到注册表后(请参阅公开和使用 kube-registry 的说明),通过在工具箱 pod 中安装共享文件系统来验证 kube-registry 是否正在使用上面配置的文件系统。有关更多详细信息,请参阅直接文件系统主题。

6、清除

清理文件系统演示创建的所有工件:

kubectl delete -f kube-registry.yaml

要删除文件系统组件和支持数据,请删除文件系统 CRD。

警告:如果 preserveFilesystemOnDelete=false 将删除数据

kubectl -n rook-ceph delete cephfilesystem myfs

注意:如果“preserveFilesystemOnDelete”文件系统属性设置为true,上述命令不会删除文件系统。重新创建相同的 CRD 将重用现有的文件系统。

rook集群清理

参考:https://rook.io/docs/rook/master/ceph-teardown.html

如果要拆除群集并启动一个新群集,请注意以下需要清除的资源:

  • rook-ceph名称空间:由operator.yaml和创建的Rook运算符和集群cluster.yaml(集群CRD)
  • /var/lib/rook:集群中每台主机上的路径,其中ceph mons和osds缓存配置

请注意,如果您更改了默认名称空间或路径(例如dataDirHostPath示例yaml文件中的路径),则需要在这些说明中调整这些名称空间和路径。

如果您看到拆除群集的问题,请参阅下面的“故障排除”部分。

如果出于开发目的经常拆除群集,则建议使用诸如Minikube的环境,该环境可以轻松重置,而无需担心任何这些步骤。

1、删除块和文件工件

首先,您需要清理在Rook群集顶部创建的资源。

这些命令将从文件演练中清除资源(卸载卷,删除卷声明等)。如果您没有完成本演练的那些部分,则可以跳过以下说明:

kubectl delete -f ../wordpress.yaml
kubectl delete -f ../mysql.yaml
kubectl delete -n rook-ceph cephblockpool replicapool
kubectl delete storageclass rook-ceph-block
kubectl delete -f csi/cephfs/kube-registry.yaml
kubectl delete storageclass csi-cephfs

2、删除CephCluster CRD

在清除了这些块和文件资源之后,您可以删除Rook群集。在删除Rook运算符和代理之前,删除它非常重要,否则资源可能无法正确清理

kubectl -n rook-ceph delete cephcluster rook-ceph

在继续下一步之前,请验证是否已删除群集CRD。

kubectl -n rook-ceph get cephcluster

3、删除operator和相关资源
这将开始Rook Ceph operator以及所有其他资源的清理过程。这包括相关资源,例如代理程序和使用以下命令的发现守护程序集:

kubectl delete -f operator.yaml
kubectl delete -f common.yaml

4、删除主机上的数据

重要说明:最后的清理步骤要求删除群集中每个主机上的文件。群集CRD中指定的属性dataDirHostPath下的所有文件都需要删除。否则,启动新群集时将保持不一致状态。

连接到每台机器并删除/var/lib/rook,或由dataDirHostPath指定的路径。

将来,当我们基于K8s的本地存储功能时,将不需要此步骤。

如果您修改了演示设置,则可以根据设备,主机路径等进行其他清理。

可以通过以下方法将Rook for osds使用的节点上的磁盘重置为可用状态:

#!/usr/bin/env bash
DISK="/dev/sdb"
# Zap the disk to a fresh, usable state (zap-all is important, b/c MBR has to be clean)
# You will have to run this step for all disks.
sgdisk --zap-all $DISK
# Clean hdds with dd
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync
# Clean disks such as ssd with blkdiscard instead of dd
blkdiscard $DISK

# These steps only have to be run once on each node
# If rook sets up osds using ceph-volume, teardown leaves some devices mapped that lock the disks.
ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %
# ceph-volume setup can leave ceph-<UUID> directories in /dev (unnecessary clutter)
rm -rf /dev/ceph-*

rook故障排除

1、查看集群CRD:

kubectl -n rook-ceph get cephcluster

2、清理告事件
ceph dashboard 状态不健康,提示rook RECENT_CRASH: 2 daemons have recently crashed,进入工具箱pod归档crash信息:

ceph crash ls
ceph crash info <id>
ceph crash archive <id>
ceph crash archive-all

3、ceph kubectl插件

参考:https://github.com/rook/kubectl-rook-ceph

kubectl krew install rook-ceph

常用命令

kubectl rook-ceph ceph status

kubectl rook-ceph operator restart

kubectl rook-ceph rook version

kubectl rook-ceph ceph versions