Rook定制化和管理Ceph集群


一、Ceph OSD配置

默認通過 cluster.yaml 創建Ceph集群時,使用的是filestore,並且使用的是 /var/lib/rook/osd-<id> 目錄,這明顯不是我們通常的使用方式,下面介紹如何配置Ceph OSD使用bluestore和具體磁盤。

1、使用所有可用磁盤

如下,若我們配置具體節點上Ceph OSD使用所有可以使用的Devices,並且指定都使用bluestore的方式,則可以類似如下配置:

...
---
apiVersion: ceph.rook.io/v1beta1
kind: Cluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: ceph/ceph:v13
    allowUnsupported: false
  dataDirHostPath: /var/lib/rook
  serviceAccount: rook-ceph-cluster
  mon:
    count: 3
    allowMultiplePerNode: true
  dashboard:
    enabled: true
  network:
    hostNetwork: false
  storage: # cluster level storage configuration and selection
    useAllNodes: false
    useAllDevices: true
    deviceFilter:
    location:
    config:
      storeType: bluestore
    nodes:
    - name: "ke-dev1-worker1"
    - name: "ke-dev1-worker3"
    - name: "ke-dev1-worker4"

2、使用指定磁盤

若指定具體節點使用的磁盤,storage的部分配置如下:

storage:
  useAllNodes: false
  useAllDevices: false
  deviceFilter:
  location:
  config:
    storeType: bluestore
  nodes:
  - name: "ke-dev1-worker1"
    devices:
    - name: "vde"
  - name: "ke-dev1-worker3"
    devices:
    - name: "vde"
  - name: "ke-dev1-worker4"
    devices:
    - name: "vdf"

指定磁盤必須有GPT header!

不支持指定分區!(查看log,配置分區的信息並沒有傳遞到ceph-osd-prepare這一步)

二、Ceph集群修改

在部署完Ceph集群后,若想修改Ceph集群的部署配置,比如增加/刪除OSDs等,可以通過下面命令執行:

# kubectl -n rook-ceph edit cluster rook-ceph
...
spec:
  cephVersion:
    image: ceph/ceph:v13
  dashboard:
    enabled: true
  dataDirHostPath: /var/lib/rook
  mon:
    allowMultiplePerNode: true
    count: 3
  network:
    hostNetwork: false
  serviceAccount: rook-ceph-cluster
  storage:
    config:
      storeType: bluestore
    nodes:
    - config: null
      devices:
      - FullPath: ""
        config: null
        name: vde
      name: ke-dev1-worker1
      resources: {}
    - config: null
      devices:
      - FullPath: ""
        config: null
        name: vde
      name: ke-dev1-worker3
      resources: {}
    - config: null
      devices:
      - FullPath: ""
        config: null
        name: vdf
      name: ke-dev1-worker4
      resources: {}
    useAllDevices: false
...

根據需要修改后,直接保存退出即可;

遇到的問題

部署中出現問題后,可以通過下面方法查看log,分析原因:

rook-ceph-operator
kubectl describe <pod>

ceph-mon狀態一直不為running

遇到兩種情況下會出現ceph-mon一直能為running的狀態:

/var/lib/rook/

配置osd指定磁盤無效

若 cluster.yaml 的storage做如下配置時,並不能找到按照配置的設備來部署OSD:

storage:
  useAllNodes: false
  useAllDevices: false
  deviceFilter:
  location:
  config:
    storeType: bluestore
  nodes:
  - name: "ke-dev1-worker1"
    devices:
    - name: "vde"
  - name: "ke-dev1-worker3"
    devices:
    - name: "vde"
  - name: "ke-dev1-worker4"
    devices:
    - name: "vdf"

查看 rook-ceph-operator pod的log,發現是識別了配置的 vde/vdf 信息:

# kubectl -n rook-ceph-systemm log rook-ceph-operator-5dc97f5c79-vq7xs
...
2018-11-29 03:28:30.239119 I | exec: nodeep-scrub is set
2018-11-29 03:28:30.252166 I | op-osd: 3 of the 3 storage nodes are valid
2018-11-29 03:28:30.252192 I | op-osd: checking if orchestration is still in progress
2018-11-29 03:28:30.259012 I | op-osd: start provisioning the osds on nodes, if needed
2018-11-29 03:28:30.338514 I | op-osd: avail devices for node ke-dev1-worker1: [{Name:vde FullPath: Config:map[]}]
2018-11-29 03:28:30.354912 I | op-osd: osd provision job started for node ke-dev1-worker1
2018-11-29 03:28:31.050925 I | op-osd: avail devices for node ke-dev1-worker3: [{Name:vde FullPath: Config:map[]}]
2018-11-29 03:28:31.071399 I | op-osd: osd provision job started for node ke-dev1-worker3
2018-11-29 03:28:32.253394 I | op-osd: avail devices for node ke-dev1-worker4: [{Name:vdf FullPath: Config:map[]}]
2018-11-29 03:28:32.269271 I | op-osd: osd provision job started for node ke-dev1-worker4
...

查看 ceph-osd-prepare job的log:

# kubectl -n rook-ceph get pods -a -o wide
NAME                                          READY     STATUS      RESTARTS   AGE       IP                NODE
rook-ceph-mgr-a-959d64b9d-hfntv               1/1       Running     0          9m        192.168.32.184    ke-dev1-worker1
rook-ceph-mon-a-b79d8687d-qwcnp               1/1       Running     0          10m       192.168.53.210    ke-dev1-master3
rook-ceph-mon-b-66b895d57d-prfdp              1/1       Running     0          9m        192.168.32.150    ke-dev1-worker1
rook-ceph-mon-c-8489c4bc8b-jwm8v              1/1       Running     0          9m        192.168.2.76      ke-dev1-worker3
rook-ceph-osd-prepare-ke-dev1-worker1-bbm9t   0/2       Completed   0          8m        192.168.32.170    ke-dev1-worker1
rook-ceph-osd-prepare-ke-dev1-worker3-xg2pc   0/2       Completed   0          8m        192.168.2.122     ke-dev1-worker3
rook-ceph-osd-prepare-ke-dev1-worker4-mjlg7   0/2       Completed   0          8m        192.168.217.153   ke-dev1-worker4

# kubectl -n rook-ceph log rook-ceph-osd-prepare-ke-dev1-worker1-bbm9t provision
...
2018-11-29 03:28:36.533532 I | exec: Running command: lsblk /dev/vde --bytes --nodeps --pairs --output SIZE,ROTA,RO,TYPE,PKNAME
2018-11-29 03:28:36.537270 I | exec: Running command: sgdisk --print /dev/vde
2018-11-29 03:28:36.547839 W | inventory: skipping device vde with an unknown uuid. Failed to complete 'get disk vde uuid': exit status 2. ^GCaution: invalid main GPT header, but valid backup; regenerating main header
from backup!

Invalid partition data!

從log里找到了設備vde沒有被識別的原因: invalid main GPT header 。

這個盤是新添加的,並沒有創建GPT分區信息,手動給各個盤創建GPT header后,部署OSD正常!

三、擴展功能

記錄下使用Rook部署Ceph系統的擴展功能需求。

1、如何配置分區?

Rook現在不支持配置OSD的devices為分區,代碼中檢測配置磁盤分區這塊有待改善!

Operator discover檢查

File: pkg/operator/ceph/cluster/osd/osd.go

func (c *Cluster) startProvisioning(config *provisionConfig) {
    config.devicesToUse = make(map[string][]rookalpha.Device, len(c.Storage.Nodes))

    // start with nodes currently in the storage spec
    for _, node := range c.Storage.Nodes {
        ...
        availDev, deviceErr := discover.GetAvailableDevices(c.context, n.Name, c.Namespace, n.Devices, n.Selection.DeviceFilter, n.Selection.GetUseAllDevices())
        ...
    }
    ...
}
File: pkg/operator/discover/discover.go

// GetAvailableDevices conducts outer join using input filters with free devices that a node has. It marks the devices from join result as in-use.
func GetAvailableDevices(context *clusterd.Context, nodeName, clusterName string, devices []rookalpha.Device, filter string, useAllDevices bool) ([]rookalpha.Device, error) {
    ...
    // find those on the node
    nodeAllDevices, ok := allDevices[nodeName]
    if !ok {
        return results, fmt.Errorf("node %s has no devices", nodeName)
    }
    // find those in use on the node
    devicesInUse, err := ListDevicesInUse(context, namespace, nodeName)
    if err != nil {
        return results, err
    }
    
    nodeDevices := []sys.LocalDisk{}
    for _, nodeDevice := range nodeAllDevices {
        // TODO: Filter out devices that are in use by another cluster.
        // We need to retain the devices in use for this cluster so the provisioner will continue to configure the same OSDs.
        for _, device := range devicesInUse {
            if nodeDevice.Name == device.Name {
                break
            }
        }
        nodeDevices = append(nodeDevices, nodeDevice)
    }
    claimedDevices := []sys.LocalDisk{}
    // now those left are free to use
    if len(devices) > 0 {
        for i := range devices {
            for j := range nodeDevices {
                // 指定devices為分區時
                // devices[i].Name 為 sdk1,而nodeDevices[j].Name 為 sdk
                // 所以最后返回到上層的可用Devices為空!!
                if devices[i].Name == nodeDevices[j].Name {
                    results = append(results, devices[i])
                    claimedDevices = append(claimedDevices, nodeDevices[j])
                }
            }
        }
    } else if len(filter) >= 0 {
        ...
    } else if useAllDevices {
        ...
    }
    ...
}

ListDevices函數返回的disk格式如下:

{Name:sdk ... Partitions:[{Name:sdk1 Size:4000785964544 Label: Filesystem:}] ...}

// ListDevices lists all devices discovered on all nodes or specific node if node name is provided.
func ListDevices(context *clusterd.Context, namespace, nodeName string) (map[string][]sys.LocalDisk, error) {
...
}

OSD Daemon檢查

當磁盤通過了Ceph Operator Discover的相關檢查后,會通過參數傳遞給OSD Prepare Job,如下所示:

File:rook-ceph-osd-prepare-ceph0-bphlv-ceph0.log

2018-12-04 10:18:51.959163 I | rookcmd: starting Rook v0.8.0-320.g3135b1d with arguments '/rook/rook ceph osd provision'
2018-12-04 10:18:51.993500 I | rookcmd: flag values: --cluster-id=c6434de9-f7ad-11e8-bec3-6c92bf2db856, --data-device-filter=, --data-devices=sdk,sdl, --data-directories=, --force-format=false, --help=false, --location=, --log-level=INFO, --metadata-device=, --node-name=ceph0, --osd-database-size=20480, --osd-journal-size=5120, --osd-store=bluestore, --osd-wal-size=576
...

上述指定了 --data-devices=sdk,sdl 。

File: pkg/daemon/ceph/osd/daemon.go

func getAvailableDevices(context *clusterd.Context, desiredDevices string, metadataDevice string, usingDeviceFilter bool) (*DeviceOsdMapping, error) {
    ...
    for _, device := range context.Devices {
        ownPartitions, fs, err := sys.CheckIfDeviceAvailable(context.Executor, device.Name)
        if err != nil {
            return nil, fmt.Errorf("failed to get device %s info. %+v", device.Name, err)
        }

        // 從這里看出需要配置的磁盤上fs信息為空,並且沒有分區信息!
        if fs != "" || !ownPartitions {
            // not OK to use the device because it has a filesystem or rook doesn't own all its partitions
            logger.Infof("skipping device %s that is in use (not by rook). fs: %s, ownPartitions: %t", device.Name, fs, ownPartitions)
            continue
        }
        ...
    }
    ...
}

所以現在通過任何方式無法配置Ceph OSD指定磁盤分區!

2、如何配置HDD+SSD的BlueStore?

配置節點OSD使用HDD+SSD的方式,可以修改cluster.yaml如下:

storage:
  useAllNodes: false
  useAllDevices: false
  location:
  config:
    storeType: bluestore
  nodes:
  ...
  - name: "ke-dev1-worker4"
    devices:
    - name: "vdf"
    - name: "vdg"
    config:
      metadataDevice: "vdh"

部署中可以通過獲取ceph-osd-prepare的log來查看是否配置正確:

# kubectl -n rook-ceph log rook-ceph-osd-prepare-ke-dev1-worker4-456nj provision
2018-11-30 03:30:37.118716 I | rookcmd: starting Rook v0.8.0-304.g0a8e109 with arguments '/rook/rook ceph osd provision'
2018-11-30 03:30:37.124652 I | rookcmd: flag values: --cluster-id=072418f4-f450-11e8-bb3e-fa163e65e579, --data-device-filter=, --data-devices=vdf,vdg, --data-directories=, --force-format=false, --help=false, --location=, --log-level=INFO, --metadata-device=vdh, --node-name=ke-dev1-worker4, --osd-database-size=20480, --osd-journal-size=5120, --osd-store=bluestore, --osd-wal-size=576
...

如上述log,傳進來的正確參數應該為:

  • –data-devices=vdf,vdg
  • –metadata-device=vdh

若要指定SSD提供的wal/db分區的大小,可以加如下配置:

...
- name: "ke-dev1-worker4"
  devices:
  - name: "vdf"
  - name: "vdg"
  config:
    metadataDevice: "vdh"
    databaseSizeMB: "10240"
    WalSizeMB: "10240"

3、如何自定義ceph.conf?

默認創建Ceph集群的配置參數在Rook代碼里是固定的,在創建 Cluster 的時候生成Ceph集群的配置參數,參考上面章節的:

如果用戶想自定義Ceph集群的配置參數,可以通過修改 rook-config-override 的方法。

如下是默認的 rook-config-override :

# kubectl -n rook-ceph get configmap rook-config-override -o yaml
apiVersion: v1
data:
  config: ""
kind: ConfigMap
metadata:
  creationTimestamp: 2018-12-03T05:34:58Z
  name: rook-config-override
  namespace: rook-ceph
  ownerReferences:
  - apiVersion: v1beta1
    blockOwnerDeletion: true
    kind: Cluster
    name: rook-ceph
    uid: 229e7106-f6bd-11e8-bec3-6c92bf2db856
  resourceVersion: "40803738"
  selfLink: /api/v1/namespaces/rook-ceph/configmaps/rook-config-override
  uid: 2c489850-f6bd-11e8-bec3-6c92bf2db856

修改已有Ceph集群配置參數

1、修改 rook-config-override :

# kubectl -n rook-ceph edit configmap rook-config-override -o yaml
apiVersion: v1
data:
  config: |
    [global]
    osd crush update on start = false
    osd pool default size = 2
    [osd]
    bluefs_buffered_io = false
    bluestore_csum_type = none
kind: ConfigMap
metadata:
  creationTimestamp: 2018-12-03T05:34:58Z
  name: rook-config-override
  namespace: rook-ceph
  ownerReferences:
  - apiVersion: v1beta1
    blockOwnerDeletion: true
    kind: Cluster
    name: rook-ceph
    uid: 229e7106-f6bd-11e8-bec3-6c92bf2db856
  resourceVersion: "40803738"
  selfLink: /api/v1/namespaces/rook-ceph/configmaps/rook-config-override
  uid: 2c489850-f6bd-11e8-bec3-6c92bf2db856

2、依次重啟ceph組件

# kubectl -n rook-ceph get pods
NAME                               READY     STATUS    RESTARTS   AGE
rook-ceph-mgr-a-5699bb7984-kpxgp   1/1       Running   0          2h
rook-ceph-mon-a-66854cfb5-m5d9x    1/1       Running   0          15m
rook-ceph-mon-b-c6f58986f-xpnc4    1/1       Running   0          2h
rook-ceph-mon-c-97669b7ff-kgdbp    1/1       Running   0          2h
rook-ceph-osd-0-54bdd844b-wfqk6    1/1       Running   0          2h
rook-ceph-osd-1-789cdb4c5b-rddhh   1/1       Running   0          2h
rook-ceph-osd-2-57c8644749-djs98   1/1       Running   0          2h
rook-ceph-osd-3-7566d48f85-k5mw6   1/1       Running   0          2h

# kubectl -n rook-ceph delete pod rook-ceph-mgr-a-5699bb7984-kpxgp

# kubectl -n rook-ceph delete pod rook-ceph-mon-a-66854cfb5-m5d9x
...

# kubectl -n rook-ceph delete pod rook-ceph-osd-0-54bdd844b-wfqk6

ceph-mon, ceph-osd的delete最后是one-by-one的,等待ceph集群狀態為HEALTH_OK后再delete另一個

3、檢查ceph組件的配置

# cat /var/lib/rook/osd2/rook-ceph.config
[global]
run dir                   = /var/lib/rook/osd2
mon initial members       = a b c
mon host                  = 10.96.195.188:6790,10.96.128.73:6790,10.96.51.21:6790
log file                  = /dev/stderr
mon cluster log file      = /dev/stderr
public addr               = 192.168.150.252
cluster addr              = 192.168.150.252
mon keyvaluedb            = rocksdb
mon_allow_pool_delete     = true
mon_max_pg_per_osd        = 1000
debug default             = 0
debug rados               = 0
debug mon                 = 0
debug osd                 = 0
debug bluestore           = 0
debug filestore           = 0
debug journal             = 0
debug leveldb             = 0
filestore_omap_backend    = rocksdb
osd pg bits               = 11
osd pgp bits              = 11
osd pool default size     = 2
osd pool default min size = 1
osd pool default pg num   = 100
osd pool default pgp num  = 100
osd objectstore           = bluestore
crush location            = root=default host=ceph5
rbd_default_features      = 3
fatal signal handlers     = false
osd crush update on start = false

[osd.2]
keyring                  = /var/lib/rook/osd2/keyring
bluestore block path     = /dev/disk/by-partuuid/bad8c220-d4f7-40de-b7ff-fcc2e492ea64
bluestore block wal path = /dev/disk/by-partuuid/5315d8be-f80b-4351-95b5-026889d1dd19
bluestore block db path  = /dev/disk/by-partuuid/6d3d494f-0021-4e95-b45f-59a326976cf8

[osd]
bluefs_buffered_io  = false
bluestore_csum_type = none

創建Ceph集群前指定配置參數

若用戶想在創建Ceph集群前指定配置參數,可以通過先手動創建名為: rook-config-override 的 ConfigMap ,然后再創建Ceph集群。

1、創建ConfigMap后創建

# cat ceph-override-conf.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: rook-config-override
  namespace: rook-ceph
data:
  config: |
    [global]
    osd crush update on start = false
    osd pool default size = 2
    [osd]
    bluefs_buffered_io = false
    bluestore_csum_type = none

# kubectl create -f ceph-override-conf.yaml
# kubectl create -f cluster.yaml
serviceaccount "rook-ceph-cluster" created
role "rook-ceph-cluster" created
rolebinding "rook-ceph-cluster-mgmt" created
rolebinding "rook-ceph-cluster" created
configmap "rook-config-override" created
cluster "rook-ceph" created

2、檢查啟動的Ceph組件配置

# cat /var/lib/rook/mon-a/rook-ceph.config
[global]
fsid                      = e963975a-fe17-4806-b1b1-d4a6fcebd710
run dir                   = /var/lib/rook/mon-a
mon initial members       = a
mon host                  = 10.96.0.239:6790
log file                  = /dev/stderr
mon cluster log file      = /dev/stderr
public addr               = 10.96.0.239
cluster addr              = 192.168.239.137
mon keyvaluedb            = rocksdb
mon_allow_pool_delete     = true
mon_max_pg_per_osd        = 1000
debug default             = 0
debug rados               = 0
debug mon                 = 0
debug osd                 = 0
debug bluestore           = 0
debug filestore           = 0
debug journal             = 0
debug leveldb             = 0
filestore_omap_backend    = rocksdb
osd pg bits               = 11
osd pgp bits              = 11
osd pool default size     = 2
osd pool default min size = 1
osd pool default pg num   = 100
osd pool default pgp num  = 100
rbd_default_features      = 3
fatal signal handlers     = false
osd crush update on start = false

[mon.a]
keyring          = /var/lib/rook/mon-a/keyring
public bind addr = 192.168.239.137:6790

[osd]
bluefs_buffered_io  = false
bluestore_csum_type = none

4、如何自定義crush rule?

Rook沒有提供kind為 crush rule 的API,所以這里沒法類似創建Pool那樣創建一個 crush rule , crush rule的定制化也比較多,可以通過CLI或者修改CRUSHMAP的方式操作。

5/如何升級Ceph集群?

如下,創建Ceph版本為v12的Cluster:

# vim cluster.yaml
...
spec:
  cephVersion:
    image: ceph/ceph:v12
    allowUnsupported: false
...

創建后查看Ceph版本為:12.2.9

[root@rook-ceph-mgr-a-558d49cf8c-dk49n /]# ceph -v
ceph version 12.2.9 (9e300932ef8a8916fb3fda78c58691a6ab0f4217) luminous (stable)

# kubectl create -f toolbox.yaml
deployment "rook-ceph-tools" created
# kubectl -n rook-ceph exec -it rook-ceph-tools-79954fdf9d-s65wm bash
[root@ceph0 /]# ceph -v
ceph version 13.2.2 (02899bfda814146b021136e9d8e80eba494e1126) mimic (stable)

通過edit來修改Cluster,指定image的Ceph版本為v13,如下:

# kubectl -n rook-ceph edit cluster rook-ceph
...
spec:
  cephVersion:
    image: ceph/ceph:v13
...

cluster "rook-ceph" edited

之后查看Ceph OSD組件會逐個刪除重建,升級到指定的Ceph版本:

# kubectl -n rook-ceph get pods -o wide
NAME                               READY     STATUS        RESTARTS   AGE       IP                NODE
rook-ceph-mgr-a-558d49cf8c-dk49n   1/1       Running       0          29m       192.168.239.130   ceph0
rook-ceph-mon-a-6c99f7fc49-rw556   1/1       Running       0          30m       192.168.239.171   ceph0
rook-ceph-mon-b-77bbdd8676-rj22f   1/1       Running       0          29m       192.168.152.189   ceph4
rook-ceph-mon-c-c7dd7bb4b-8qclr    1/1       Running       0          29m       192.168.150.217   ceph5
rook-ceph-osd-0-c5d865db6-5dgl4    1/1       Running       0          1m        192.168.152.190   ceph4
rook-ceph-osd-1-785b4f8c6d-qf9lc   1/1       Running       0          55s       192.168.150.237   ceph5
rook-ceph-osd-2-6679497484-hjf85   0/1       Terminating   0          28m       <none>            ceph5
rook-ceph-osd-3-87f8d69db-tmrl5    1/1       Running       0          2m        192.168.239.184   ceph0
rook-ceph-tools-79954fdf9d-s65wm   1/1       Running       0          23m       100.64.0.20       ceph0

升級過程中,會發現會自動設置上flag:noscrub,nodeep-scrub

[root@ceph0 /]# ceph -s
  cluster:
    id:     adb3db57-6f09-4c4a-a3f9-171d6cfe167a
    health: HEALTH_WARN
            noscrub,nodeep-scrub flag(s) set
            1 osds down
            Reduced data availability: 6 pgs inactive, 18 pgs down
            Degraded data redundancy: 2/10 objects degraded (20.000%), 2 pgs degraded
...

待所有的OSD升級完成后,集群狀態為 HEALTH_OK ,Ceph mgr,mon,mds組件不會自動升級:

# kubectl -n rook-ceph get pods -o wide
NAME                               READY     STATUS    RESTARTS   AGE       IP                NODE
rook-ceph-mgr-a-558d49cf8c-dk49n   1/1       Running   0          32m       192.168.239.130   ceph0
rook-ceph-mon-a-6c99f7fc49-rw556   1/1       Running   0          33m       192.168.239.171   ceph0
rook-ceph-mon-b-77bbdd8676-rj22f   1/1       Running   0          32m       192.168.152.189   ceph4
rook-ceph-mon-c-c7dd7bb4b-8qclr    1/1       Running   0          32m       192.168.150.217   ceph5
rook-ceph-osd-0-c5d865db6-5dgl4    1/1       Running   0          4m        192.168.152.190   ceph4
rook-ceph-osd-1-785b4f8c6d-qf9lc   1/1       Running   0          3m        192.168.150.237   ceph5
rook-ceph-osd-2-86bb5594df-tdhx4   1/1       Running   0          2m        192.168.150.244   ceph5
rook-ceph-osd-3-87f8d69db-tmrl5    1/1       Running   0          5m        192.168.239.184   ceph0
rook-ceph-tools-79954fdf9d-s65wm   1/1       Running   0          26m       100.64.0.20       ceph0

Rook V0.9.0版本里,mgr和mon會自動升級

之后單獨升級Ceph的其他組件:

# kubectl -n rook-ceph delete pod rook-ceph-mgr-a-558d49cf8c-dk49n
# kubectl -n rook-ceph delete pod rook-ceph-mon-a-6c99f7fc49-rw556
...

但發現這些pod重啟后,還是使用舊的Ceph版本!!!!

可以通過修改deployment的方法來升級Ceph mgr,mon,mds組件:

# kubectl -n rook-ceph get deployment
NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
rook-ceph-mds-cephfs-a   1         1         1            1           22m
rook-ceph-mds-cephfs-b   1         1         1            1           22m
rook-ceph-mds-cephfs-c   1         1         1            1           22m
rook-ceph-mds-cephfs-d   1         1         1            1           22m
rook-ceph-mgr-a          1         1         1            1           25m
rook-ceph-mon-a          1         1         1            1           27m
rook-ceph-mon-b          1         1         1            1           26m
rook-ceph-mon-c          1         1         1            1           26m
rook-ceph-osd-0          1         1         1            1           25m
rook-ceph-osd-1          1         1         1            1           25m
rook-ceph-osd-2          1         1         1            1           25m
rook-ceph-tools          1         1         1            1           14m

# kubectl -n rook-ceph edit deployment rook-ceph-mon-a
...
        image: ceph/ceph:v13
...
deployment "rook-ceph-mon-a" edited
升級Ceph MDS組件時候要全部升級,不同Ceph版本的MDSs不能組成多Active MDSs集群

總結

Rook的定位

從Rook的官方文檔中看出,它的定位是Kubernetes上的存儲提供框架,提供基於Kubernetes的多種存儲部署,比如:Ceph,Minio,CockroachDB,Cassandra,NFS等。

Ceph只是作為其第一個提供的beta版的存儲方案。

參考: Storage Provider Framework

Rook的優勢

  1. 與Kubernetes集成,一鍵部署
  2. Rook支持通過yaml文件創建pool,cephfs,radosgw,監控等
  3. 簡單擴容和小版本升級比較方便,kuberctl edit 即可

Rook的不足

  1. Rook項目時間還短,代碼不夠完善
  2. 不支持分區配置OSD,不能准確定制OSD的磁盤使用
  3. Rook可以一鍵刪除Ceph pool / cephfs / radosgw和Ceph集群,沒有確認,有些危險
  4. 基於容器化技術,Ceph的各個組件的IO棧又多了一層,性能會有所損耗
  5. Ceph運維增加了Kubernetes一層,對Ceph運維人員的知識棧要求又提高了

使用場景總結

所以總體來說如下:

適合使用Rook的場景

  • POC環境,測試環境
  • Kubernetes + Ceph混合部署環境
  • 對Ceph性能沒強要求環境
  • 不需要經常隨社區升級Ceph版本的環境

不適合使用Rook的場景

  • Ceph集群單獨部署環境
  • Ceph性能強需求環境
  • 跟隨Ceph社區升級版本的環境

轉載於:  https://blog.csdn.net/wangshuminjava/article/details/90603382


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM