В этой статье мы подробно рассмотрим установку и настройку Rook, а также то, как интегрировать высокодоступный кластер Ceph Storage Cluster в существующий кластер kubernetes. Я выполняю этот процесс на недавно развернутой системе Kubernetes на серверах Rocky Linux 8. Но этот процесс можно использовать с любым другим кластером Kubernetes, развернутым с помощью Kubeadm или инструментов автоматизации, таких как Kubespray и Rancher.

В первые дни существования Kubernetes большинство развернутых приложений были Stateless, что означало отсутствие необходимости в сохранении данных. Однако по мере того, как Kubernetes становилась все более популярной, возникла проблема надежности при планировании stateful-сервисов. В настоящее время можно использовать множество типов томов хранения, включая vSphere Volumes, Ceph, AWS Elastic Block Store, Glusterfs, NFS, GCE Persistent Disk и многие другие. Это дает нам возможность запускать Stateful-сервисы, требующие надежного бэкэнда хранения.

Что такое Rook / Ceph?

Rook — это бесплатный и мощный облачно-нативный орхистратор хранения с открытым исходным кодом для Kubernetes. Он обеспечивает поддержку разнообразных решений для хранения данных для естественной интеграции с облачными нативными средами. Более подробная информация о решениях для хранения данных, поддерживаемых Rook в настоящее время, представлена в раздел «Статус проекта.

Ceph — это распределенная система хранения данных, которая обеспечивает файл, блок и объект хранилище и развернуто в крупномасштабных производственных кластерах. Rook позволит нам автоматизировать развертывание, загрузку, настройку, масштабирование и обновление кластера Ceph в среде Kubernetes. Ceph широко используется в собственной инфраструктуре, где управляемое решение для хранения данных редко является опцией.

Rook использует примитивы Kubernetes для запуска и управления программно-определяемыми хранилищами Kubernetes.

ceph rook kubernetes 01

Ключевые компоненты Rook Storage Orchestrator:

  • Пользовательские определения ресурсов (CRDs) — используются для создания и настройки кластеров хранения. CRD внедряются в Kubernetes в процессе развертывания.
  • Rook Operator для Ceph — Он автоматизирует всю настройку компонентов хранения и следит за состоянием кластера, чтобы обеспечить его работоспособность и доступность
  • DaemonSet вызывается rook-discover — Он запускает стручок, работающий агент обнаружения на всех узлах вашего кластера Kubernetes, чтобы обнаружить все необработанные дисковые устройства / разделы, которые могут быть использованы в качестве диска Ceph OSD.
  • Мониторинг — Rook включает Ceph Dashboard и предоставляет сборщики/экспортеры метрик и панели мониторинга.

Особенности Rook

  • Rook позволяет создавать блочные, файловые и объектные хранилища с помощью нескольких поставщиков услуг хранения данных
  • Возможность эффективного распределения и репликации данных для минимизации возможных потерь
  • Rook предназначен для управления технологиями хранения данных с открытым исходным кодом — NFS, Ceph, Cassandra
  • Rook — это программное обеспечение с открытым исходным кодом, выпускаемое под лицензией Apache 2.0.
  • С помощью Rook можно гипермасштабировать или гиперконвергировать кластеры хранения данных в среде Kubernetes.
  • Rook позволяет системным администраторам легко включить эластичное хранение данных в вашем центре обработки данных
  • Применяя Rook в качестве орхистратора хранилища, вы сможете оптимизировать рабочие нагрузки на товарном оборудовании

Настройка Ceph в кластере Kubernetes с помощью Rook

Это минимальные требования к настройке для развертывания Rook и Ceph Storage на кластере Kubernetes.

  • Кластер с минимальным количеством три узлы
  • Доступные необработанные дисковые устройства (без разделов и отформатированных файловых систем)
  • Или необработанные разделы (без отформатированной файловой системы)
  • Или постоянные тома, доступные из класса хранилища в блочном режиме

Если вам нужно простое хранилище постоянных томов для вашего кластера, ознакомьтесь с нашей статьей о NFS:

  • Настройка NFS в качестве хранилища постоянных томов Kubernetes
  • Динамическое создание hostPath PV в Kubernetes с помощью Local Path Provisioner

Шаг 1: Добавьте Raw-устройства/разделы на узлы

Перечислите все узлы в вашем кластере Kubernetes и решите, какие из них будут использоваться для создания кластера Ceph Storage Cluster. Я рекомендую использовать рабочие узлы, а не машины плоскости управления.

[root@k8s-bastion ~]# kubectl get nodes
NAME                                STATUS   ROLES                  AGE   VERSION
k8smaster01.hirebestengineers.com   Ready    control-plane,master   28m   v1.28.2
k8smaster02.hirebestengineers.com   Ready    control-plane,master   24m   v1.28.2
k8smaster03.hirebestengineers.com   Ready    control-plane,master   23m   v1.28.2
k8snode01.hirebestengineers.com     Ready    <none>                 22m   v1.28.2
k8snode02.hirebestengineers.com     Ready    <none>                 21m   v1.28.2
k8snode03.hirebestengineers.com     Ready    <none>                 21m   v1.28.2
k8snode04.hirebestengineers.com     Ready    <none>                 21m   v1.28.2

В моей тестовой среде каждый из рабочих узлов будет иметь одно необработанное устройство — /dev/vdb , который мы добавим позже.

[root@k8s-worker-01 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   40G  0 disk
├─vda1 253:1    0    1M  0 part
├─vda2 253:2    0    1G  0 part /boot
├─vda3 253:3    0  615M  0 part
└─vda4 253:4    0 38.4G  0 part /

[root@k8s-worker-01 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       209Mi        14Gi       8.0Mi       427Mi        14Gi
Swap:         614Mi          0B       614Mi

Для создания кластера хранения будет использован следующий список узлов.

[root@kvm-private-lab ~]# virsh list | grep k8s-worker
 31   k8s-worker-01-server   running
 36   k8s-worker-02-server   running
 38   k8s-worker-03-server   running
 41   k8s-worker-04-server   running

Добавьте вторичное хранилище на каждый узел

Если используется гипервизор KVM, начните со списка пулов хранения:

$ sudo virsh pool-list
 Name     State    Autostart
------------------------------
 images   active   yes

Я добавлю 40 ГБ том на по умолчанию пул хранения. Это можно сделать с помощью цикла for:

for domain ink8s-worker-0{1..4}-server; do
  sudo virsh vol-create-asimages ${domain}-disk-2.qcow2 40G
done

Вывод выполнения команды:

Vol k8s-worker-01-server-disk-2.qcow2 created
Vol k8s-worker-02-server-disk-2.qcow2 created
Vol k8s-worker-03-server-disk-2.qcow2 created
Vol k8s-worker-04-server-disk-2.qcow2 created

Вы можете проверить детали изображения, включая размер, используя qemu-img команда:

$ qemu-img info /var/lib/libvirt/images/k8s-worker-01-server-disk-2.qcow2
image: /var/lib/libvirt/images/k8s-worker-01-server-disk-2.qcow2
file format: raw
virtual size: 40 GiB (42949672960 bytes)
disk size: 40 GiB

Чтобы присоединить созданный выше том(ы) к виртуальной машине, выполните команду:

for domain ink8s-worker-0{1..4}-server; do
  sudo virsh attach-disk --domain ${domain} \
    --source /var/lib/libvirt/images/${domain}-disk-2.qcow2  \
    --persistent --target vdb
done
  • --persistent: Сделать изменения постоянными
  • --target vdb: Цель дискового устройства

Подтверждение успешного добавления

Disk attached successfully
Disk attached successfully
Disk attached successfully
Disk attached successfully

Вы можете подтвердить, что том был добавлен в vm как блочное устройство /dev/vdb

[root@k8s-worker-01 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   40G  0 disk
├─vda1 253:1    0    1M  0 part
├─vda2 253:2    0    1G  0 part /boot
├─vda3 253:3    0  615M  0 part
└─vda4 253:4    0 38.4G  0 part /
vdb    253:16   0   40G  0 disk

Шаг 2: Развертывание Rook Storage Orchestrator

Клонируйте ладья проект с Github используя git команду. Это следует делать на машине с kubeconfig настроен и подтвердил работоспособность.

Вы также можете клонировать конкретную ветку Рука, как показано на рисунке метка релиза. Вы можете видеть страница филиалов для получения конкретного номера.

cd ~/
git clone --single-branch --branch release-1.14 https://github.com/rook/rook.git

Для кластера Ceph будут использоваться все узлы с доступными необработанными устройствами. Как было сказано ранее, для кластера Ceph необходимо как минимум три узла необходимы

cd rook/deploy/examples/

Подтвердите активную ветку.

 $ git branch
* release-1.14

Развертывание оператора ладьи

Первым шагом при развертывании оператора Rook является использование.

Создайте необходимые CRD, как указано в crds.yaml манифест:

[root@k8s-bastion ceph]# kubectl create -f crds.yaml
customresourcedefinition.apiextensions.k8s.io/cephblockpoolradosnamespaces.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephblockpools.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephbucketnotifications.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephbuckettopics.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephclients.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephclusters.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephcosidrivers.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephfilesystemmirrors.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephfilesystems.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephfilesystemsubvolumegroups.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephnfses.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectrealms.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectstores.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectstoreusers.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectzonegroups.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephobjectzones.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/cephrbdmirrors.ceph.rook.io created
customresourcedefinition.apiextensions.k8s.io/objectbucketclaims.objectbucket.io created
customresourcedefinition.apiextensions.k8s.io/objectbuckets.objectbucket.io created

Создайте общие ресурсы, как в common.yaml файл:

[root@k8s-bastion ceph]# kubectl create -f common.yaml
namespace/rook-ceph created
clusterrole.rbac.authorization.k8s.io/cephfs-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/cephfs-external-provisioner-runner created
clusterrole.rbac.authorization.k8s.io/objectstorage-provisioner-role created
clusterrole.rbac.authorization.k8s.io/rbd-csi-nodeplugin created
clusterrole.rbac.authorization.k8s.io/rbd-external-provisioner-runner created
clusterrole.rbac.authorization.k8s.io/rook-ceph-cluster-mgmt created
clusterrole.rbac.authorization.k8s.io/rook-ceph-global created
clusterrole.rbac.authorization.k8s.io/rook-ceph-mgr-cluster created
clusterrole.rbac.authorization.k8s.io/rook-ceph-mgr-system created
clusterrole.rbac.authorization.k8s.io/rook-ceph-object-bucket created
clusterrole.rbac.authorization.k8s.io/rook-ceph-osd created
clusterrole.rbac.authorization.k8s.io/rook-ceph-system created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-nodeplugin-role created
clusterrolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/objectstorage-provisioner-role-binding created
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-nodeplugin created
clusterrolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-global created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-mgr-cluster created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-object-bucket created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-osd created
clusterrolebinding.rbac.authorization.k8s.io/rook-ceph-system created
role.rbac.authorization.k8s.io/cephfs-external-provisioner-cfg created
role.rbac.authorization.k8s.io/rbd-csi-nodeplugin created
role.rbac.authorization.k8s.io/rbd-external-provisioner-cfg created
role.rbac.authorization.k8s.io/rook-ceph-cmd-reporter created
role.rbac.authorization.k8s.io/rook-ceph-mgr created
role.rbac.authorization.k8s.io/rook-ceph-osd created
role.rbac.authorization.k8s.io/rook-ceph-purge-osd created
role.rbac.authorization.k8s.io/rook-ceph-rgw created
role.rbac.authorization.k8s.io/rook-ceph-system created
rolebinding.rbac.authorization.k8s.io/cephfs-csi-provisioner-role-cfg created
rolebinding.rbac.authorization.k8s.io/rbd-csi-nodeplugin-role-cfg created
rolebinding.rbac.authorization.k8s.io/rbd-csi-provisioner-role-cfg created
rolebinding.rbac.authorization.k8s.io/rook-ceph-cluster-mgmt created
rolebinding.rbac.authorization.k8s.io/rook-ceph-cmd-reporter created
rolebinding.rbac.authorization.k8s.io/rook-ceph-mgr created
rolebinding.rbac.authorization.k8s.io/rook-ceph-mgr-system created
rolebinding.rbac.authorization.k8s.io/rook-ceph-osd created
rolebinding.rbac.authorization.k8s.io/rook-ceph-purge-osd created
rolebinding.rbac.authorization.k8s.io/rook-ceph-rgw created
rolebinding.rbac.authorization.k8s.io/rook-ceph-system created
serviceaccount/objectstorage-provisioner created
serviceaccount/rook-ceph-cmd-reporter created
serviceaccount/rook-ceph-mgr created
serviceaccount/rook-ceph-osd created
serviceaccount/rook-ceph-purge-osd created
serviceaccount/rook-ceph-rgw created
serviceaccount/rook-ceph-system created
serviceaccount/rook-csi-cephfs-plugin-sa created
serviceaccount/rook-csi-cephfs-provisioner-sa created
serviceaccount/rook-csi-rbd-plugin-sa created
serviceaccount/rook-csi-rbd-provisioner-sa created

Наконец, разверните оператор Rook ceph из operator.yaml файл манифеста:

[root@k8s-bastion ceph]# kubectl create -f operator.yaml
configmap/rook-ceph-operator-config created
deployment.apps/rook-ceph-operator created

Через несколько секунд компоненты Rook должны быть запущены, как показано ниже:

[root@k8s-bastion ceph]# kubectl get all -n rook-ceph
NAME                                     READY   STATUS    RESTARTS   AGE
pod/rook-ceph-operator-9bf8b5959-nz6hd   1/1     Running   0          45s

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/rook-ceph-operator   1/1     1            1           45s

NAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/rook-ceph-operator-9bf8b5959   1         1         1       45s

Убедитесь, что оператор rook-ceph-operator находится в папке Running , прежде чем продолжить:

[root@k8s-bastion ceph]# kubectl -n rook-ceph get pod
NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-operator-76dc868c4b-zk2tj   1/1     Running   0          69s

Шаг 3: Создание кластера Ceph на Kubernetes

Теперь, когда мы подготовили рабочие узлы, добавив необработанные дисковые устройства, и развернули оператора Rook, пришло время развернуть кластер хранения Ceph.

Давайте установим пространство имен по умолчанию на rook-ceph:

# kubectl config set-context --current --namespace rook-ceph
Context "kubernetes-admin@kubernetes" modified.

Учитывая, что кластеры Rook Ceph могут самостоятельно обнаруживать необработанные разделы, можно использовать стандартный файл манифеста развертывания кластера без каких-либо изменений.

[root@k8s-bastion ceph]# kubectl create -f cluster.yaml
cephcluster.ceph.rook.io/rook-ceph created

Для дальнейших настроек кластера Ceph проверьте Документация Ceph Cluster CRD.

Если не используются все узлы, можно явно определить узлы и сырые устройства, которые будут использоваться, как показано в примере ниже:

  storage: # cluster level storage configuration and selection
    useAllNodes: false
    useAllDevices: false
    nodes:
    - name: "k8snode01.hirebestengineers.com"
      devices: # specific devices to use for storage can be specified for each node
      - name: "sdb"
    - name: "k8snode03.hirebestengineers.com"
      devices:
      - name: "sdb"

Чтобы просмотреть все созданные ресурсы, выполните следующую команду:

kubectl get all -n rook-ceph

Наблюдение за созданием бодов в пространстве имен rook-ceph:

kubectl get pods -n rook-ceph -w

Это список бодов, запущенных в пространстве имен после успешного развертывания:

[root@k8s-bastion ceph]# kubectl get pods -n rook-ceph
NAME                                                              READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-8vrgj                                            3/3     Running     0          5m39s
csi-cephfsplugin-9csbp                                            3/3     Running     0          5m39s
csi-cephfsplugin-lh42b                                            3/3     Running     0          5m39s
csi-cephfsplugin-provisioner-b54db7d9b-kh89q                      6/6     Running     0          5m39s
csi-cephfsplugin-provisioner-b54db7d9b-l92gm                      6/6     Running     0          5m39s
csi-cephfsplugin-xc8tk                                            3/3     Running     0          5m39s
csi-rbdplugin-28th4                                               3/3     Running     0          5m41s
csi-rbdplugin-76bhw                                               3/3     Running     0          5m41s
csi-rbdplugin-7ll7w                                               3/3     Running     0          5m41s
csi-rbdplugin-provisioner-5845579d68-5rt4x                        6/6     Running     0          5m40s
csi-rbdplugin-provisioner-5845579d68-p6m7r                        6/6     Running     0          5m40s
csi-rbdplugin-tjlsk                                               3/3     Running     0          5m41s
rook-ceph-crashcollector-k8snode01.hirebestengineers.com-7ll2x6   1/1     Running     0          3m3s
rook-ceph-crashcollector-k8snode02.hirebestengineers.com-8ghnq9   1/1     Running     0          2m40s
rook-ceph-crashcollector-k8snode03.hirebestengineers.com-7t88qp   1/1     Running     0          3m14s
rook-ceph-crashcollector-k8snode04.hirebestengineers.com-62n95v   1/1     Running     0          3m14s
rook-ceph-mgr-a-7cf9865b64-nbcxs                                  1/1     Running     0          3m17s
rook-ceph-mon-a-555c899765-84t2n                                  1/1     Running     0          5m47s
rook-ceph-mon-b-6bbd666b56-lj44v                                  1/1     Running     0          4m2s
rook-ceph-mon-c-854c6d56-dpzgc                                    1/1     Running     0          3m28s
rook-ceph-operator-9bf8b5959-nz6hd                                1/1     Running     0          13m
rook-ceph-osd-0-5b7875db98-t5mdv                                  1/1     Running     0          3m6s
rook-ceph-osd-1-677c4cd89-b5rq2                                   1/1     Running     0          3m5s
rook-ceph-osd-2-6665bc998f-9ck2f                                  1/1     Running     0          3m3s
rook-ceph-osd-3-75d7b47647-7vfm4                                  1/1     Running     0          2m40s
rook-ceph-osd-prepare-k8snode01.hirebestengineers.com--1-6kbkn    0/1     Completed   0          3m14s
rook-ceph-osd-prepare-k8snode02.hirebestengineers.com--1-5hz49    0/1     Completed   0          3m14s
rook-ceph-osd-prepare-k8snode03.hirebestengineers.com--1-4b45z    0/1     Completed   0          3m14s
rook-ceph-osd-prepare-k8snode04.hirebestengineers.com--1-4q8cs    0/1     Completed   0          3m14s

Каждый рабочий узел будет иметь задание на добавление OSD в Ceph Cluster:

[root@k8s-bastion ceph]# kubectl get -n rook-ceph jobs.batch
NAME                                                    COMPLETIONS   DURATION   AGE
rook-ceph-osd-prepare-k8snode01.hirebestengineers.com   1/1           11s        3m46s
rook-ceph-osd-prepare-k8snode02.hirebestengineers.com   1/1           34s        3m46s
rook-ceph-osd-prepare-k8snode03.hirebestengineers.com   1/1           10s        3m46s
rook-ceph-osd-prepare-k8snode04.hirebestengineers.com   1/1           9s         3m46s

[root@k8s-bastion ceph]# kubectl describe jobs.batch rook-ceph-osd-prepare-k8snode01.hirebestengineers.com

Убедитесь, что кластер CR создан и активен:

[root@k8s-bastion ceph]# kubectl -n rook-ceph get cephcluster
NAME        DATADIRHOSTPATH   MONCOUNT   AGE     PHASE   MESSAGE                        HEALTH      EXTERNAL
rook-ceph   /var/lib/rook     3          3m50s   Ready   Cluster created successfully   HEALTH_OK

Шаг 4: Развертывание набора инструментов Rook Ceph в Kubernetes

TheНабор инструментов Rook Ceph это контейнер с общими инструментами, используемыми для отладки и тестирования rook. Инструментарий основан на CentOS, и любые дополнительные инструменты могут быть легко установлены через yum.

Мы запустим ящик для инструментов в интерактивном режиме, чтобы мы могли подключиться и выполнять команды Ceph из оболочки. Перейдите в каталог ceph:

cd ~/
cd rook/deploy/examples

Примените toolbox.yaml файл манифеста для создания капсулы toolbox:

[root@k8s-bastion ceph]# kubectl  apply  -f toolbox.yaml
deployment.apps/rook-ceph-tools created

Подключитесь к стручку с помощью kubectl команда с exec вариант:

[root@k8s-bastion ~]# kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
[root@rook-ceph-tools-96c99fbf-qb9cj /]#

Проверка состояния кластера хранения Ceph. Будьте внимательны к значению параметра cluster.health, он должен быть ЗДОРОВЬЕ_ОК.

[root@rook-ceph-tools-96c99fbf-qb9cj /]# ceph status
  cluster:
    id:     470b7cde-7355-4550-bdd2-0b79d736b8ac
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum a,b,c (age 5m)
    mgr: a(active, since 4m)
    osd: 4 osds: 4 up (since 4m), 4 in (since 5m)

  data:
    pools:   1 pools, 128 pgs
    objects: 0 objects, 0 B
    usage:   25 MiB used, 160 GiB / 160 GiB avail
    pgs:     128 active+clean

Перечислите все OSD, чтобы проверить их текущее состояние. Они должны существовать и быть в рабочем состоянии.

[root@rook-ceph-tools-96c99fbf-qb9cj /]# ceph osd status
ID  HOST                              USED  AVAIL  WR OPS  WR DATA  RD OPS  RD DATA  STATE
 0  k8snode04.hirebestengineers.com  6776k  39.9G      0        0       0        0   exists,up
 1  k8snode03.hirebestengineers.com  6264k  39.9G      0        0       0        0   exists,up
 2  k8snode01.hirebestengineers.com  6836k  39.9G      0        0       0        0   exists,up
 3  k8snode02.hirebestengineers.com  6708k  39.9G      0        0       0        0   exists,up

Проверьте необработанные хранилища и пулы:

[root@rook-ceph-tools-96c99fbf-qb9cj /]# ceph df
--- RAW STORAGE ---
CLASS     SIZE    AVAIL     USED  RAW USED  %RAW USED
hdd    160 GiB  160 GiB  271 MiB   271 MiB       0.17
TOTAL  160 GiB  160 GiB  271 MiB   271 MiB       0.17

--- POOLS ---
POOL                   ID  PGS  STORED  OBJECTS     USED  %USED  MAX AVAIL
device_health_metrics   1   32     0 B        0      0 B      0     51 GiB
replicapool             3   32    35 B        8   24 KiB      0     51 GiB
k8fs-metadata           8  128  91 KiB       24  372 KiB      0     51 GiB
k8fs-data0              9   32     0 B        0      0 B      0     51 GiB

[root@rook-ceph-tools-96c99fbf-qb9cj /]# rados df
POOL_NAME                 USED  OBJECTS  CLONES  COPIES  MISSING_ON_PRIMARY  UNFOUND  DEGRADED  RD_OPS       RD  WR_OPS       WR  USED COMPR  UNDER COMPR
device_health_metrics      0 B        0       0       0                   0        0         0       0      0 B       0      0 B         0 B          0 B
k8fs-data0                 0 B        0       0       0                   0        0         0       1    1 KiB       2    1 KiB         0 B          0 B
k8fs-metadata          372 KiB       24       0      72                   0        0         0  351347  172 MiB      17   26 KiB         0 B          0 B
replicapool             24 KiB        8       0      24                   0        0         0     999  6.9 MiB    1270  167 MiB         0 B          0 B

total_objects    32
total_used       271 MiB
total_avail      160 GiB
total_space      160 GiB

Шаг 5: Работа с режимами хранения Ceph

Rook предоставляет вам три типа хранилищ:

  • Общая файловая система: Создание общей файловой системы для нескольких подсистем (RWX)
  • Блок: Создание блочного хранилища для потребления капсулой (RWO)
  • Объект: Создание хранилища объектов, доступного внутри или вне кластера Kubernetes

Все необходимые файлы для любого из режимов хранения доступны в rook/cluster/examples/kubernetes/ceph/ каталоге.

cd ~/
cd rook/deploy/examples

1. Cephfs

Cephfs используется для создания общей файловой системы, которая может быть смонтирована с правами чтения/записи из нескольких подсистем.

Обновите filesystem.yaml файл, задавая имя пула данных, размер репликации и т.д.

[root@k8s-bastion ceph]# vim filesystem.yaml
apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
  name: k8sfs
  namespace: rook-ceph # namespace:cluster

После внесения изменений позвольте оператору Rook создать все пулы и другие ресурсы, необходимые для запуска службы:

[root@k8s-bastion ceph]# kubectl create -f filesystem.yaml
cephfilesystem.ceph.rook.io/k8sfs created

Зайдите в подкаст Rook и проверьте, созданы ли пулы метаданных и данных.

[root@k8s-bastion ceph]# kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
[root@rook-ceph-tools-96c99fbf-qb9cj /]# ceph fs ls
name: k8sfs, metadata pool: k8sfs-metadata, data pools: [k8sfs-replicated ]

[root@rook-ceph-tools-96c99fbf-qb9cj /]# ceph osd lspools
1 device_health_metrics
3 replicapool
8 k8fs-metadata
9 k8sfs-replicated

[root@rook-ceph-tools-96c99fbf-qb9cj /]# exit

Обновите fsName и имя пула в Cephfs Класс хранилища файл конфигурации:

$ vim csi/cephfs/storageclass.yaml
parameters:
  clusterID: rook-ceph # namespace:cluster
  fsName: k8sfs
  pool: k8sfs-replicated

Создайте StorageClass с помощью команды:

[root@k8s-bastion csi]# kubectl create -fcsi/cephfs/storageclass.yaml
storageclass.storage.k8s.io/rook-cephfs created

Перечислите доступные классы хранения в кластере Kubernetes:

[root@k8s-bastion csi]# kubectl get sc
NAME          PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-cephfs   rook-ceph.cephfs.csi.ceph.com   Delete          Immediate           true                   97s

Создайте тестовые PVC и Pod для проверки использования Persistent Volume.

[root@k8s-bastion csi]# kubectl create  -f  csi/cephfs/pvc.yaml
persistentvolumeclaim/cephfs-pvc created

[root@k8s-bastion ceph]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
cephfs-pvc   Bound    pvc-fd024cc0-dcc3-4a1d-978b-a166a2f65cdb   1Gi        RWO            rook-cephfs       4m42s

[root@k8s-bastion csi]# kubectl create -f csi/cephfs/pod.yaml
pod/csicephfs-demo-pod created

Содержимое файла манифеста создания PVC:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cephfs-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: rook-cephfs

Проверка журналов создания PV, захваченных провизионной капсулой:

[root@k8s-bastion csi]# kubectl logs deploy/csi-cephfsplugin-provisioner -f -c csi-provisioner

[root@k8s-bastion ceph]# kubectl get pods | grep csi-cephfsplugin-provision
csi-cephfsplugin-provisioner-b54db7d9b-5dpt6                      6/6     Running     0          4m30s
csi-cephfsplugin-provisioner-b54db7d9b-wrbxh                      6/6     Running     0          4m30s

Если вы сделали обновление, а provisioner не выбрал его, вы можете всегда перезапускать Cephfs Provisioner Боды:

# Gracefully
$ kubectl delete pod -l app=csi-cephfsplugin-provisioner
# Forcefully
$ kubectl delete pod -l app=csi-cephfsplugin-provisioner --grace-period=0 --force

2. RBD

Блочное хранилище позволяет одному капсуле монтировать хранилище (режим RWO). Прежде чем Rook сможет предоставить хранилище, необходимо StorageClass и CephBlockPool необходимо создать

[root@k8s-bastion ~]# cd 
[root@k8s-bastion ~]# cd rook/deploy/examples
[root@k8s-bastion csi]# kubectl  create  -f csi/rbd/storageclass.yaml
cephblockpool.ceph.rook.io/replicapool created
storageclass.storage.k8s.io/rook-ceph-block created

[root@k8s-bastion csi]# kubectl  create  -f csi/rbd/pvc.yaml
persistentvolumeclaim/rbd-pvc created

Перечислите классы хранения и PVC:

[root@k8s-bastion csi]# kubectl get sc
NAME              PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block   rook-ceph.rbd.csi.ceph.com      Delete          Immediate           true                   49s
rook-cephfs       rook-ceph.cephfs.csi.ceph.com   Delete          Immediate           true                   6h17m

[root@k8s-bastion csi]# kubectl get pvc rbd-pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
rbd-pvc   Bound    pvc-c093e6f7-bb4e-48df-84a7-5fa99fe81138   1Gi        RWO            rook-ceph-block   43s
Развертывание нескольких приложений

Мы создадим пример приложения, которое будет использовать блочное хранилище, предоставляемое Rook, с помощью классического wordpress и mysql приложения. Оба эти приложения будут использовать блочные тома, предоставляемые Rook.

[root@k8s-bastion ~]# cd 
[root@k8s-bastion ~]# cd rook/deploy/examples

[root@k8s-bastion kubernetes]# kubectl create -f mysql.yaml
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
deployment.apps/wordpress-mysql created

[root@k8s-bastion kubernetes]# kubectl create -f wordpress.yaml
service/wordpress created
persistentvolumeclaim/wp-pv-claim created
deployment.apps/wordpress created

Оба приложения создают блочный том и монтируют его в соответствующую капсулу. Вы можете увидеть утверждения тома Kubernetes, выполнив следующие действия:

[root@k8smaster01 kubernetes]# kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
cephfs-pvc       Bound    pvc-aa972f9d-ab53-45f6-84c1-35a192339d2e   1Gi        RWO            rook-cephfs       2m59s
mysql-pv-claim   Bound    pvc-4f1e541a-1d7c-49b3-93ef-f50e74145057   20Gi       RWO            rook-ceph-block   10s
rbd-pvc          Bound    pvc-68e680c1-762e-4435-bbfe-964a4057094a   1Gi        RWO            rook-ceph-block   47s
wp-pv-claim      Bound    pvc-fe2239a5-26c0-4ebc-be50-79dc8e33dc6b   20Gi       RWO            rook-ceph-block   5s

Проверка развертывания служб MySQL и WordPress:

[root@k8s-bastion kubernetes]# kubectl get deploy wordpress wordpress-mysql
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
wordpress         1/1     1            1           2m46s
wordpress-mysql   1/1     1            1           3m8s

[root@k8s-bastion kubernetes]# kubectl get svc wordpress wordpress-mysql
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
wordpress         LoadBalancer   10.98.120.112   <pending>     80:32046/TCP   3m39s
wordpress-mysql   ClusterIP      None            <none>        3306/TCP       4m1s

Получите WordPress NodePort и протестируйте URL, используя IP-адрес LB и порт.

NodePort=$(kubectl get service wordpress -o jsonpath='{.spec.ports[0].nodePort}')
echo $NodePort

Очистка Тестовые ПВХ и капсулы для хранения

[root@k8s-bastion kubernetes]# kubectl delete -f mysql.yaml
service "wordpress-mysql" deleted
persistentvolumeclaim "mysql-pv-claim" deleted
deployment.apps "wordpress-mysql" deleted

[root@k8s-bastion kubernetes]# kubectl delete -f wordpress.yaml
service "wordpress" deleted
persistentvolumeclaim "wp-pv-claim" deleted
deployment.apps "wordpress" deleted

# Cephfs cleanup
[root@k8s-bastion kubernetes]#kubectl delete -f ceph/csi/cephfs/pod.yaml
[root@k8s-bastion kubernetes]# kubectl delete -f ceph/csi/cephfs/pvc.yaml 

# RBD Cleanup
[root@k8s-bastion kubernetes]#kubectl delete -f ceph/csi/rbd/pod.yaml
[root@k8s-bastion kubernetes]# kubectl delete -f ceph/csi/rbd/pvc.yaml

Шаг 6: Доступ к Ceph Dashboard

Приборная панель Ceph дает вам обзор состояния вашего кластера Ceph:

  • Общее состояние
  • Состояние кворума мон
  • sstatus mgr, и osds
  • Статус других демонов Ceph
  • Просмотр пулов и состояния PG
  • Журналы для демонов и многое другое.

Список сервисов в пространстве имен rook-ceph:

[root@k8s-bastion ceph]# kubectl get svc -n rook-ceph
NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
csi-cephfsplugin-metrics   ClusterIP   10.105.10.255    <none>        8080/TCP,8081/TCP   9m56s
csi-rbdplugin-metrics      ClusterIP   10.96.5.0        <none>        8080/TCP,8081/TCP   9m57s
rook-ceph-mgr              ClusterIP   10.103.171.189   <none>        9283/TCP            7m31s
rook-ceph-mgr-dashboard    ClusterIP   10.102.140.148   <none>        8443/TCP            7m31s
rook-ceph-mon-a            ClusterIP   10.102.120.254   <none>        6789/TCP,3300/TCP   10m
rook-ceph-mon-b            ClusterIP   10.97.249.82     <none>        6789/TCP,3300/TCP   8m19s
rook-ceph-mon-c            ClusterIP   10.99.131.50     <none>        6789/TCP,3300/TCP   7m46s

Из полученного результата мы можем подтвердить, что порт 8443 была настроена.

Используйте переадресацию портов для доступа к приборной панели:

$ kubectl port-forward service/rook-ceph-mgr-dashboard 8443:8443 -n rook-ceph
Forwarding from 127.0.0.1:8443 -> 8443
Forwarding from [::1]:8443 -> 8443

Теперь доступ должен быть открыт через https://locallhost:8443

Имя пользователя admin и пароль можно извлечь с помощью следующей команды:

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

Доступ к приборной панели с помощью порта узла

Чтобы создать службу с портом NodePort, сохраните этот yaml как dashboard-external-https.yaml.

# cd
# vim dashboard-external-https.yaml
apiVersion: v1
kind: Service
metadata:
  name: rook-ceph-mgr-dashboard-external-https
  namespace: rook-ceph
  labels:
    app: rook-ceph-mgr
    rook_cluster: rook-ceph
spec:
  ports:
  - name: dashboard
    port: 8443
    protocol: TCP
    targetPort: 8443
  selector:
    app: rook-ceph-mgr
    rook_cluster: rook-ceph
  sessionAffinity: None
  type: NodePort

Создайте службу, которая прослушивает порт узла:

[root@k8s-bastion ~]# kubectl create -f dashboard-external-https.yaml
service/rook-ceph-mgr-dashboard-external-https created

Проверьте созданную службу:

[root@k8s-bastion ~]# kubectl -n rook-ceph get service rook-ceph-mgr-dashboard-external-https
NAME                                     TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
rook-ceph-mgr-dashboard-external-https   NodePort   10.103.91.41   <none>        8443:32573/TCP   2m43s

В этом примере порт 32573 будет открыт порт 8443 из ceph-mgr pod. Тип службы по умолчанию — NodePort.

Чтобы использовать LB, задайте следующие параметры:

$ kubectl -n rook-ceph edit  service rook-ceph-mgr-dashboard-external-https
...
spec:
  type: LoadBalancer

Теперь вы можете ввести URL в браузере, например https://[clusternodeip]:32573 и появится приборная панель.

панель управления rook ceph access mgr dashboard 01

Для службы балансировки нагрузки это будет https://LB_IP:8443

Войдите в систему с помощью admin имя пользователя и пароль расшифрованы из rook-ceph-dashboard-password секрет.

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

Вид приборной панели Ceph:

приборная панель ceph статус ладьи

Список хостов:

rook ceph access mgr dashboard 02

Шаг 7: Разборка кластера Ceph (Только ссылки)

Если вы хотите снести кластер и создать новый, обратите внимание на следующие ресурсы, которые необходимо очистить:

  • rook-ceph пространство имен: Оператор Rook и кластер, созданный operator.yaml и cluster.yaml (кластерный CRD)
  • /var/lib/rook: Путь на каждом хосте в кластере, где конфигурация кэшируется ceph mons и osds

Все CRD в кластере.

[root@k8s-bastion ~]# kubectl get crds
NAME                                                  CREATED AT
apiservers.operator.tigera.io                         2021-09-24T18:09:12Z
bgpconfigurations.crd.projectcalico.org               2021-09-24T18:09:12Z
bgppeers.crd.projectcalico.org                        2021-09-24T18:09:12Z
blockaffinities.crd.projectcalico.org                 2021-09-24T18:09:12Z
cephclusters.ceph.rook.io                             2021-09-30T20:32:10Z
clusterinformations.crd.projectcalico.org             2021-09-24T18:09:12Z
felixconfigurations.crd.projectcalico.org             2021-09-24T18:09:12Z
globalnetworkpolicies.crd.projectcalico.org           2021-09-24T18:09:12Z
globalnetworksets.crd.projectcalico.org               2021-09-24T18:09:12Z
hostendpoints.crd.projectcalico.org                   2021-09-24T18:09:12Z
imagesets.operator.tigera.io                          2021-09-24T18:09:12Z
installations.operator.tigera.io                      2021-09-24T18:09:12Z
ipamblocks.crd.projectcalico.org                      2021-09-24T18:09:12Z
ipamconfigs.crd.projectcalico.org                     2021-09-24T18:09:12Z
ipamhandles.crd.projectcalico.org                     2021-09-24T18:09:12Z
ippools.crd.projectcalico.org                         2021-09-24T18:09:12Z
kubecontrollersconfigurations.crd.projectcalico.org   2021-09-24T18:09:12Z
networkpolicies.crd.projectcalico.org                 2021-09-24T18:09:12Z
networksets.crd.projectcalico.org                     2021-09-24T18:09:12Z
tigerastatuses.operator.tigera.io                     2021-09-24T18:09:12Z

Отредактируйте CephCluster и добавьте cleanupPolicy

kubectl -n rook-ceph patch cephcluster rook-ceph --type merge -p '{"spec":{"cleanupPolicy":{"confirmation":"yes-really-destroy-data"}}}'

Удалите блочное хранилище и файловое хранилище:

cd ~/
cd rook/deploy/examples
kubectl delete -n rook-ceph cephblockpool replicapool
kubectl delete -fcsi/rbd/storageclass.yaml
kubectl delete -f filesystem.yaml
kubectl delete -f csi/cephfs/storageclass.yaml

Удалите пользовательский ресурс CephCluster:

[root@k8s-bastion ~]# kubectl -n rook-ceph delete cephcluster rook-ceph
cephcluster.ceph.rook.io "rook-ceph" deleted

Убедитесь, что кластер CR был удален, прежде чем переходить к следующему шагу.

kubectl -n rook-ceph get cephcluster

Удаление оператора и связанных с ним ресурсов

kubectl delete -f operator.yaml
kubectl delete -f common.yaml
kubectl delete -f crds.yaml

Устройства для запечатывания

# Set the raw disk / raw partition path
DISK="/dev/vdb"

# Zap the disk to a fresh, usable state (zap-all is important, b/c MBR has to be clean)
# Install: yum install gdisk -y Or apt installgdisk
sgdisk --zap-all $DISK

# Clean hdds with dd
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync

# Clean disks such as ssd with blkdiscard instead of dd
blkdiscard $DISK

# These steps only have to be run once on each node
# If rook sets up osds using ceph-volume, teardown leaves some devices mapped that lock the disks.
ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %

# ceph-volume setup can leave ceph-<UUID> directories in /dev and /dev/mapper (unnecessary clutter)
rm -rf /dev/ceph-*
rm -rf /dev/mapper/ceph--*

# Inform the OS of partition table changes
partprobe $DISK

Удаление финализатора кластера CRD:

for CRD in $(kubectl get crd -n rook-ceph | awk '/ceph.rook.io/ {print $1}'); do
    kubectl get -n rook-ceph "$CRD" -o name | \
    xargs -I {} kubectl patch -n rook-ceph {} --type merge -p '{"metadata":{"finalizers": [null]}}'
done

Если пространство имен все еще застряло в состоянии Terminating, как показано в команде ниже:

$ kubectl get ns rook-ceph
NAME        STATUS        AGE
rook-ceph   Terminating   23h

Вы можете проверить, какие ресурсы задерживают удаление, удалить финализаторы и удалить эти ресурсы.

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n rook-ceph

Из моего вывода следует, что ресурсом является configmap с именем rook-ceph-mon-endpoints:

NAME                                DATA   AGE
configmap/rook-ceph-mon-endpoints   4      23h

Удалите ресурс вручную:

# kubectl delete configmap/rook-ceph-mon-endpoints -n rook-ceph
configmap "rook-ceph-mon-endpoints" deleted