TECHSTEP

ITインフラ関連の記事を公開してます。

Rook v1.2での変更点まとめ

はじめに

2019年12月にRook v1.2が公開されました。すでに1か月以上経っていますが、Rook v1.2からの変更点について、Release Noteを元にまとめておきます。なお、CephについてはGithub上の流れが追いやすくIssue/mergeのリンクまで載せられていますが、EdgeFSについては開発の流れがなかなか見えず、記載も少なくなっております。

Rook v1.2の変更点

Ceph

・Ceph versionを探索するjobが走るとき、node affinity/tolerationの設定を利用できる

CephClusterをデプロイすると、ceph versionを探索するjobが以下のように起動します。この時に起動するNodeをnodeAffinity/tolerationで指定できるようになります。

[root@vm0 ~]# kubectl get pods -n rook-ceph -w

[中略]

rook-ceph-detect-version-wmxpr                  0/1     Pending             0          0s
rook-ceph-detect-version-wmxpr                  0/1     Pending             0          0s
rook-ceph-detect-version-wmxpr                  0/1     Init:0/1            0          1s
rook-ceph-detect-version-wmxpr                  0/1     PodInitializing     0          5s
rook-ceph-detect-version-wmxpr                  0/1     Completed           0          6s
rook-ceph-detect-version-wmxpr                  0/1     Terminating         0          6s
rook-ceph-detect-version-wmxpr                  0/1     Terminating         0          6s

設定はCluster CRのMON用の設定と同じです。CephClusterをデプロイする時に利用するcluster.yamlSpec.placement設定を書き換えることで利用可能です。

※参考リンク:

Rook Doc - Ceph Cluster CRD #Placement Configuration Settings

skipUpgradeChecksの追加

Cephのアップグレードを実行する際、Daemonによるステータスのチェックをスキップすることができます。 この機能は利用者の責任となり、公式では非推奨の機能です。

cluster.yamlSpec.skipUpgradeCheckstrueにすることで利用可能です。

・MON Quorum DR guideのアップデート

Rook-Cephでは何らかの理由でMONがQuorumを失った場合、手作業での復旧が可能です。こちらのドキュメントでその手順を公開しています。

PreservePoolsOnDeleteの追加

CephObjectStore CephFilesystemで利用可能で、紐づいたメインリソース(filesystem, object store)が削除されてもstorage poolが削除されません。 この機能によりデータ損失への対策が強化されました。

再びメインリソースがデプロイされた場合、削除前に紐づいていたたstorage poolとメインリソースが紐づきます。

テスト用yamlファイル(filesystem.yaml object.yaml)ではtrueにセットされています。

※参考リンク

Rook Doc - Ceph Shared Filesystem CRD #Filesystem Settings

Rook Doc - Ceph Object Store CRD #Object Store Settings

・Ceph Crashcollectorがcrash telemetryを回収、Ceph Dashboardに送信する機能を追加

Ceph CrashcollectorはCeph podが走る場所で同時に起動し、Ceph daemon core dumpを回収しmgrに送付します。v1.2からは新たにcrash telemetryを収集し、Ceph Dashboardに送信します。

telemetryはクラスターに関するデータを開発者に送信し、利用のされ方や将来的に問題となりうる事項を伝えます。telemetryは3つのチャンネルを含み、crash telemetryはその一つです。crash telemetryはデーモンのクラッシュに関する情報(デーモンのタイプやバージョン、クラッシュした箇所の特定につながるスタックトレース)を提供します。

toolbox Podでceph telemetryコマンドを実行することで情報を取得することもできます。

toolbox Podからtelemetry情報を表示

# telemetry情報の表示コマンド
[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-rm54b -n rook-ceph -- ceph telemetry show
Error ENOTSUP: Module 'telemetry' is not enabled (required by command 'telemetry show'): use `ceph mgr module enable telemetry` to enable it
command terminated with exit code 95

# telemetry moduleを有効にするためのコマンドを実行
[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-rm54b -n rook-ceph -- ceph mgr module enable telemetry

# telemetry情報の表示コマンド
[root@vm0 ceph]# kubectl exec -it rook-ceph-tools-7f96779fb9-rm54b -n rook-ceph -- ceph telemetry show
{
    "crush": {
        "tunables": {
            "profile": "jewel",
            "minimum_required_version": "jewel",
            "has_v3_rules": 0,
            "has_v4_buckets": 1,
            "choose_total_tries": 50,
            "require_feature_tunables3": 1,
            "require_feature_tunables5": 1,
            "legacy_tunables": 0,
            "chooseleaf_descend_once": 1,
            "chooseleaf_stable": 1,
            "choose_local_fallback_tries": 0,
            "has_v2_rules": 0,
            "straw_calc_version": 1,
            "allowed_bucket_algs": 54,
            "has_v5_rules": 0,
            "require_feature_tunables2": 1,
            "optimal_tunables": 1,
            "choose_local_tries": 0,
            "chooseleaf_vary_r": 1,
            "require_feature_tunables": 1
        },
        "bucket_types": {
            "1": 3,
            "11": 1
        },
        "num_rules": 3,
        "compat_weight_set": false,
        "num_weight_sets": 0,
        "bucket_sizes": {
            "1": 3,
            "3": 1
        },
        "num_types": 12,
        "device_classes": [
            3
        ],
        "num_devices": 3,
        "bucket_algs": {
            "straw2": 4
        },
        "num_buckets": 8
    },
    "balancer": {
        "active": false,
        "mode": ""
    },
    "fs": {
        "count": 0,
        "total_num_mds": 0,
        "feature_flags": {
            "ever_enabled_multiple": false,
            "enable_multiple": false
        },
        "num_standby_mds": 0,
        "filesystems": []
    },
    "crashes": [],
    "license": "sharing-1-0",
    "created": "2020-01-14T05:16:59.084291",
    "metadata": {
        "osd": {
            "distro_description": {
                "CentOS Linux 7 (Core)": 3
            },
            "rotational": {
                "1": 3
            },
            "kernel_version": {
                "3.10.0-1062.9.1.el7.x86_64": 3
            },
            "arch": {
                "x86_64": 3
            },
            "cpu": {
                "Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz": 3
            },
            "osd_objectstore": {
                "filestore": 3
            },
            "kernel_description": {
                "#1 SMP Fri Dec 6 15:49:49 UTC 2019": 3
            },
            "os": {
                "Linux": 3
            },
            "ceph_version": {
                "ceph version 14.2.5 (ad5bd132e1492173c85fda2cc863152730b16a92) nautilus (stable)": 3
            },
            "distro": {
                "centos": 3
            }
        },
        "mon": {
            "distro_description": {
                "CentOS Linux 7 (Core)": 1
            },
            "kernel_version": {
                "3.10.0-1062.9.1.el7.x86_64": 1
            },
            "arch": {
                "x86_64": 1
            },
            "cpu": {
                "Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz": 1
            },
            "kernel_description": {
                "#1 SMP Fri Dec 6 15:49:49 UTC 2019": 1
            },
            "os": {
                "Linux": 1
            },
            "ceph_version": {
                "ceph version 14.2.5 (ad5bd132e1492173c85fda2cc863152730b16a92) nautilus (stable)": 1
            },
            "distro": {
                "centos": 1
            }
        }
    },
    "mon": {
        "count": 1,
        "v2_addr_mons": 1,
        "features": {
            "optional": [],
            "persistent": [
                "kraken",
                "luminous",
                "mimic",
                "osdmap-prune",
                "nautilus"
            ]
        },
        "ipv4_addr_mons": 2,
        "ipv6_addr_mons": 0,
        "v1_addr_mons": 1,
        "min_mon_release": 14
    },
    "report_timestamp": "2020-01-16T02:17:16.122911",
    "channels": [
        "basic",
        "crash",
        "device"
    ],
    "usage": {
        "pools": 2,
        "total_used_bytes": 19868684288,
        "pg_num:": 16,
        "total_bytes": 316661342208,
        "total_avail_bytes": 296792657920
    },
    "hosts": {
        "num_with_osd": 3,
        "num_with_mds": 0,
        "num_with_mgr": 1,
        "num": 3,
        "num_with_mon": 1
    },
    "report_version": 1,
    "pools": [
        {
            "min_size": 2,
            "erasure_code_profile": {},
            "pg_autoscale_mode": "on",
            "pool": 2,
            "size": 3,
            "cache_mode": "none",
            "target_max_objects": 0,
            "pg_num": 8,
            "pgp_num": 8,
            "target_max_bytes": 0,
            "type": "replicated"
        },
        {
            "min_size": 2,
            "erasure_code_profile": {},
            "pg_autoscale_mode": "on",
            "pool": 3,
            "size": 3,
            "cache_mode": "none",
            "target_max_objects": 0,
            "pg_num": 8,
            "pgp_num": 8,
            "target_max_bytes": 0,
            "type": "replicated"
        }
    ],
    "services": {},
    "channels_available": [
        "basic",
        "ident",
        "crash",
        "device"
    ],
    "rbd": {
        "num_pools": 0,
        "num_images_by_pool": [],
        "mirroring_by_pool": []
    },
    "config": {
        "cluster_changed": [
            "mgr/dashboard/server_port",
            "mgr/dashboard/ssl",
            "mgr/dashboard/ssl_server_port",
            "mgr/orchestrator_cli/orchestrator",
            "mon_allow_pool_delete",
            "mon_pg_warn_min_per_osd",
            "osd_pool_default_pg_autoscale_mode",
            "rbd_default_features"
        ],
        "active_changed": [
            "client_mount_gid",
            "client_mount_uid",
            "crush_location",
            "daemonize",
            "err_to_stderr",
            "keyring",
            "leveldb_block_size",
            "leveldb_cache_size",
            "leveldb_compression",
            "leveldb_log",
            "leveldb_write_buffer_size",
            "log_stderr_prefix",
            "log_to_file",
            "log_to_stderr",
            "mon_allow_pool_delete",
            "mon_cluster_log_to_file",
            "mon_cluster_log_to_stderr",
            "mon_host",
            "mon_initial_members",
            "mon_pg_warn_min_per_osd",
            "ms_learn_addr_from_peer",
            "osd_data",
            "osd_journal",
            "osd_max_object_name_len",
            "osd_max_object_namespace_len",
            "osd_memory_target",
            "osd_objectstore",
            "osd_pool_default_pg_autoscale_mode",
            "osd_uuid",
            "public_addr",
            "public_bind_addr",
            "rbd_default_features",
            "setgroup",
            "setuser",
            "setuser_match_path"
        ]
    },
    "osd": {
        "count": 3,
        "require_min_compat_client": "jewel",
        "cluster_network": false,
        "require_osd_release": "nautilus"
    },
    "leaderboard": false,
    "report_id": "f53e9921-eab2-4e12-ad8a-96b43a35947a"
}
[root@vm0 ceph]#

※参考リンク:

Ceph Doc - telemetry Modules

PriorityClassNamesをRook/Cephコンポーネントに追加できる

Kubernetesの機能であるPriorityClassをRook/Cephのコンポーネントに実装できるようになりました。PriorityClassは特定の重要なPodに優先度をつけるために利用するリソースで、Kubernetesクラスター上のリソースに空きがなく既存のPodを削除しなければならないとき、重要なPodが削除されないようにする仕組みです。

※参考リンク:

Kubernetes Doc - Pod Priority and Preemption # PriorityClass

Rook Doc - Ceph Cluster CRD # Priority Class Names Configuration Settings

・Ceph Client CRDの追加

Ceph Clientの設定をCRDを通じて設定できます。利用ケースとしては、libRBDを利用するアプリケーションとRookとを統合する場合(OpenStackのバックエンドにCephを利用する場合など)となります。

なお、CSI及びFlexDriverを利用する場合は自動的にClient CRDが作成されるため、別途作成する必要はありません。

※参考リンク

Rook Doc - Ceph Client CRD

Status.phasesの追加

Rook-Ceph CRDにStatus.phasesプロパティが追加され、Processing Ready Failedのいずれかの状態を表示します。OperatorがCeph CRDに関する何らかのタスクを実行中の場合Processing、処理に失敗した場合Failed、そしてすべてのタスクを完了した場合Readyが表示されます。

ROOK_UNREACHABLE_TOLERATION_SECONDSの追加

operator.yamlで指定可能なプロパティであるROOK_UNREACHABLE_TOLERATION_SECONDSが追加され、Rookに関連するPod(OSD、MON、MGRなど)を置くノードからの応答が指定時間以内にない場合、別のノードにデプロイする処理が走ります。デフォルトでは5秒にセットされています。

OSDs

・OperatorをアップデートしてもOSD Podが再起動しない

ver 1.2以降は、operatorが新しいバージョンにアップデートしても、OSD Podが再起動しないようになりました。ただしOSDs on PVCは例外のようです。

devicePathFilterの追加

新たなCRDプロパティであるdevicePathFilterが追加され、OSDに利用するdeviceを明示的に指定することができるようになりました。こちらの記事に機能追加までの経緯など詳しく書かれています。

※参考リンク:

Rook Doc - Ceph Cluster CRD #Storage Selection Settings

Cybozu Inside Out - ストレージオーケストレーターRookへのサイボウズのコミット方針

Github - ceph: support device selection for OSDs by device path name patterns #4285

OSDのadmin socketは/run/ceph配下に移動

OSDのon-host logの場所は<datadirhostpath>/log/<namespace>に変更

OSD on PVC向けの、LVMバックのPVをサポート

Rook ver1.1からの新機能であるOSD on PVC機能が、LVMのLogical Volumeに対応しました。この機能もこちらの記事に詳しく書かれています。

※参考リンク:

Cybozu Inside Out - ストレージオーケストレーターRookへのサイボウズのコミット方針

Github - ceph: support OSD on PVC backed by LV #4219

tuneSlowDeviceClassの追加

OSDgp2などのストレージデバイスで利用する場合、想定よりパフォーマンスが出ない場合があります。これを防ぐため、tuneSlowDeviceClassという設定項目を追加し、trueに設定されている場合はOSDのチューニングを行ってパフォーマンスを向上します。

※参考リンク:

Rook Doc - Ceph Cluster CRD # Storage Class Device Sets

Github - Ability to set device class on OSDs when on PVCs #4298

Github - ceph: add CR flag to tune slow device class for OSD on PVC in the Cloud #4308

EdgeFS

・シングルノード、シングルデバイスのサポート

Rook EdgeFSはデフォルトで3つのノードが必要でしたが、sysRepCountを設定することでその設定を上書きすることができます。sysRepCountを1に設定するとシングルノードで利用することができます。

またfailureDomainを設定することでデータ複製の方法を指定します。failureDomaindeviceにした場合、各ノードに接続されたデバイスごとにレプリケーションを作成しますが、hostに設定するとノードごとに一つレプリケーションを作成します。

※参考リンク:

Rook Doc - EdgeFS Cluster CRD # Cluster Settings

・rtkvs disk engineとSamsung KV SSDのサポート

※参考リンク:

Rook Doc - EdgeFS Cluster CRD # Storage Configuration Settings

Github - Support for Samsung KVSSD and other generic Key-Value backends #3997

Github - EdgeFS: support for rtkvs disk engine and Samsung KVSSD #3995

・Data Payload ChunkのS3への直接保存

AWSへのサポートを強化し、data payload chunkを直接S3に保存できるようになりました。これによりストレージ課金の大幅な削減を見込めます。payloadS3URLという設定項目にS3バケットのURLを指定すると利用可能です。

※参考リンク:

Rook Doc - EdgeFS Cluster CRD # Storage Configuration Settings

Github - EdgeFS: data payload forwarding to an external S3 service #4431

Github - EdgeFS: support for payload on external S3 server #4432

・ISGWの複数サービスなしで、ISGWフルメッシュ機能を設定できる

※参考リンク:

Rook Doc - EdgeFS ISGW (Inter-Segment GateWay) CRD

・S3バケットのinstant snapshotの作成

新しいEdgeFSのバージョンでは、S3バケットのinstant snapshotの作成が可能になります。作成されたsnapshotのメタデータは、接続されたすべてのEdgeFSセグメントに配布されるので、snapshot対象のデータを複製・アクセスする際に、すべてのデータを転送する必要がなくなります。

その他

・RookのサポートするKubenetesの最小バージョンが1.12に変更

hostNetworkが有効の場合、Ceph Object Gatewayが同じホスト上で起動しないよう自動的に設定される

・Rook/EdgeFS OperatorでDISCOVER_DAEMON_UDEV_BLACKLISTを利用可能

Ceph/EdgeFSのStorage Providerは、デバイスを探索するためにDiscover daemonを起動します。operator.yamlにあるDISCOVER_DAEMON_UDEV_BLACKLISTを設定すると、指定した文字列に該当するudevをDiscover daemonの探索対象から除くことができます。

指定しない場合はデフォルトの値((?i)dm-[0-9]+,(?i)rbd[0-9]+,(?i)nbd[0-9]+)が設定されます。

※参考リンク:

Github - ceph: make the discover daemon filter configurable #4211

topologyの廃止

CephClusterCRからtopology設定が廃止されます。OSD topologyを設定するにはnode labelが必要となります。

※参考リンク:

Rook Doc - Ceph Cluster CRD # OSD Topology

・ディスク上のstoreType: Filestore OSDがdeprecated

Ceph Cluster CRDで設定するstoreTypeは、OSDに利用するストレージデバイスのタイプを指定することができます。この設定が反映されなくなり、ディレクトリ上のOSDstoreType: Filestore、ディスク上のOSDstoreType: Bluestoreに自動的に設定されます。

すでにディスク上にデプロイされているstoreType: Filestore OSDはそのまま維持されます。

※参考リンク:

Rook Doc - Ceph Cluster CRD # OSD Configuration Settings

参照ドキュメント

GitHub - Release Note

Rook blog - Rook v1.2: More Storage Operator Enhancements!