В этой статье мы подробно рассмотрим установку и настройку 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.
Ключевые компоненты 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
и появится приборная панель.
Для службы балансировки нагрузки это будет 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:
Список хостов:
Шаг 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