单节点集群(minikube)上的 rook ceph 中的 1 pg 规模过小运行状况警告

Xce*_*cer 3 ceph kubernetes minikube rook-storage kubernetes-rook

我正在将 rook-ceph 部署到 minikube 集群中。一切似乎都正常。我向虚拟机添加了 3 个未格式化的磁盘并已连接。我遇到的问题是,当我运行 ceph status 时,我收到一条健康温暖消息,告诉我“1 pg 尺寸不足”。我到底该如何解决这个问题?

文档(https://docs.ceph.com/docs/mimic/rados/troubleshooting/troubleshooting-pg/)指出“如果您尝试在单个节点上创建集群,则必须更改 osdrush 的默认值在创建监视器和 OSD 之前,在 Ceph 配置文件中将选择叶类型设置从 1(表示主机或节点)到 0(表示 osd)。 ” 我不知道在哪里进行此配置,但是否有其他方法可以解决此问题我应该知道的,请告诉我。谢谢!

zam*_*uts 8

我在使用 rook (v1.5.7) 和具有多个 OSD 的单个数据承载主机安装 ceph 时遇到了这个问题。

安装附带了默认CRUSH 规则 replicated_rule,该规则具有host默认故障域:

$ ceph osd crush rule dump replicated_rule    
{
    "rule_id": 0,
    "rule_name": "replicated_rule",
    "ruleset": 0,
    "type": 1,
    "min_size": 1,
    "max_size": 10,
    "steps": [
        {
            "op": "take",
            "item": -1,
            "item_name": "default"
        },
        {
            "op": "chooseleaf_firstn",
            "num": 0,
            "type": "host"
        },
        {
            "op": "emit"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我必须找出与 pg 1 相关的“尺寸过小”的池名称,幸运的是在默认的 rook-ceph 安装中,只有一个:

$ ceph osd pool ls
device_health_metrics

$ ceph pg ls-by-pool device_health_metrics
PG   OBJECTS  DEGRADED  ...  STATE
1.0        0         0  ...  active+undersized+remapped
Run Code Online (Sandbox Code Playgroud)

并确认 pg 使用默认规则:

$ ceph osd pool get device_health_metrics crush_rule
crush_rule: replicated_rule
Run Code Online (Sandbox Code Playgroud)

我没有修改默认的 CRUSH 规则,而是选择创建一个新的复制规则,但这次指定osd(又名device类型文档:CRUSH 映射类型和存储桶),还假设默认 CRUSH 根为default

# osd crush rule create-replicated <name> <root> <type> [<class>]
$ ceph osd crush rule create-replicated replicated_rule_osd default osd

$ ceph osd crush rule dump replicated_rule_osd
{
    "rule_id": 1,
    "rule_name": "replicated_rule_osd",
    "ruleset": 1,
    "type": 1,
    "min_size": 1,
    "max_size": 10,
    "steps": [
        {
            "op": "take",
            "item": -1,
            "item_name": "default"
        },
        {
            "op": "choose_firstn",
            "num": 0,
            "type": "osd"
        },
        {
            "op": "emit"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后将新规则分配给现有池:

$ ceph osd pool set device_health_metrics crush_rule replicated_rule_osd
set pool 1 crush_rule to replicated_rule_osd

$ ceph osd pool get device_health_metrics crush_rule
crush_rule: replicated_rule_osd
Run Code Online (Sandbox Code Playgroud)

最后确认pg状态:

$ ceph pg ls-by-pool device_health_metrics
PG   OBJECTS  DEGRADED  ...  STATE
1.0        0         0  ...  active+clean
Run Code Online (Sandbox Code Playgroud)


小智 5

正如您在问题中提到的,您应该将您的rush failure-domain-type更改为OSD,这意味着它将在OSD而不是主机之间复制您的数据。默认情况下,它是主机,当您只有一台主机时,它没有任何其他主机来复制您的数据,因此您的 pg 将始终尺寸不足。

您应该在创建监视器和 OSD 之前进行osd crush chooseleaf type = 0设置。ceph.conf

这将在 OSD 之间而不是主机之间复制您的数据。