一、rook简介


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

二、rook部署

集群环境

主机IP角色磁盘
node110.168.1.11etcd,master,workersdb
node210.168.1.12etcd,lb,master,workersdb
node310.168.1.13etcd,lb,master,workersdb
node410.168.1.14workersdb

磁盘规划

node1node2node3node4
disksdbsdbsdbsdb

拉取项目

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

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

更多推荐