一、rook简介


Rook是一个开源的云原生存储编排器,它提供平台,框架和对各种存储解决方案的支持,与云原生环境进行本地集成。详细介绍参考rook官方文档

二、rook部署

集群环境

主机 IP 角色 磁盘
node1 10.168.1.11 etcd,master,worker sdb
node2 10.168.1.12 etcd,lb,master,worker sdb
node3 10.168.1.13 etcd,lb,master,worker sdb
node4 10.168.1.14 worker sdb

磁盘规划

node1 node2 node3 node4
disk sdb sdb sdb sdb

拉取项目

git clone --single-branch --branch v1.6.2 https://github.com/rook/rook.git

部署Rook Operator

cd rook/cluster/examples/kubernetes/ceph

配置operator.yaml

由于国内环境无法Pull官方镜像,所以要修改默认镜像地址,改为阿里云镜像仓库(registry.aliyuncs.com/it00021hot是我的镜像地址,利用github action每天定时同步官方镜像,所有版本的镜像都有)

#在67行下面,修改下面几个配置,改为阿里云的地址,tag不变(默认是注释掉的,先解开注释)
  ROOK_CSI_CEPH_IMAGE: "registry.aliyuncs.com/it00021hot/cephcsi:v3.3.1"
  ROOK_CSI_REGISTRAR_IMAGE: "registry.aliyuncs.com/it00021hot/csi-node-driver-registrar:v2.0.1"
  ROOK_CSI_RESIZER_IMAGE: "registry.aliyuncs.com/it00021hot/csi-resizer:v1.0.1"
  ROOK_CSI_PROVISIONER_IMAGE: "registry.aliyuncs.com/it00021hot/csi-provisioner:v2.0.4"
  ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.aliyuncs.com/it00021hot/csi-snapshotter:v4.0.0"
  ROOK_CSI_ATTACHER_IMAGE: "registry.aliyuncs.com/it00021hot/csi-attacher:v3.0.2"

部署operator

kubectl create -f crds.yaml -f common.yaml -f operator.yaml

配置cluster

vi cluster.yaml

  • 修改内容如下,更多配置参考官网
spec:
  dashboard:
    enabled: true
    ssl: false # 关闭ssl
  storage: # cluster level storage configuration and selection
    useAllNodes: true #如果不是使用所有节点安装ceph,请设置为false
    useAllDevices: false # 修改为false,只使用sdb
    deviceFilter: sdb    #选择磁盘sdb
  • 完整配置如下:
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: ceph/ceph:v15.2.5
    allowUnsupported: false
  dataDirHostPath: /var/lib/rook
  skipUpgradeChecks: false
  continueUpgradeAfterChecksEvenIfNotHealthy: false
  mon:
    count: 3
    allowMultiplePerNode: false
  mgr:
    modules:
    - name: pg_autoscaler
      enabled: true
  dashboard:
    enabled: true
    ssl: false # 关闭ssl
  monitoring:
    enabled: false
    rulesNamespace: rook-ceph
  network:
  crashCollector:
    disable: false
  cleanupPolicy:
    confirmation: ""
    sanitizeDisks:
      method: quick
      dataSource: zero
      iteration: 1
    allowUninstallWithVolumes: false
  annotations:
  labels:
  resources:
  removeOSDsIfOutAndSafeToRemove: false
  storage: # cluster level storage configuration and selection
    useAllNodes: true
    useAllDevices: false
    deviceFilter: sdb
    config:
  disruptionManagement:
    managePodBudgets: false
    osdMaintenanceTimeout: 30
    pgHealthCheckTimeout: 0
    manageMachineDisruptionBudgets: false
    machineDisruptionBudgetNamespace: openshift-machine-api
  healthCheck:
    daemonHealth:
      mon:
        disabled: false
        interval: 45s
      osd:
        disabled: false
        interval: 60s
      status:
        disabled: false
        interval: 60s
    # Change pod liveness probe, it works for all mon,mgr,osd daemons
    livenessProbe:
      mon:
        disabled: false
      mgr:
        disabled: false
      osd:
        disabled: false

部署cluster

kubectl create -f cluster.yaml

部署Toolbox

Rook工具箱是一个容器,其中包含用于rook调试和测试的常用工具。 该工具箱基于CentOS,因此yum可以轻松安装您选择的更多工具。

kubectl create -f toolbox.yaml

测试Rook

一旦 toolbox 的 Pod 运行成功后,我们就可以使用下面的命令进入到工具箱内部进行操作:

kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash

比如现在我们要查看集群的状态,需要满足下面的条件才认为是健康的:

  • 所有 mons 应该达到法定数量
  • mgr 应该是激活状态
  • 至少有一个 OSD 处于激活状态
  • 如果不是 HEALTH_OK 状态,则应该查看告警或者错误信息
    查看rook状态:ceph status
    在这里插入图片描述
    ceph osd status
    在这里插入图片描述
    如果群集运行不正常,可以查看 Ceph 常见问题以了解更多详细信息和可能的解决方案。

rook卸载

kubectl -n rook-ceph delete cephcluster rook-ceph
kubectl delete -f operator.yaml
kubectl delete -f common.yaml
kubectl delete -f crds.yaml

所有安装rook节点执行以下命令,清理残余文件

yum install gdisk -y
export DISK="/dev/sdb"
sgdisk --zap-all $DISK
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync
blkdiscard $DISK
ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %
rm -rf /dev/ceph-*
rm -rf /var/lib/rook/* /var/lib/kubelet/plugins/* /var/lib/kubelet/plugins_registry/*

三、存储

对于 Rook 暴露的三种存储类型可以查看对应的文档:

  • 块存储:创建一个 Pod 使用的块存储
  • 对象存储:创建一个在 Kubernetes 集群内部和外部都可以访问的对象存储
  • 共享文件系统:创建要在多个 Pod 之间共享的文件系统

3.1 ceph块存储

创建StorageClass

kubectl create -f csi/rbd/storageclass.yaml
kubectl get sc
[root@node1 ceph]# kubectl get sc
NAME              PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block   rook-ceph.rbd.csi.ceph.com      Delete          Immediate           true                   16s

创建pvc

kubectl create -f csi/rbd/pvc.yaml
kubectl get pvc
[root@node1 ceph]# kubectl create -f csi/rbd/pvc.yaml
persistentvolumeclaim/rbd-pvc created
[root@node1 ceph]# kubectl get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
rbd-pvc   Bound    pvc-6257dd80-a633-4bec-8cca-961b33deb7e2   1Gi        RWO            rook-ceph-block   4s
[root@node1 ceph]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS      REASON   AGE
pvc-6257dd80-a633-4bec-8cca-961b33deb7e2   1Gi        RWO            Delete           Bound    default/rbd-pvc   rook-ceph-block            5s

3.2 文件存储

默认Ceph未部署对CephFS的支持,使用如下官方提供的默认yaml可部署文件存储的filesystem。

kubectl create -f filesystem.yaml
kubectl create -f csi/cephfs/storageclass.yaml
kubectl get cephfilesystems.ceph.rook.io -n rook-ceph
kubectl get sc
[root@node1 ceph]#  kubectl get cephfilesystems.ceph.rook.io -n rook-ceph
NAME   ACTIVEMDS   AGE
myfs   1           10s
[root@node1 ceph]# kubectl get sc
NAME              PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block   rook-ceph.rbd.csi.ceph.com      Delete          Immediate           true                   3m
rook-cephfs       rook-ceph.cephfs.csi.ceph.com   Delete          Immediate           true                   15s

四、设置dashboard

Ceph 有一个 Dashboard 工具,我们可以在上面查看集群的状态,包括总体运行状态,mgr、osd 和其他 Ceph 进程的状态,查看池和 PG 状态,以及显示守护进程的日志等等。

我们可以在上面的 cluster CRD 对象中开启 dashboard,设置dashboard.enable=true即可,这样 Rook Operator 就会启用 ceph-mgr dashboard 模块,并将创建一个 Kubernetes Service 来暴露该服务,将启用端口 7000 进行 https 访问,如果 Ceph 集群部署成功了,我们可以使用下面的命令来查看 Dashboard 的 Service:

[root@node1 ceph]# kubectl get svc -n rook-ceph
NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
rook-ceph-mgr              ClusterIP   10.244.122.53    <none>        9283/TCP            5m
rook-ceph-mgr-dashboard    ClusterIP   10.244.76.0      <none>        7000/TCP            5m

这里的 rook-ceph-mgr 服务用于报告 Prometheus metrics 指标数据的,而后面的的 rook-ceph-mgr-dashboard 服务就是我们的 Dashboard 服务,如果在集群内部我们可以通过 DNS 名称 http://rook-ceph-mgr-dashboard.rook-ceph:7000 或者 CluterIP http://10.109.8.98:7000 来进行访问,但是如果要在集群外部进行访问的话,我们就需要通过 Ingress 或者 NodePort 类型的 Service 来暴露了,为了方便测试我们这里创建一个新的 NodePort 类型的服务来访问 Dashboard,资源清单如下所示:(dashboard-external-http.yaml)

[root@node1 ceph]# cat dashboard-external-http.yaml
apiVersion: v1
kind: Service
metadata:
  name: rook-ceph-mgr-dashboard-external-http
  namespace: rook-ceph
  labels:
    app: rook-ceph-mgr
    rook_cluster: rook-ceph
spec:
  ports:
  - name: dashboard
    port: 7000
    protocol: TCP
    targetPort: 7000
  selector:
    app: rook-ceph-mgr
    rook_cluster: rook-ceph
  sessionAffinity: None
  type: NodePort

现在我们需要通过 http://ip:port就可以访问到 Dashboard 了。
但是在访问的时候需要我们登录才能够访问,Rook 创建了一个默认的用户 admin,并在运行 Rook 的命名空间中生成了一个名为 rook-ceph-dashboard-admin-password 的 Secret,要获取密码,可以运行以下命令:

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

用上面获得的密码和用户名 admin 就可以登录 Dashboard 了,在 Dashboard 上面可以查看到整个集群的状态:

在这里插入图片描述

参考: https://www.cnblogs.com/itzgr/p/12516141.html

Logo

开源、云原生的融合云平台

更多推荐