注意

本文档适用于 Ceph 的开发版本。

服务管理

服务是一组配置在一起的守护程序。有关单个服务的详细信息,请参阅这些章节

服务状态

要查看 Ceph 集群中正在运行的一个服务的状态,请执行以下操作

  1. 使用命令行打印服务列表。

  2. 找到您要检查状态的服务。

  3. 打印服务的状态。

以下命令打印协调器知道的服务列表。要将输出限制为仅在指定主机上的服务,请使用可选的 --host 参数。要将输出限制为仅特定类型的服务,请使用可选的 --type 参数(mon、osd、mgr、mds、rgw)

ceph orch ls [--service_type type] [--service_name name] [--export] [--format f] [--refresh]

发现特定服务或守护程序的状态

ceph orch ls --service_type type --service_name <name> [--refresh]

要导出协调器知道的服务规范,请运行以下命令。

ceph orch ls --export

使用此命令导出的服务规范将以 YAML 格式导出,该 YAML 可用于 ceph orch apply -i 命令。

有关检索单个服务规范的信息(包括命令示例),请参阅 检索正在运行的服务规范

守护程序状态

守护程序是正在运行且属于服务的 systemd 单元。

要查看守护程序的状态,请执行以下操作

  1. 打印协调器知道的所有守护程序列表。

  2. 查询目标守护程序的状态。

首先,打印协调器知道的所有守护程序列表

ceph orch ps [--hostname host] [--daemon_type type] [--service_name name] [--daemon_id id] [--format f] [--refresh]

然后查询特定服务实例的状态(mon、osd、mds、rgw)。对于 OSD,id 是数字 OSD ID。对于 MDS 服务,id 是文件系统名称

ceph orch ps --daemon_type osd --daemon_id 0

注意

命令 ceph orch ps 的输出可能无法反映守护程序的当前状态。默认情况下,状态每 10 分钟更新一次。可以通过修改 mgr/cephadm/daemon_cache_timeout 配置变量(以秒为单位)来缩短此间隔,例如:ceph config set mgr mgr/cephadm/daemon_cache_timeout 60 会将刷新间隔缩短到一分钟。信息每 daemon_cache_timeout 秒更新一次,除非使用 --refresh 选项。此选项将触发刷新信息的请求,这可能需要一些时间,具体取决于集群的大小。通常,REFRESHED 值表示 ceph orch ps 和类似命令显示的信息有多新。

服务规范

服务规范是用于指定服务部署的数据结构。除了 placementnetworks 等参数之外,用户还可以通过 config 部分设置服务配置参数的初始值。对于每个 param/value 配置对,cephadm 调用以下命令来设置其值

ceph config set <service-name> <param> <value>

如果规范中发现无效配置参数(CEPHADM_INVALID_CONFIG_OPTION)或者在尝试应用新配置选项时发生任何错误(CEPHADM_FAILED_SET_OPTION),Cephadm 会发出健康警告。

这是一个 YAML 格式的服务规范示例

service_type: rgw
service_id: realm.zone
placement:
  hosts:
    - host1
    - host2
    - host3
config:
  param_1: val_1
  ...
  param_N: val_N
unmanaged: false
networks:
- 192.169.142.0/24
spec:
  # Additional service specific attributes.

在此示例中,此服务规范的属性是

class ceph.deployment.service_spec.ServiceSpec(service_type, service_id=None, placement=None, count=None, config=None, ssl=False, certificate_source=None, custom_sans=None, ssl_cert=None, ssl_key=None, unmanaged=False, preview_only=False, networks=None, targets=None, extra_container_args=None, extra_entrypoint_args=None, custom_configs=None, ip_addrs=None, ssl_ca_cert=None, termination_grace_period_seconds=None)

服务创建详情。

向协调器请求守护程序集群,例如 MDS、RGW、iscsi 网关、nvmeof 网关、MON、MGR、Prometheus

此结构应包含启动服务所需的足够信息。

networks: List[str]

网络标识列表,指示守护程序仅绑定到该列表中的特定网络。如果集群分布在多个网络中,您可以添加多个网络。请参阅 网络和端口指定网络指定网络

placement: PlacementSpec

请参阅 守护程序放置

service_id

服务的名称。对于 iscsinvmeofmdsnfsosdrgwcontaineringress 是必需的

service_type

服务的类型。必须是 Ceph 服务(moncrashmdsmgrosdrbd-mirror)、网关(nfsrgw)、监控堆栈的一部分(alertmanagergrafananode-exporterprometheus)或(container)用于自定义容器。

unmanaged

如果设置为 true,协调器将不会部署或删除与此服务关联的任何守护程序。放置和所有其他属性都将被忽略。如果您不想暂时管理此服务,这将很有用。对于 cephadm,请参阅 禁用守护程序的自动部署

每种服务类型都可以有额外的特定于服务的属性。

类型为 monmgr 和监控类型的服务规范不需要 service_id

类型为 osd 的服务在 高级 OSD 服务规范 中描述。

可以使用 ceph orch apply -i 通过提交多文档 YAML 文件一次应用多个服务规范

cat <<EOF | ceph orch apply -i -
service_type: mon
placement:
  host_pattern: "mon*"
---
service_type: mgr
placement:
  host_pattern: "mgr*"
---
service_type: osd
service_id: default_drive_group
placement:
  host_pattern: "osd*"
data_devices:
  all: true
EOF

检索正在运行的服务规范

如果服务已通过 ceph orch apply... 启动,则直接更改服务规范很复杂。我们建议通过以下说明导出正在运行的服务规范,而不是尝试直接更改服务规范

ceph orch ls --service-name rgw.<realm>.<zone> --export > rgw.<realm>.<zone>.yaml
ceph orch ls --service-type mgr --export > mgr.yaml
ceph orch ls --export > cluster.yaml

然后可以更改规范并如上所述重新应用。

更新服务规范

Ceph 协调器在 ServiceSpec 中维护每个服务的声明状态。对于某些操作,例如更新 RGW HTTP 端口,我们需要更新现有规范。

  1. 列出当前的 ServiceSpec

    ceph orch ls --service_name=<service-name> --export > myservice.yaml
    
  2. 更新 yaml 文件

    vi myservice.yaml
    
  3. 应用新的 ServiceSpec

    ceph orch apply -i myservice.yaml [--dry-run]
    

守护程序放置

为了让协调器部署服务,它需要知道在哪里部署守护程序以及要部署多少个。这是放置规范的作用。放置规范可以通过命令行参数或 YAML 文件传递。

注意

Cephadm 不会在带有 _no_schedule 标签的主机上部署守护程序;请参阅 特殊主机标签

注意

apply 命令可能会让人困惑。因此,我们建议使用 YAML 规范。

每个 ceph orch apply <service-name> 命令都会取代它之前的命令。如果使用不当的语法,您将在操作过程中破坏您的工作。

例如

ceph orch apply mon host1
ceph orch apply mon host2
ceph orch apply mon host3

这导致只有一台主机应用了监视器:host3。

(第一个命令在 host1 上创建了一个监视器。然后第二个命令破坏了 host1 上的监视器并在 host2 上创建了一个监视器。然后第三个命令破坏了 host2 上的监视器并在 host3 上创建了一个监视器。在这种情况下,此时,只有 host3 上有监视器。)

要确保在这三台主机上都应用了监视器,请运行如下命令

ceph orch apply mon "host1,host2,host3"

还有另一种方法可以将监视器应用到多台主机:可以使用 YAML 文件。您不需要使用 ceph orch apply mon 命令,而是运行这种形式的命令

ceph orch apply -i file.yaml

这是一个示例 file.yaml 文件

service_type: mon
placement:
  hosts:
   - host1
   - host2
   - host3

显式放置

通过简单地指定主机,可以将守护程序显式放置在主机上

ceph orch apply prometheus --placement="host1 host2 host3"

或者在 YAML 中

service_type: prometheus
placement:
  hosts:
    - host1
    - host2
    - host3

MON 和其他服务可能需要一些增强的网络规范

ceph orch daemon add mon --placement="myhost:[v2:1.2.3.4:3300,v1:1.2.3.4:6789]=name"

其中 [v2:1.2.3.4:3300,v1:1.2.3.4:6789] 是监视器的网络地址,=name 指定新监视器的名称。

按标签放置

守护程序放置可以限制为与特定标签匹配的主机。要将标签 mylabel 设置给相应的主机,请运行此命令

ceph orch host label add *<hostname>* mylabel

要查看当前主机和标签,请运行此命令

ceph orch host ls

例如

ceph orch host label add host1 mylabel
ceph orch host label add host2 mylabel
ceph orch host label add host3 mylabel
ceph orch host ls
HOST   ADDR   LABELS  STATUS
host1         mylabel
host2         mylabel
host3         mylabel
host4
host5

现在,通过运行此命令告诉 cephadm 根据标签部署守护程序

ceph orch apply prometheus --placement="label:mylabel"

或者在 YAML 中

service_type: prometheus
placement:
  label: "mylabel"

按模式匹配放置

守护程序也可以使用主机模式放置在主机上。默认情况下,主机模式使用 fnmatch 进行匹配,fnmatch 支持 UNIX shell 风格的通配符(请参阅 https://docs.pythonlang.cn/3/library/fnmatch.html

ceph orch apply prometheus --placement='myhost[1-3]'

或者在 YAML 中

service_type: prometheus
placement:
  host_pattern: "myhost[1-3]"

要在所有主机上放置服务,请使用 "*"

ceph orch apply node-exporter --placement='*'

或者在 YAML 中

service_type: node-exporter
placement:
  host_pattern: "*"

主机模式也支持使用正则表达式。要使用正则表达式,您必须在使用命令行时在模式开头添加“regex:”,或者在使用 YAML 时指定 pattern_type 字段为“regex”。

在命令行上

ceph orch apply prometheus --placement='regex:FOO[0-9]|BAR[0-9]'

在 YAML 中

service_type: prometheus
placement:
  host_pattern:
    pattern: 'FOO[0-9]|BAR[0-9]'
    pattern_type: regex

更改守护程序数量

通过指定 count,将只创建指定数量的守护程序

ceph orch apply prometheus --placement=3

要在主机子集上部署守护程序,请指定该子集的数量和主机名或 模式

ceph orch apply prometheus --placement="2 host1 host2 host3"

如果数量大于主机数量,cephadm 会每台主机部署一个

ceph orch apply prometheus --placement="3 host1 host2"

紧接上面的命令导致创建两个 Prometheus 守护程序。

YAML 也可以用来指定限制,如下所示

service_type: prometheus
placement:
  count: 3

YAML 也可以用来指定主机上的限制

service_type: prometheus
placement:
  count: 2
  hosts:
    - host1
    - host2
    - host3

守护程序并置

Cephadm 支持在同一主机上部署多个守护程序

service_type: rgw
placement:
  label: rgw
  count_per_host: 2

在每台主机上部署多个守护程序的主要原因是为在同一主机上运行多个 RGW 和 MDS 守护程序提供额外的性能优势。

另请参阅

此功能在 Pacific 中引入。

算法说明

Cephadm 的声明状态由包含放置规范的服务规范列表组成。

Cephadm 不断将集群中实际运行的守护程序列表与服务规范中的列表进行比较。Cephadm 根据需要添加新守护程序和删除旧守护程序,以符合服务规范。

Cephadm 执行以下操作以保持与服务规范的兼容性。

Cephadm 首先选择候选主机列表。Cephadm 寻找显式主机名并选择它们。如果 cephadm 没有找到显式主机名,它会查找标签规范。如果在规范中未定义标签,cephadm 会根据主机模式选择主机。如果未定义主机模式,作为最后的手段,cephadm 会选择所有已知主机作为候选主机。

Cephadm 知道正在运行服务的现有守护程序,并尽量避免移动它们。

Cephadm 支持部署特定数量的服务。考虑以下服务规范

service_type: mds
service_name: myfs
placement:
  count: 3
  label: myfs

此服务规范指示 cephadm 在标记为 myfs 的主机上部署三个守护程序,遍布整个集群。

如果在候选主机上部署的守护程序少于三个,cephadm 会随机选择主机来部署新的守护程序。

如果在候选主机上部署的守护程序多于三个,cephadm 会删除现有守护程序。

最后,cephadm 会删除不在候选主机列表中的主机上的守护程序。

注意

cephadm 必须考虑一个特殊情况。

如果放置规范选择的主机少于 count 要求的主机,cephadm 将仅部署在选定的主机上。

额外的容器参数

警告

为额外容器参数提供给定的参数仅限于您使用的任何容器引擎的 run 命令可用的参数。提供 run 命令不支持的任何参数(或参数的无效值)将导致守护程序启动失败。

注意

对于传递给容器内运行的进程而不是容器运行时本身的参数,请参阅 额外的入口点参数

Cephadm 支持为特定情况提供额外的杂项容器参数。例如,如果用户需要限制其 MON 守护程序使用的 CPU 数量,他们可以应用如下规范

service_type: mon
service_name: mon
placement:
  hosts:
    - host1
    - host2
    - host3
extra_container_args:
  - "--cpus=2"

这将导致每个 MON 守护程序都以 --cpus=2 部署。

有两种方法可以在 extra_container_args 列表中表示参数。首先,列表中的一项可以是字符串。当将参数作为字符串传递且字符串包含空格时,cephadm 将自动将其拆分为多个参数。例如,--cpus 2 在处理时将变为 ["--cpus", "2"]。示例

service_type: mon
service_name: mon
placement:
  hosts:
    - host1
    - host2
    - host3
extra_container_args:
  - "--cpus 2"

另一种方法是,列表中的一项可以是一个对象(映射),其中包含必需的键“argument”和可选的键“split”。与 argument 键关联的值必须是一个单独的字符串。与 split 键关联的值是一个布尔值。当 split 为 true 时,cephadm 将自动将值拆分为多个参数。当 split 为 false 时,值中的空格将保留在参数中。默认情况下,未提供 split 时,默认为 false。示例

service_type: mon
service_name: mon
placement:
  hosts:
    - tiebreaker
extra_container_args:
  # No spaces, always treated as a single argument
  - argument: "--timout=3000"
  # Splitting explicitly disabled, one single argument
  - argument: "--annotation=com.example.name=my favorite mon"
    split: false
  # Splitting explicitly enabled, will become two arguments
  - argument: "--cpuset-cpus 1-3,7-11"
    split: true
  # Splitting implicitly disabled, one single argument
  - argument: "--annotation=com.example.note=a simple example"

使用额外的容器参数挂载文件

额外的容器参数的一个常见用例是在容器内挂载额外的文件。较旧版本的 Ceph 不支持参数中的空格,因此下面的示例适用于最广泛的 Ceph 版本。

extra_container_args:
  - "-v"
  - "/absolute/file/path/on/host:/absolute/file/path/in/container"

例如

extra_container_args:
  - "-v"
  - "/opt/ceph_cert/host.cert:/etc/grafana/certs/cert_file:ro"

额外的入口点参数

注意

对于旨在用于容器运行时而不是其中进程的参数,请参阅 额外的容器参数

与用于容器运行时的额外容器参数类似,cephadm 支持将参数附加到在容器内运行的入口点进程。例如,要为 node-exporter 服务设置收集器文本文件目录,可以应用如下服务规范

service_type: node-exporter
service_name: node-exporter
placement:
  host_pattern: '*'
extra_entrypoint_args:
  - "--collector.textfile.directory=/var/lib/node_exporter/textfile_collector2"

有两种方法可以在 extra_entrypoint_args 列表中表示参数。首先,列表中的一项可以是字符串。当将参数作为字符串传递且字符串包含空格时,cephadm 将自动将其拆分为多个参数。例如,--debug_ms 10 在处理时将变为 ["--debug_ms", "10"]。示例

service_type: mon
service_name: mon
placement:
  hosts:
    - host1
    - host2
    - host3
extra_entrypoint_args:
  - "--debug_ms 2"

另一种方法是,列表中的一项可以是一个对象(映射),其中包含必需的键“argument”和可选的键“split”。与 argument 键关联的值必须是一个单独的字符串。与 split 键关联的值是一个布尔值。当 split 为 true 时,cephadm 将自动将值拆分为多个参数。当 split 为 false 时,值中的空格将保留在参数中。默认情况下,未提供 split 时,默认为 false。示例

# An theoretical data migration service
service_type: pretend
service_name: imagine1
placement:
  hosts:
    - host1
extra_entrypoint_args:
  # No spaces, always treated as a single argument
  - argument: "--timout=30m"
  # Splitting explicitly disabled, one single argument
  - argument: "--import=/mnt/usb/My Documents"
    split: false
  # Splitting explicitly enabled, will become two arguments
  - argument: "--tag documents"
    split: true
  # Splitting implicitly disabled, one single argument
  - argument: "--title=Imported Documents"

自定义配置文件

Cephadm 支持为守护程序指定杂项配置文件。为此,用户必须提供配置文件的内容以及在守护程序容器内的挂载位置。应用了包含指定自定义配置文件的 YAML 规范并让 cephadm 重新部署指定了配置文件的守护程序后,这些文件将挂载到守护程序容器内的指定位置。

服务规范示例

service_type: grafana
service_name: grafana
custom_configs:
  - mount_path: /etc/example.conf
    content: |
      setting1 = value1
      setting2 = value2
  - mount_path: /usr/share/grafana/example.cert
    content: |
      -----BEGIN PRIVATE KEY-----
      V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFt
      ZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15
      IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu
      YSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3Mg
      ZXQgYWNjdXNhbSBldCBqdXN0byBkdW8=
      -----END PRIVATE KEY-----
      -----BEGIN CERTIFICATE-----
      V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFt
      ZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15
      IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu
      YSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3Mg
      ZXQgYWNjdXNhbSBldCBqdXN0byBkdW8=
      -----END CERTIFICATE-----

要使这些新配置文件实际挂载到守护程序的容器中

ceph orch redeploy <service-name>

例如

ceph orch redeploy grafana

删除服务

要删除服务,包括删除该服务的所有守护程序,请运行

ceph orch rm <service-name>

例如

ceph orch rm rgw.myrgw

禁用守护程序的自动部署

Cephadm 支持禁用基于每个服务的守护程序自动部署和删除。CLI 支持两个用于此目的的命令。

要完全删除服务,请参阅 删除服务

禁用守护程序的自动管理

要禁用守护程序的自动管理,请在 服务规范 (mgr.yaml) 中设置 unmanaged=True

mgr.yaml:

service_type: mgr
unmanaged: true
placement:
  label: mgr
ceph orch apply -i mgr.yaml

Cephadm 还支持使用 ceph orch set-unmanagedceph orch set-managed 命令将 unmanaged 参数设置为 true 或 false。这些命令将服务名称(如 ceph orch ls 中报告的那样)作为唯一参数。例如,

ceph orch set-unmanaged mon

将 MON 服务设置为 unmanaged: true,并且

ceph orch set-managed mon

将 MON 服务设置为 unmanaged: false

注意

在服务规范中应用此更改后,cephadm 将不再部署任何新守护程序(即使放置规范匹配更多主机)。

注意

用于跟踪未绑定到任何特定服务规范的 OSD 的“osd”服务是特殊的,将始终被标记为非托管。尝试使用 ceph orch set-unmanagedceph orch set-managed 修改它将导致消息 No service of name osd found. Check "ceph orch ls" for all known services

手动在主机上部署守护程序

注意

此工作流程的用例非常有限,只能在极少数情况下使用。

要手动在主机上部署守护程序,请执行以下步骤

修改服务规范:获取现有规范,添加 unmanaged: true,然后应用修改后的规范。

然后使用以下命令手动部署守护程序

ceph orch daemon add <daemon-type> --placement=<placement spec>

例如

ceph orch daemon add mgr --placement=my_host

注意

从服务规范中删除 unmanaged: true 将启用此服务的协调循环,并可能导致守护程序被删除,具体取决于放置规范。

手动从主机中删除守护程序

要手动删除守护程序,请运行以下形式的命令

ceph orch daemon rm <daemon name>... [--force]

例如

ceph orch daemon rm mgr.my_host.xyzxyz

注意

对于托管服务(unmanaged=False),cephadm 将在几秒钟后自动部署一个新的守护程序。

另请参阅

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入