添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Rocky 8 使用 cephadm 安装 Ceph 16.2 (Pacific),实验 NFS 服务,记录一下安装和配置过程。

Ceph 是一款分布式存储系统,支持三种存储方式:对象存储、块存储和文件存储。Ceph 的部署工具有很多,但是 Ceph v15.2 (Octopus) 开始,推荐使用 cephadm 和 rook。其中 rook 是针对 kubernetes 的 ceph 部署工具,不在本例范围。

cephadm 为单独部署工具,使用容器化技术进行集群部署和管理,容器技术目前支持使用 docker 和 podman,本例以 podman 为例进行部署。本例以 Ceph v16.2 (Pacific) 为例进行安装演示。

本例是实验目的,仅供学习使用。

由于 Ceph 自带的 Ingress 还在开发,虽然可以配置成功,但是不能平滑切换,高可用 NFS 可能要等到 Ceph v17.2 (Quincy) 实现,如果真的可以,到时再测试一下。
具体说法可以参考官方文档 NFS CLUSTER MANAGEMENT

Note: The ingress implementation is not yet complete.  Enabling
	  ingress will deploy multiple ganesha instances and balance
	  load across them, but a host failure will not immediately
	  cause cephadm to deploy a replacement daemon before the NFS
	  grace period expires.  This high-availability functionality
	  is expected to be completed by the Quincy release (March
	  2022).

Rocky 8(Minimal Install)

# cat /etc/system-release
Rocky Linux release 8.5 (Green Obsidian)

Ceph 分布式存储集群中一般分为两种类型主机: MON (Monitor)监控节点 和 OSD (Object Storage Device) 对象存储设备节点。Ceph 存储集群最少需要一个 MON 和 两个 OSD (作为复制)组成。

生产环境里一般 MON 节点是 3 或 5 个, OSD 节点是越多越好,而且这两种节点应在不同主机安装,但是本例为实验目的,就安装在一起了。

本例使用 Virtual Box 虚拟机进行实验.

本例演示环境如下

ceph1、ceph2 和 ceph3 为 Ceph 集群节点,cephclient1 为客户端,用于测试挂在存储。

每个虚拟机配置两块网卡(一块 NIC 设置为 NAT,另一块 NIC 设置为 Host-only)。

  • 使用 NAT 网络,虚拟机可以访问外网,下载安装包。
  • 使用 Host-only 的好处是虚拟机网络不会受外界的网络变化影响,使用 Virtual Box 默认的 192.168.56.0/24 作为虚拟机的 CIDR,保证虚拟机之间可以相互访问(此网卡设置静态 IP 地址)。
  • 操作系统安装到 sda 盘上。
  • sdb 盘不需要格式化,因为 cephadm 只支持 BlueStore OSDs 就是直接管理裸设备,这样会极大的提升性能。
  • Ceph 支持管理网络和公用网络分开,本例没有设置,使用同一个网络。
  • 三个主机都执行:

    [root@ceph1/2/3 ~]# dnf update
    [root@ceph1/2/3 ~]# dnf install python3
    [root@ceph1/2/3 ~]# dnf install podman
    [root@ceph1/2/3 ~]# dnf install chrony
    [root@ceph1/2/3 ~]# systemctl enable chronyd && systemctl start chronyd
    

    查看一下版本:

    [root@ceph1 ~]# python3 --version
    Python 3.6.8
    [root@ceph1 ~]# podman --version
    podman version 3.3.1
    [root@ceph1 ~]# chronyc --version
    chronyc (chrony) version 4.1 (+READLINE +SECHASH +IPV6 +DEBUG)
    
    [root@ceph1/2/3 ~]# vi /etc/hosts
    192.168.56.221 ceph1
    192.168.56.222 ceph2
    192.168.56.223 ceph3
    

    由于 Ceph 对于节点之间的时间同步要求较高,本试验由于没有本地的 ntp 服务器,添加其他节点之前,设置 ceph1 节点的 chrony 服务为本地 ntp 服务器。

    生产环境应该是一个独立的 ntp 服务,防止万一 ceph1 节点出问题,导致集群时间都不同步了。

    [root@ceph1 ~]# vi /etc/chrony.conf
    

    找到本地客户端设置的地方,添加如下内容

    # Allow NTP client access from local network.
    #allow 192.168.0.0/16
    allow 192.168.56.0/24
    实验环境的网段 CIDR 为 192.168.56.0/24,请根据您的实际情况进行更改。

    修改完之后,需要重启一下 chrony 服务,并且打开防火墙端口

    [root@ceph1 ~]# systemctl restart chronyd
    [root@ceph1 ~]# firewall-cmd --permanent --add-service=ntp
    success
    [root@ceph1 ~]# firewall-cmd --reload
    success
    [root@ceph1 ~]# firewall-cmd --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp0s3 enp0s8
      sources:
      services: cockpit dhcpv6-client ntp ssh
      ports:
      protocols:
      forward: no
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:
    

    再另外两个节点设置与 ceph1 时间进行同步

    [root@ceph2/3 ~]# vi /etc/chrony.conf
    # Use public servers from the pool.ntp.org project.
    # Please consider joining the pool (http://www.pool.ntp.org/join.html).
    #pool 2.pool.ntp.org iburst
    server 192.168.56.221 iburst
    

    然后也重启一下 chronyd 服务

    [root@ceph2/3 ~]# systemctl restart chronyd
    

    这样基本就完成了准备工作。

    还有另一种方法确认,每个主机(本例为 3 个)都执行:

    [root@ceph1 ~]# curl --silent --remote-name --location https://github.com/ceph/ceph/raw/pacific/src/cephadm/cephadm
    [root@ceph1 ~]# chmod +x cephadm
    [root@ceph1 ~]# ./cephadm add-repo --release pacific
    [root@ceph1 ~]# ./cephadm install
    

    使用 cephadm prepare-host 查看准备情况

    [root@ceph1/2/3 ~]# cephadm prepare-host
    Verifying podman|docker is present...
    Verifying lvm2 is present...
    Verifying time synchronization is in place...
    Unit chronyd.service is enabled and running
    Repeating the final host check...
    podman (/usr/bin/podman) version 3.3.1 is present
    systemctl is present
    lvcreate is present
    Unit chronyd.service is enabled and running
    Host looks OK
    

    通过 cephadm 引导

    通过 cephadm “引导”一个单节点Ceph集群起来,只在 ceph1 节点运行即可。

    只在 bootstrap 节点上(本例使用 ceph1)执行

    先使用 cephadm 引导安装

    [root@ceph1 ~]# cephadm bootstrap --mon-ip 192.168.56.221
    Creating directory /etc/ceph for ceph.conf
    Verifying podman|docker is present...
    Verifying lvm2 is present...
    Verifying time synchronization is in place...
    Unit chronyd.service is enabled and running
    Repeating the final host check...
    podman (/usr/bin/podman) version 3.3.1 is present
    systemctl is present
    lvcreate is present
    Unit chronyd.service is enabled and running
    Host looks OK
    Cluster fsid: 9cad419e-7d8d-11ec-8335-080027b919a0
    Verifying IP 192.168.56.221 port 3300 ...
    Verifying IP 192.168.56.221 port 6789 ...
    Mon IP `192.168.56.221` is in CIDR network `192.168.56.0/24`
    - internal network (--cluster-network) has not been provided, OSD replication will default to the public_network
    Pulling container image quay.io/ceph/ceph:v16...
    Ceph version: ceph version 16.2.7 (dd0603118f56ab514f133c8d2e3adfc983942503) pacific (stable)
    Extracting ceph user uid/gid from container image...
    Creating initial keys...
    Creating initial monmap...
    Creating mon...
    firewalld ready
    Enabling firewalld service ceph-mon in current zone...
    Waiting for mon to start...
    Waiting for mon...
    mon is available
    Assimilating anything we can from ceph.conf...
    Generating new minimal ceph.conf...
    Restarting the monitor...
    Setting mon public_network to 192.168.56.0/24
    Wrote config to /etc/ceph/ceph.conf
    Wrote keyring to /etc/ceph/ceph.client.admin.keyring
    Creating mgr...
    Verifying port 9283 ...
    firewalld ready
    Enabling firewalld service ceph in current zone...
    firewalld ready
    Enabling firewalld port 9283/tcp in current zone...
    Waiting for mgr to start...
    Waiting for mgr...
    mgr not available, waiting (1/15)...
    mgr is available
    Enabling cephadm module...
    Waiting for the mgr to restart...
    Waiting for mgr epoch 4...
    mgr epoch 4 is available
    Setting orchestrator backend to cephadm...
    Generating ssh key...
    Wrote public SSH key to /etc/ceph/ceph.pub
    Adding key to root@localhost authorized_keys...
    Adding host ceph1...
    Deploying mon service with default placement...
    Deploying mgr service with default placement...
    Deploying crash service with default placement...
    Deploying prometheus service with default placement...
    Deploying grafana service with default placement...
    Deploying node-exporter service with default placement...
    Deploying alertmanager service with default placement...
    Enabling the dashboard module...
    Waiting for the mgr to restart...
    Waiting for mgr epoch 8...
    mgr epoch 8 is available
    Generating a dashboard self-signed certificate...
    Creating initial admin user...
    Fetching dashboard port number...
    firewalld ready
    Enabling firewalld port 8443/tcp in current zone...
    Ceph Dashboard is now available at:
    	     URL: https://ceph1:8443/
    	    User: admin
    	Password: gzziclqs79
    Enabling client.admin keyring and conf on hosts with "admin" label
    You can access the Ceph CLI with:
    	sudo /usr/sbin/cephadm shell --fsid 9cad419e-7d8d-11ec-8335-080027b919a0 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
    Please consider enabling telemetry to help improve Ceph:
    	ceph telemetry on
    For more information see:
    	https://docs.ceph.com/docs/pacific/mgr/telemetry/
    Bootstrap complete.
    

    看到 Bootstrap complete 表示引导完成。

    最后几句说明:

  • 访问 https://ceph1:8443, 输入用户名和密码登录之后,修改密码。
  • 同意 telemetry,即可使用 Dashboard GUI,使用网页查看比较方便.
  • Ceph CLI 操作有三种方式:

    cephadm shell 命令模式

    [root@ceph1 ~]# cephadm shell
    Inferring fsid ad3f72f2-798c-11ec-9e79-080027b919a0
    Using recent ceph image quay.io/ceph/ceph@sha256:bb6a71f7f481985f6d3b358e3b9ef64c6755b3db5aa53198e0aac38be5c8ae54
    [ceph: root@ceph1 /]#
    

    可以看到,shell 的命令行格式变了,ceph 前缀出现了。

    如果想退出,直接输入 exit 就可以了。

    [ceph: root@ceph1 /]# exit
    [root@ceph1 ~]#
    

    这样就回到了本机的 shell 模式。

    cephadm shell -- 前缀模式

    cephadm 也可以使用 cephadm shell -- 开头执行其他 ceph 的命令.

    [root@ceph1 ~]# cephadm shell -- ceph -v
    Inferring fsid ad3f72f2-798c-11ec-9e79-080027b919a0
    Using recent ceph image quay.io/ceph/ceph@sha256:bb6a71f7f481985f6d3b358e3b9ef64c6755b3db5aa53198e0aac38be5c8ae54
    ceph version 16.2.7 (dd0603118f56ab514f133c8d2e3adfc983942503) pacific (stable)
    

    但是每次输入 cephadmin shell -- 这个有点太长了。

    使用 cephadm 安装 ceph-common 包,方便使用 ceph 命令,里面包含了所有的 ceph 命令,其中包括 ceph,rbd,mount.ceph(用于安装CephFS文件系统)等

    [root@ceph1 ~]# cephadm install  ceph-common
    

    以后可以再 ceph1 节点上直接执行 ceph 命令了。

    推荐使用方法 1 进行操作,红帽的官方文档示例都是这么操作的。因为使用的是容器内的命令,升级也方便,本地包依赖较少。

    本实验使用方法 3,方便一点。

    [root@ceph1 ~]#ceph -v
    ceph version 16.2.7 (dd0603118f56ab514f133c8d2e3adfc983942503) pacific (stable)
    

    查看编排服务的状态

    [root@ceph1 ~]# ceph orch status
    Backend: cephadm
    Available: Yes
    Paused: No
    

    查看容器编排服务

    [root@ceph1 ~]# ceph orch ls
    NAME           PORTS        RUNNING  REFRESHED  AGE  PLACEMENT
    alertmanager   ?:9093,9094      1/1  2s ago     2m   count:1
    crash                           1/1  2s ago     2m   *
    grafana        ?:3000           1/1  2s ago     2m   count:1
    mgr                             1/2  2s ago     2m   count:2
    mon                             1/5  2s ago     2m   count:5
    node-exporter  ?:9100           1/1  2s ago     2m   *
    prometheus     ?:9095           1/1  2s ago     2m   count:1
    

    可以看到,安装了 7 个容器服务。

  • mgr: ceph-manager (Ceph 管理程序) 也就是 Dashboard
  • mon: ceph-monitor (Ceph 监视器)
  • crash: ceph-crash 崩溃数据收集模块
  • prometheus: prometheus监控组件
  • grafana: 监控数据展示 dashboard
  • alertmanager: prometheus告警组件
  • node_exporter: prometheus节点数据收集组件
  • mon 服务默认需要安装 5 个,由于目前只安装了一个节点,所以是 1/5.
    同理 mgr 服务默认需要安装 2 个,当前为 1/2

    查看一下容器的进程

    [root@ceph1 ~]# ceph orch ps
    NAME                 HOST   PORTS        STATUS          REFRESHED   AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
    alertmanager.ceph1   ceph1  *:9093,9094  running (107s)    36s ago    3m    14.7M        -  0.20.0   0881eb8f169f  3fd92369ad05
    crash.ceph1          ceph1               running (3m)      36s ago    3m    6953k        -  16.2.7   cc266d6139f4  7b0cb81a82b6
    grafana.ceph1        ceph1  *:3000       running (104s)    36s ago    2m    27.9M        -  6.7.4    557c83e11646  841ac47ee29a
    mgr.ceph1.jhzbvt     ceph1  *:9283       running (4m)      36s ago    4m     436M        -  16.2.7   cc266d6139f4  9415d4d83d3e
    mon.ceph1            ceph1               running (4m)      36s ago    4m    42.9M    2048M  16.2.7   cc266d6139f4  3f363410d2a1
    node-exporter.ceph1  ceph1  *:9100       running (2m)      36s ago    2m    8456k        -  0.18.1   e5a616e4b9cf  9bfd6a8485f9
    prometheus.ceph1     ceph1  *:9095       running (117s)    36s ago  117s    27.4M        -  2.18.1   de242295e225  ac00e5fb6eb8
    

    最后查看一下 ceph 的总体状态

    [root@ceph1 ~]# ceph status
      cluster:
        id:     66dc8e50-7da4-11ec-9e9b-080027b919a0
        health: HEALTH_WARN
                OSD count 0 < osd_pool_default_size 3
      services:
        mon: 1 daemons, quorum ceph1 (age 5m)
        mgr: ceph1.jhzbvt(active, since 3m)
        osd: 0 osds: 0 up, 0 in
      data:
        pools:   0 pools, 0 pgs
        objects: 0 objects, 0 B
        usage:   0 B used, 0 B / 0 B avail
    

    可以看到,HEALTH_WARN,因为没有添加 OSD,OSD count 0 < osd_pool_default_size 3 可以看到,默认最少 3 个 OSD。

    查看一下引导节点 ceph1 的防火墙开放情况

    [root@ceph1 ~]# firewall-cmd --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp0s3 enp0s8
      sources:
      services: ceph ceph-mon cockpit dhcpv6-client ssh
      ports: 9283/tcp 8443/tcp 9093/tcp 9094/tcp 3000/tcp 9100/tcp 9095/tcp
      protocols:
      forward: no
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:
    

    可以看到 cephadm 部署过程中,会自动打开需要开放防火墙端口和服务端口(ntp 的服务端口是前面设置开放的)。

    本例使用 podman 进行容器管理,也可以查一下 podman 下载了哪些镜像

    [root@ceph1 ~]# podman image ls
    REPOSITORY                        TAG         IMAGE ID      CREATED        SIZE
    quay.io/ceph/ceph                 v16         cc266d6139f4  5 weeks ago    1.24 GB
    quay.io/ceph/ceph-grafana         6.7.4       557c83e11646  5 months ago   496 MB
    quay.io/prometheus/prometheus     v2.18.1     de242295e225  20 months ago  141 MB
    quay.io/prometheus/alertmanager   v0.20.0     0881eb8f169f  2 years ago    53.5 MB
    quay.io/prometheus/node-exporter  v0.18.1     e5a616e4b9cf  2 years ago    24.3 MB
    

    先拷贝公钥到其他主机,使引导节点 ceph1 可以免密登录到其他主机。

    [root@ceph1 ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph2
    [root@ceph1 ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph3
    

    执行如下命令添加主机

    [ceph: root@ceph1 /]# ceph orch host add ceph2 192.168.56.222
    [ceph: root@ceph1 /]# ceph orch host add ceph3 192.168.56.223
    

    查看一下:

    [ceph: root@ceph1 /]# ceph orch host ls
    HOST   ADDR            LABELS  STATUS
    ceph1  192.168.56.221  _admin
    ceph2  192.168.56.222
    ceph3  192.168.56.223
    

    可以看到 bootstrap 节点默认的标签是 _admin

    也可以给其他主机添加 _admin 标签

    [ceph: root@ceph1 /]# ceph orch host label add ceph2 _admin
    

    过一段时间再查看一下容器部署情况

    [ceph: root@ceph1 /]# ceph orch ls
    NAME           PORTS        RUNNING  REFRESHED  AGE  PLACEMENT
    alertmanager   ?:9093,9094      1/1  6m ago     55m  count:1
    crash                           3/3  6m ago     55m  *
    grafana        ?:3000           1/1  6m ago     55m  count:1
    mgr                             2/2  6m ago     56m  count:2
    mon                             3/5  6m ago     56m  count:5
    node-exporter  ?:9100           3/3  6m ago     55m  *
    prometheus     ?:9095           1/1  6m ago     55m  count:1
    

    可以看一下具体的部署情况

    [ceph: root@ceph1 /]# ceph orch ps
    NAME                 HOST   PORTS        STATUS         REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
    alertmanager.ceph1   ceph1  *:9093,9094  running (21m)    16s ago  59m    23.2M        -  0.20.0   0881eb8f169f  b0768c563aa5
    crash.ceph1          ceph1               running (49m)    16s ago  59m    21.1M        -  16.2.7   cc266d6139f4  d4499df1c025
    crash.ceph2          ceph2               running (26m)    18s ago  26m    7226k        -  16.2.7   cc266d6139f4  194e4c9bbd7e
    crash.ceph3          ceph3               running (22m)    18s ago  22m    8967k        -  16.2.7   cc266d6139f4  e511a891c88e
    grafana.ceph1        ceph1  *:3000       running (49m)    16s ago  58m    87.5M        -  6.7.4    557c83e11646  9d429ed860aa
    mgr.ceph1.jhzbvt     ceph1  *:9283       running (49m)    16s ago  60m     565M        -  16.2.7   cc266d6139f4  f7f8e2b2f598
    mgr.ceph2.nyvgyk     ceph2  *:8443,9283  running (26m)    18s ago  26m     391M        -  16.2.7   cc266d6139f4  69d79592715b
    mon.ceph1            ceph1               running (49m)    16s ago  60m     230M    2048M  16.2.7   cc266d6139f4  dd554eefde37
    mon.ceph2            ceph2               running (26m)    18s ago  26m     120M    2048M  16.2.7   cc266d6139f4  a918d88f9ccb
    mon.ceph3            ceph3               running (22m)    18s ago  22m     129M    2048M  16.2.7   cc266d6139f4  516ed7cd5edd
    node-exporter.ceph1  ceph1  *:9100       running (49m)    16s ago  58m    31.8M        -  0.18.1   e5a616e4b9cf  c6d106db5a98
    node-exporter.ceph2  ceph2  *:9100       running (24m)    18s ago  24m    14.0M        -  0.18.1   e5a616e4b9cf  9e67734ba9e4
    node-exporter.ceph3  ceph3  *:9100       running (22m)    18s ago  22m    16.0M        -  0.18.1   e5a616e4b9cf  64b88ba334e2
    prometheus.ceph1     ceph1  *:9095       running (21m)    16s ago  57m    56.9M        -  2.18.1   de242295e225  02c4906b7a5d
      
  • mgr 也到默认的上限 2 个,部署到了 2 个节点上。
  • mon 也是部署了 3 个,但是默认最多是 5 个,所以还没有到默认的上限。
  • 本实验没有那么多主机,修改一下 mon 的部署数量上限,

    mon 一般 3 或 5 个,修改的时候一定要包含 bootstrap 节点(本例为 ceph1)

    修改一下 mon 节点到 ceph1,ceph2,ceph3

    [root@ceph1 ~]# ceph orch apply mon ceph1,ceph2,ceph3
    Scheduled mon update...
    

    再次查看一下

    [root@ceph1 ~]# ceph orch ls
    NAME           PORTS        RUNNING  REFRESHED  AGE  PLACEMENT
    alertmanager   ?:9093,9094      1/1  3m ago     73m  count:1
    crash                           3/3  3m ago     73m  *
    grafana        ?:3000           1/1  3m ago     73m  count:1
    mgr                             2/2  3m ago     73m  count:2
    mon                             3/3  3m ago     2s   ceph1;ceph2;ceph3
    node-exporter  ?:9100           3/3  3m ago     73m  *
    prometheus     ?:9095           1/1  3m ago     73m  count:1
    

    可以看到 RUNNING 列上,mon 已经是 3/3 了, PLACEMENT 列上,可以看到运行在那台电脑主机上。

    也可以只指定数量

    [root@ceph1 ~]# ceph orch apply mon 3
    Scheduled mon update...
    

    再次查看一下

    [root@ceph1 ~]# ceph orch ls
    NAME           PORTS        RUNNING  REFRESHED  AGE  PLACEMENT
    alertmanager   ?:9093,9094      1/1  9m ago     69m  count:1
    crash                           3/3  9m ago     69m  *
    grafana        ?:3000           1/1  9m ago     69m  count:1
    mgr                             2/2  9m ago     69m  count:2
    mon                             3/3  9m ago     8s   count:3
    node-exporter  ?:9100           3/3  9m ago     69m  *
    prometheus     ?:9095           1/1  9m ago     69m  count:1
      

    注意 PLACEMENT 列
    如果是 *, 表示每个节点都有,不受控制(unmanaged)。
    如果是 count:3,表示部署的上限数量,具体位置可以 ceph orch ps 查看一下。
    如果是 ceph1;ceph2;ceph3,表示直接显示了所在的主机位置。

    管理 OSD

    添加 OSD 需要满足以下所有条件:

  • 设备必须没有分区。
  • 设备不得具有任何 LVM 状态。
  • 不得安装设备。
  • 该设备不得包含文件系统。
  • 该设备不得包含 Ceph BlueStore OSD。
  • 设备必须大于 5 GiB。
  • 查看一下磁盘状态

    [root@ceph1 ~]# lsblk
    NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda           8:0    0   20G  0 disk
    ├─sda1        8:1    0    1G  0 part /boot
    └─sda2        8:2    0   19G  0 part
      ├─rl-root 253:0    0   17G  0 lvm  /
      └─rl-swap 253:1    0    2G  0 lvm  [SWAP]
    sdb           8:16   0   20G  0 disk
    sr0          11:0    1 1024M  0 rom
    

    本里以 sdb 为例,安装 ceph 的 osd。

    对于想做为 OSD 的盘,类型为 disk 即可,不要进行格式化,使用 orch 编排命令即可完成全部操作。

    列出节点上的所有可用设备

    [root@ceph1 ~]# ceph orch device ls
    HOST   PATH      TYPE  DEVICE ID                           SIZE  AVAILABLE  REJECT REASONS
    ceph1  /dev/sdb  hdd   VBOX_HARDDISK_VB1e5ef148-884f7c83  21.4G  Yes
    ceph2  /dev/sdb  hdd   VBOX_HARDDISK_VB6aef18c7-3d8548b1  21.4G  Yes
    ceph3  /dev/sdb  hdd   VBOX_HARDDISK_VB6b51415b-6e91c2d1  21.4G  Yes
    

    可以看到 3 个可用的设备。

    添加有两种方式,可以任选一种。

    使用 orch 命令,自动添加所有满足条件的OSD(本例使用这个)。

    [root@ceph1 ~]# ceph orch apply osd --all-available-devices
    Scheduled osd.all-available-devices update...
    

    使用 osd 命令,手工指定的方式添加OSD。

    [root@ceph1 ~]#  ceph orch daemon add osd ceph1:/dev/sdb
    [root@ceph1 ~]#  ceph orch daemon add osd ceph2:/dev/sdb
    [root@ceph1 ~]#  ceph orch daemon add osd ceph3:/dev/sdb
    

    部署完之后,查看一下

    [root@ceph1 ~]# ceph osd tree
    ID  CLASS  WEIGHT   TYPE NAME       STATUS  REWEIGHT  PRI-AFF
    -1         0.05846  root default
    -7         0.01949      host ceph1
     2    hdd  0.01949          osd.2       up   1.00000  1.00000
    -3         0.01949      host ceph2
     1    hdd  0.01949          osd.1       up   1.00000  1.00000
    -5         0.01949      host ceph3
     0    hdd  0.01949          osd.0       up   1.00000  1.00000
    

    可以看到 ID 列,从 osd.0 开始,由于是容器化部署,所以顺序是随机的,如:osd.0 标识在 ceph3 上。

    查看一下 ceph 的状态

    [root@ceph1 ~]# ceph status
      cluster:
        id:     ad3f72f2-798c-11ec-9e79-080027b919a0
        health: HEALTH_OK
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3 (age 4m)
        mgr: ceph1.jhzbvt(active, since 4m), standbys: ceph2.nyvgyk
        osd: 3 osds: 3 up (since 4m), 3 in (since 27h)
      data:
        pools:   1 pools, 1 pgs
        objects: 0 objects, 0 B
        usage:   0 B used, 60 GiB / 60 GiB avail
        pgs:     1 active+clean
    

    可以看到, ceph 集群的状态已经是 HEALTH_OK 了,集群已经好了。

    Ceph 集群,只要有 ceph-mon 和 ceph-osd 这两个就基本搭建完成了。但是如果需要使用其分布式存储功能(如对象存储,块存储和文件存储),则需要添加其他的模块。

    再查看一下容器服务

    [root@ceph1 ~]# ceph orch ls
    NAME                       PORTS        RUNNING  REFRESHED  AGE  PLACEMENT
    alertmanager               ?:9093,9094      1/1  71s ago    91m  count:1
    crash                                       3/3  74s ago    91m  *
    grafana                    ?:3000           1/1  71s ago    91m  count:1
    mgr                                         2/2  74s ago    91m  count:2
    mon                                         3/3  74s ago    18m  count:3
    node-exporter              ?:9100           3/3  74s ago    91m  *
    osd.all-available-devices                     3  74s ago    90s  *
    prometheus                 ?:9095           1/1  71s ago    91m  count:1
    

    可以看到,多了一个 osd.all-available-devices 的服务,PLACEMENT 是 * 表示所有节点都会安装。

    部署好 osd 共享池后,会自动安装一个归置组(Placement groups),归置组(PGs) 是 ceph 的重要概念。

    [root@ceph1 ~]# ceph osd pool ls
    device_health_metrics
    

    可以看到,安装了设备健康指标的归置组。

    Ceph 从 v14(Nautilus)开始支持归置组自动伸缩的,可以查看一下状态

    [root@ceph1 ~]# ceph osd pool autoscale-status
    POOL                     SIZE  TARGET SIZE  RATE  RAW CAPACITY   RATIO  TARGET RATIO  EFFECTIVE RATIO  BIAS  PG_NUM  NEW PG_NUM  AUTOSCALE  PROFILE
    device_health_metrics      0                 3.0        61428M  0.0000                                  1.0       1              on         scale-up
    

    可以看到 AUTOSCALE 是 on,表示默认设置的是自动伸缩。

    导出为 NFS 服务

    要导出 NFS 服务,CephFS 和 RGW 都可以导出,本例演示 CephFS 的导出。

    主要包括以下几个步骤:

  • 新建文件系统 CephFS
  • 新建存储池
  • 在存储池上开启 nfs 应用
  • 新建 nfs 集群
  • 新建 CephFS 的 nfs 导出 (这个会将存储池和 CephFS 联系在一起)
  • 新建文件系统 CephFS

    两种方法,任选一种

    使用的是 ceph fs 命令该命令会自动创建相应的存储池

    [root@ceph1 ~]# ceph fs volume create myfs --placement=3
    

    这样 ceph 编排器会自动创建和配置 MDS

    可以查看一下编排服务

    [root@ceph1 ~]# ceph orch ls
    NAME                       PORTS        RUNNING  REFRESHED  AGE   PLACEMENT
    alertmanager               ?:9093,9094      1/1  90s ago    4d    count:1
    crash                                       3/3  9m ago     4d    *
    grafana                    ?:3000           1/1  90s ago    4d    count:1
    mds.myfs                                    2/2  92s ago    100s  count:2
    mgr                                         2/2  92s ago    4d    count:2
    mon                                         3/3  9m ago     2h    count:3
    node-exporter              ?:9100           3/3  9m ago     4d    *
    osd.all-available-devices                     3  9m ago     4d    *
    prometheus                 ?:9095           1/1  90s ago    4d    count:1
    

    可以看到,多了一个 mds.myfs 的容器服务

    再次查看一下存储池的情况

    [root@ceph1 ~]# ceph osd pool ls
    device_health_metrics
    cephfs.myfs.meta
    cephfs.myfs.data
    

    可以看到,多了两个,cephfs.myfs.metacephfs.myfs.data

    也可以 ceph fs ls 查看一下

    [root@ceph1 ~]# ceph fs ls
    name: myfs, metadata pool: cephfs.myfs.meta, data pools: [cephfs.myfs.data ]
    

    手工创建 osd 存储池并创建 CephFS 服务

    [root@ceph1 ~]# ceph osd pool create myfs_data 32
    [root@ceph1 ~]# ceph osd pool create myfs_metadata 32
    [root@ceph1 ~]# ceph fs new myfs myfs_metadata myfs_data
    [root@ceph1 ~]# ceph orch apply mds myfs --placement=3
    

    如果想删除存储池,需要先设置如下参数 mon_allow_pool_delete

    [root@ceph1 ~]# ceph config set mon mon_allow_pool_delete true
    

    删除命令如下,注意 --yes-i-really-mean-it 参数一定要加

    [root@ceph1 ~]# ceph fs volume rm myfs --yes-i-really-mean-it
    metadata pool: cephfs.myfs.meta data pool: ['cephfs.myfs.data'] removed
    

    新建存储池

    启动 nfs 服务

    [ceph root@ceph1 /] ceph mgr module enable nfs
    module 'nfs' is already enabled
    

    可以看到 nfs 模块默认是启用的。

    创建 NFS 所需的存储池。

    [root@ceph1 ~]# ceph osd pool create mynfs_data
    

    如果想删除存储池,默认是不允许的,需要先设置一个参数 mon_allow_pool_delete,本处再介绍一种方式:

    [root@ceph1 ~]# ceph tell mon.* injectargs --mon_allow_pool_delete true
    mon.ceph1: {}
    mon.ceph1: mon_allow_pool_delete = 'true'
    mon.ceph2: {}
    mon.ceph2: mon_allow_pool_delete = 'true'
    mon.ceph3: {}
    mon.ceph3: mon_allow_pool_delete = 'true'
    
    [root@ceph1 ceph]# ceph osd pool delete mynfs_data mynfs_data --yes-i-really-really-mean-it
    pool 'ganesha_data' removed
    [root@ceph1 ceph]# ceph osd pool delete .nfs .nfs --yes-i-really-really-mean-it
    pool '.nfs' removed
    

    在存储池上开启 nfs 应用

    [root@ceph1 ~]# ceph osd pool application enable mynfs_data nfs
    

    新建 NFS 集群

    创建集群, 使用 ceph nfs cluster create 命令

    [root@ceph1 ~]# ceph nfs cluster create mynfs 3 --ingress --virtual_ip 192.168.56.200
    本例使用了 --ingress 参数,目前 ingress 的高可用还没有完全完成,等到 Ceph Quincy 发布才支持

    这个命令会新建两个编排服务 ingress.nfs.mynfsnfs.mynfs

    [root@ceph1 ~]# ceph nfs cluster ls
    

    修改配置,可以先导出 yaml 格式

    ceph orch ls --service-name nfs.mynfs --export > nfs.mynfs.yaml
    

    如果想删除 NFS 集群,以下两种方法:

    使用 ceph nfs cluster rm <cluster_id> 命令

    ceph nfs cluster rm mynfs
    

    使用 ceph orch rm 删除

    [root@ceph1 ~]# ceph orch rm ingress.nfs.mynfs
    Removed service ingress.nfs.mynfs
    [root@ceph1 ~]# ceph orch rm nfs.mynfs
    Removed service nfs.mynfs
    

    新建 CephFS 的 nfs 导出

    [root@ceph1 ~]# ceph nfs export create cephfs --cluster-id mynfs --pseudo-path /data --fsname myfs --squash no_root_squash
    

    查看 nfs 信息

    [root@ceph1 ~]# ceph nfs export info mynfs /data
    

    也可以在 Ceph Dashboard 中新建 NFS,但在 Dashboard 中和 CLI 中的新建的,查看最后参数不一样,Dashboard 的多一些。

    客户端配置

    参考 NFS MOUNTING

    只支持 NFS v4.0+ 的协议

    挂载的命令

    mount -t nfs -o nfsvers=4.1,proto=tcp <ganesha-host-name>:<ganesha-pseudo-path> <mount-point>
    

    本例如下: