Kubernetes部署云原生分布式存储Rook

Rook+Ceph实战:在K8s中部署云原生分布式存储与动态持久化 在Kubernetes集群中,Pod的漂移特性使得数据必须存储在共享的分布式存储系统中,持久化存储成为云原生应用落地的关键前提。Rook作为云原生的存储编排框架,将Ceph的部署与管理抽象为CRD,让用户通过声明式YAML即可获得块存储、文件系统与对象存储能力。本文从存储概念出发,解析Rook与Ceph的协作原理,说明其如何简化分布式存储的运维复杂度,并面向生产环境给出版本选型、节点规划与StorageClass配置要点。结合高频排查场景,分享OSD异常、PVC挂起、性能调优等实操经验,帮助技术团队在Kub 阅读详情

Rook简介

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

Rook 使用 Kubernetes 平台的强大功能通过 Kubernetes Operator 为每个存储提供商提供服务。Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务,它通过自动化部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监控和资源管理来实现此目的。
在这里插入图片描述
Rook使用Kubernetes原语使Ceph存储系统能够在Kubernetes上运行。下图是rook与kubernetes集成的架构图:
在这里插入图片描述
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

本次搭建的基本原理图:
在这里插入图片描述
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访问:
在这里插入图片描述
登录后界面如下:
在这里插入图片描述
查看hosts状态,运行了1个mgr、3个mon和3个osd
在这里插入图片描述
查看monitors状态:
在这里插入图片描述
查看OSD状态,3个osd状态正常,每个容量50GB.
在这里插入图片描述

部署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查看创建的存储池:
在这里插入图片描述
使用存储,以官方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
在这里插入图片描述
一旦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:
在这里插入图片描述

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
K8s云原生存储Rook详解 Rook是一个自我管理的分布式存储编排系统,它本身并不是存储系统,在存储和k8s之前搭建了一个桥梁,使存储系统的搭建或者维护变得特别简单,Rook将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它让一些存储的操作,比如部署、配置、扩容、升级、迁移、灾难恢复、监视和资源管理变得自动化,无需人工处理。并且Rook支持CSI,可以利用CSI做一些PVC的快照、扩容、克隆等操作。Rook。 阅读详情

相关推荐

基于Rook+Ceph的云原生存储架构剖析

通过对 Ceph CSI 组件的研究,我们可以进一步分析出 k8s 集群中的 Pod 调用 Ceph 存储的过程:Pod 首先与 k8s 集群 API Server 申请 Ceph 存储资源, k8s 调用 CSI 的存储供给组件,创建 PVC , PVC 绑定并挂载到 Pod ,同时也可以看到 PVC 以 ext4 类型的文件系统挂载到 k8s 节点主机;Rook+Ceph 开源方案践行着自我管理的、自我扩容的、自我修复的云原生存储服务理念,可提供块存储,对象存储和共享文件系统等数据存储服务。

qq_61890005的博客 1267

k8s 集群部署rook-ceph存储系统及使用

一、Rook 、ceph简介 Ceph分布式存储系统 Ceph是一种高度可扩展的分布式存储解决方案,提供对象、文件和块存储。在每个存储节点上,您将找到Ceph存储对象的文件系统和Ceph OSD(对象存储守护程序)进程。在Ceph集群上,您还可以找到Ceph MON(监控)守护程序,它们确保Ceph集群保持高可用性。 RookRook 是一个开源的cloud-native storage编排, .........

不忘初心,方得始终 8788

k8s----27、云原生存储StorageClass、CSI、Rook

Rook是一个自我管理的分布式存储编排系统,它本身并不是存储系统,在存储和k8s之前搭建了一个桥梁,使存储系统的搭建或者维护变得特别简单,Rook将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它让一些存储的操作,比如部署、配置、扩容、升级、迁移、灾难恢复、监视和资源管理变得自动化,无需人工处理。并且 Rook支持CSI,可以利用CSI做一些PVC的快照、扩容、克隆等操作。Rook官网。

qwerty1372431588的博客 283

k8s-8_-rook介绍与使用

k8s-8_Kubernetes-rook介绍与使用

mingqing的博客 2103

端侧视觉赋能手游自动化:YOLOv8+NCNN实现低风险挂机与广告拦截

本文提出一种基于端侧AI的移动游戏自动化解决方案,采用YOLOv8目标检测和NCNN推理框架,结合AutoJS实现"感知-决策-执行"闭环。方案通过轻量化模型训练、多分辨率适配和行为拟态优化,解决了传统脚本的适配性和风控问题。关键技术包括:构建游戏专属数据集、模型量化优化、广告拦截和挂机功能实现,具有本地运行、安全稳定等特点,为个人开发者提供了一套完整的自动化开发框架。

milk416666的博客 1263

51单片机也能玩转信号发生器?手把手教你用DAC0832和LM358输出四种标准波形

本文详细介绍了如何使用51单片机和DAC0832芯片搭配LM358运放,自制低成本信号发生器,实现正弦波、矩形波、三角波和锯齿波四种标准波形的输出。从硬件选型、电路设计到编程实现,手把手教你完成这一实用电子项目,总成本不到50元,适合电子爱好者和学生实践。

weixin_30530939的博客 551

基于kubesphere的k8s环境部署三节点的rook-ceph集群

基于kubesphere的k8s环境部署三节点的rook-ceph集群

大新新大浩浩的博客 5082

Cocos Creator3.5.2使用Spine切换皮肤

3、然后获取当前spine中是否有皮肤数据,如果spine连皮肤数据都没有,接着写可能会error,这里的 skins[skin],是判断皮肤列表中是否有需要更换的皮肤。2、因为spine往往意味着异步加载,换肤时也经常出现频繁异步的情况,所以下一步我们要可以判断当前spine组件里是否已经加载好了spine文件。换肤前隐藏好需要换肤的节点,避免穿帮;官网文档的换肤流程太简化,对于实际使用来说会有各种各样的问题。1、首先获取对应的spine组件。这里的skin自然是外部传入的需要换肤的皮肤名。

tc654321的博客 1817

k8s部署rook-ceph记录

我是cenos7.4的系统,错误安装了ceph17.2后,一切看上去均正常,但是就是无法挂载pv到容器上,经过查了无数资料, 确定centos7 系统安装ceph 15.2 是比较稳妥的做法。以下文件是修改过后的operator.yaml配置文件,用于rook-operator的自定义配置, 我个人对此文件只对cpu限制部门进行修改,缩小了默认请求配置,其他项目均为修改。由于容器镜像均无法正常访问,因此推荐安装镜像代理服务,自动使用镜像代理服务拉取新创建的 Pod 中的外网容器镜像(仅限公有镜像)。

quadimodo的博客 2398

BurpSuite实战:5分钟搞定Pikachu靶场表单爆破(附最新字典配置技巧)

本文通过Pikachu靶场实战,详细演示了如何使用BurpSuite的Intruder模块对Web登录表单进行暴力破解。从代理配置、请求捕获、集束炸弹模式设置,到载荷配置与结果分析,提供了完整的操作流程。文中还分享了2024年有效的字典获取与优化技巧,帮助安全测试人员快速定位弱口令漏洞。

weixin_29327977的博客 600

DataEaseV2.9 本地开发环境搭建与调试指南

本文详细指导如何搭建DataEase V2.9的本地开发环境,涵盖从软件准备、源码获取、数据库初始化到在IDEA中配置、编译和调试的全过程。重点解决了本地运行环境的关键配置与常见问题,帮助开发者高效开启DataEase的定制化开发与二次开发。

weixin_29290863的博客 141

在k8s高可用集群上用ROOK部署ceph集群并创建PVC

Rook概述 Ceph简介 Ceph是一种高度可扩展的分布式存储解决方案,提供对象、文件和块存储。在每个存储节点上,将找到Ceph存储对象的文件系统和Ceph OSD(对象存储守护程序)进程。在Ceph集群上,还存在Ceph MON(监控)守护程序,它们确保Ceph集群保持高可用性。 Rook简介 Rook 是一个开源的cloud-native storage编排, 提供平台和框架;为各种存储解...

Johnny_Li的博客 848

Image Sensor常见分辨率下HTS,VTS设置

image sensor,HTS,VTS

propor的专栏 4974

Rook:在 Kubernetes 上管理 Ceph 存储

Rook是一款开源的云原生存储编排工具,专为Kubernetes设计,可将Ceph分布式存储系统与K8s深度集成。它通过Kubernetes Operator模式自动化管理Ceph集群,包括部署、扩容、版本升级和故障恢复等复杂运维操作,大幅降低人工管理成本。作为CNCF毕业项目,Rook已通过生产验证,支持Helm或YAML安装,提供稳定的存储服务。对于需要在K8s上运行有状态应用的企业,Rook有效简化了持久化存储管理,让团队能更专注于业务开发。

tianmushand77的博客 246

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 904

ADB 安装教程:如何在 Windows、 Linux 上安装 Android Debug Bridge

本文介绍了在Windows和Linux系统上安装ADB(Android调试桥)的方法。对于Windows系统:1)从官网下载ADB工具并解压;2)通过命令提示符验证安装;3)配置环境变量以实现全局使用;4)再次验证全局ADB功能。Linux系统可通过包管理器直接安装(如Ubuntu使用apt,Fedora使用dnf),安装后同样需验证版本信息确认成功。两种系统安装完成后,都能通过"adb version"命令检查安装状态。

qq_53545309的博客 442

K8s部署MySQL与Ceph存储整合方案详解

分布式存储系统Ceph通过RBD为Kubernetes提供高可用的块存储服务,解决了有状态服务在云原生环境中的持久化存储难题。作为开源的统一存储解决方案,Ceph的多副本机制确保数据高可用,支持动态扩展存储容量,并能通过SSD/NVMe缓存分层满足不同性能需求。结合K8s的StatefulSet部署模型,MySQL等数据库服务可以获得与无状态服务相同的调度灵活性。该方案特别适合需要弹性扩展和高可用保障的企业级应用场景,通过Rook Operator实现Ceph与K8s的深度集成,大幅降低了分布式数据库的运维

weixin_42548888的博客 260

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

k8s云原生rook-ceph pvc快照与恢复(上)

k8s云原生rook-ceph pvc快照与恢复(上)

虽非技冠群英首,愿与同道共长歌; 大鹏一日同风起,扶摇直上九万里; 1119

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

跨平台文本编辑器 Notepad-- 完整指南:批量替换、文件对比、编码修复 3 个功能一次讲透

Notepad-- 是一款免费的开源文本编辑器,同时支持 Windows、Linux、macOS。如果你经常处理中文乱码文件、需要全项目改变量名、或合并前要核对两份文件的差异,它的编码转换、目录批量替换、文件对比三大功能,装好预编译包 5 分钟就能上手。 ## 这款编辑器适合谁 - 经常要处理跨系统拷来的中文文件,动不动就遇到方块字的人 - 全项目统一改名变量、批量改配置,不想逐个文件打开替换

gitblog_00040的博客 860

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

K8s & K3s 集群中构建云原生存储系统( rook + ceph )

前景提要 容器的持久化存储是保存容器存储状态的重要手段,存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保存在多个节点上,而与当前宿主机没有任何绑定关系。这样,无论你在其他哪个宿主机上启动新的容器,都可以请求挂载指定的持久化存储卷,从而访问到数据卷里保存的内容。 由于 Kubernetes 本身的松耦合设计,绝大多数存储项目,比如 Ceph、GlusterFS、NFS 等,都可以为 Kubernetes 提供持久化存储能力

weixin_36532747的博客 1082

k8s源码分析 pdf_rook源码分析之一:rook架构解析

rook简介Rook是一款云原生环境下的开源分布式存储编排系统,目前支持 Ceph、NFS、Edegefs、Cassandra、CockroachDB等存储系统。它实现了一个自动管理的、自动扩容的、自动修复的分布式存储服务。Rook 支持自动部署、启动、配置、分配、扩容/缩容、升级、迁移、灾难恢复、监控以及资源管理。Rook依赖底于编排平台kubernetes的operate提供服务。当前,Roo...

weixin_31730595的博客 452

终极指南:如何在Kubernetes中快速部署Rook云原生存储编排器

Rook是一个开源的云原生存储编排平台,专为Kubernetes设计,能够轻松部署和管理Ceph存储集群。作为Kubernetes生态系统中的重要组件,Rook简化了分布式存储的复杂性,让用户能够像管理其他Kubernetes资源一样管理存储。🚀 ## 为什么选择Rook? Rook将存储编排的复杂性抽象化,通过Kubernetes原生方式提供企业级存储解决方案。它支持块存储、文件存储和对象

gitblog_00267的博客 924

Kubernetes云原生开源分布式存储介绍

Kubernetes存储介绍为何引入PV、PVC以及StorageClass?熟悉Kubernetes的都对PV、PVC以及StorageClass不陌生,我们经常用到,因此这里不再详细...

Docker的专栏 2055

Rook 入门指南:在 Kubernetes 上编排 Ceph 分布式存储的云原生架构与实践

Rook 是一个开源的**云原生存储编排器(cloud-native storage orchestrator)**,为 Ceph 分布式存储提供平台、框架与支持,使其原生融入 Kubernetes 生态。本文以 Rook 官方入门文档为核心,结合本仓库源码与示例清单,系统讲解 Rook 的定位、整体架构、三种存储类型(块、共享文件系统、对象)的消费方式,以及从零部署 Ceph 集群的完整操作流程

gitblog_00654的博客 784

云计算-rook的配置使用

概念Rook 是一款云原生环境下的开源分布式存储编排系统,目前已进入 CNCF 孵化。Rook 的官方网站是 https://rook.io。Rook 将分布式存储软件转变为自我管理,自我缩放和自我修复的存储服务。它通过自动化部署,引导、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理来实现。 Rook 使用基础的...

weixin_31480911的博客 200

Kubernetes分布式存储终极指南:Rook和Ceph实战应用详解

GitHub 加速计划的 gui/guide 项目是一个关于使用 Kubernetes 搭建个人家庭集群的指南,提供了从零开始搭建、配置和管理 Kubernetes 集群的详细步骤和相关资源,非常适合希望在本地环境学习和实践 Kubernetes 技术的开发者。在 Kubernetes 集群搭建中,分布式存储是关键环节,而 Rook 和 Ceph 是实现这一目标的强大组合。 ## 为什么选择 R

gitblog_01009的博客 505
上一篇: Kubernetes 部署 Prometheus 监控系统
下一篇: kubernetes部署Ingress-nginx
willops
博客等级 码龄12年 1815粉丝 232原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

willops

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值