Развертывание MatrixDB в кластере Kubernetes

В этом документе описывается установка и развертывание MatrixDB в кластере Kubernetes.

1. Перед установкой

1.1 Рабочая среда

  • Кластер Kubernetes
    • Версия Kubernetes >= 1.20
    • Включена RBAC
    • Включен DNS
    • Доступен StorageClass для хранения базы данных
    • Возможен доступ в Интернет для загрузки необходимых пакетов программного обеспечения и образов

1.2 Подготовка инструментов

Вам понадобятся клиенты kubectl и helm, имеющие доступ к кластеру Kubernetes.
Также вам потребуются достаточные права на создание пространства имен (namespace) в кластере Kubernetes и развертывание ресурсов в этом пространстве имен.
При установке соответствующих компонентов программного обеспечения с помощью helm вы можете настроить необходимые параметры под ваш кластер Kubernetes.

1.3 Необходимые знания

Изучите, как использовать kubectl и helm.

2. Установка зависимостей

2.1 (Опционально) Установка OpenEBS для доступного StorageClass openebs-hostpath

Если в вашем кластере Kubernetes отсутствует StorageClass для MatrixDB,
вы можете развернуть OpenEBS и использовать StorageClass openebs-hostpath в качестве хранилища для базы данных MatrixDB.

См. документацию по установке OpenEBS через Helm

Выполните

helm repo add openebs https://openebs.github.io/charts
helm repo update
helm upgrade --install openebs --namespace openebs openebs/openebs --create-namespace

чтобы создать пространство имен openebs и установить последнюю версию OpenEBS в это пространство имен.

2.2 Установка стороннего пакета зависимости cert-manager

MatrixDB зависит от cert-manager для создания и управления сертификатами и ключами.
Для корректной работы matrixdb-operator необходимо установить cert-manager в вашем кластере Kubernetes.
Как правило, на один кластер Kubernetes устанавливается только один экземпляр cert-manager.
Перед выполнением следующих шагов установки убедитесь, что в вашем кластере еще не установлен cert-manager.

Если cert-manager уже установлен, проверьте, что его версия >= 1.6.0.

См. документацию по установке cert-manager через Helm

Выполните

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set installCRDs=true

чтобы создать пространство имен cert-manager и установить последнюю версию cert-manager в это пространство имен.

3. Установка matrixdb-operator

matrixdb-operator — это инструмент для развертывания MatrixDB в кластере Kubernetes.
Чтобы развернуть MatrixDB, вам нужно установить его в кластер.

См. наш репозиторий Helm-чартов

Примечание!

matrixdb-operator и версия MatrixDB совместимы между собой, поэтому необходимо выбирать соответствующую версию инструмента.
Подробную информацию о соответствии версий см. в разделе соответствие версий MatrixDB и MatrixDB Operator

Выполните

helm repo add ymatrix https://ymatrix-data.github.io/charts
helm repo update
helm upgrade --install \
  matrixdb-operator ymatrix/matrixdb-operator \
  --namespace matrixdb-system \
  --create-namespace \
  --version 0.8.0

чтобы создать пространство имен matrixdb-system и установить последнюю версию matrixdb-operator в это пространство имен.

Примечание!

Если доменное имя вашего кластера Kubernetes отличается от значения по умолчанию cluster.local, необходимо настроить параметры установки matrixdb-operator, чтобы он использовал ваше доменное имя кластера.

Предположим, что доменное имя вашего кластера Kubernetes — custom.domain. Тогда при установке matrixdb-operator в команду helm upgrade нужно добавить следующие параметры:

--set kubernetesClusterDomain=custom.domain

После завершения установки выполните:

helm list --namespace matrixdb-system

Результат вывода будет примерно таким:

NAME                     NAMESPACE                       REVISION        UPDATED                                     STATUS          CHART                          APP VERSION
matrixdb-operator        matrixdb-system                 1               2022-04-15 17:45:52.919849 +0800 CST        deployed        matrixdb-operator-0.8.0        0.8.0

Это позволит определить версию установленного matrixdb-operator.

При развертывании базы данных необходимо убедиться, что версия matrixdb-operator, поддерживаемая образом контейнера развернутой базы данных, совпадает с установленной версией matrixdb-operator.

4. Развертывание кластера базы данных MatrixDB

4.1 Подготовка файла определения CRD для MatrixDB

Пример файла db0.yaml приведён ниже:

aapiVersion: deploy.ymatrix.cn/v1
kind: MatrixDBCluster
metadata:
  name: db0 # The name of the YMatrix cluster
spec:
  image:
    repository: matrixdb/matrixdb-community # If you are using the Enterprise Edition, you need to modify this value to your own mirroring storage.
    tag: <DB-TAG-TO-SPECIFY> # You need to modify the tag value here to select a database mirroring that can run on the version of matrixdb-operator you installed.
  master:
    enableStandby: true
    memory: "500Mi"
    cpu: "0.5"
    storageClassName: openebs-hostpath # You can choose other StorageClasses supported by your Kubernetes cluster.
    storage: "1Gi"
    workerSelector: {}
  segments:
    count: 1
    enableMirror: false
    memory: "500Mi"
    cpu: "0.5"
    storageClassName: openebs-hostpath # You can choose other StorageClasses supported by your Kubernetes cluster.
    storage: "1Gi"
    workerSelector: {}
  gate:
    memory: "100Mi"
    cpu: "0.1"
    storageClassName: openebs-hostpath # You can choose other StorageClasses supported by your Kubernetes cluster.
    storage: "1Gi"
    workerSelector: {}

Подробные сведения о конфигурации параметров см. в разделе описание файла CRD.

4.2 Подготовка пространства имен для развертывания MatrixDB

Выполните следующую команду, чтобы создать пространство имен matrixdb-ns для развертывания MatrixDB:

kubectl create namespace matrixdb-ns

4.3 Развертывание базы данных MatrixDB

После выполнения предыдущих шагов:

  • Файл определения CRD для MatrixDB, предположим, что его имя — db0.yaml.
  • Пространство имен для развертывания MatrixDB, предположим, что это matrixdb-ns.

Выполните следующую команду, чтобы развернуть базу данных, определённую в файле db0.yaml:

kubectl apply -f db0.yaml --namespace matrixdb-ns

После успешного выполнения команды можно выполнить:

kubectl get mxdb --namespace matrixdb-ns

чтобы просмотреть состояние развернутого кластера MatrixDB db0.

5. Настройка кластера

Перед использованием развернутого кластера может потребоваться настройка параметров MatrixDB для оптимизации производительности.

5.1 Использование gpconfig для настройки параметров кластера

5.1.1 Вход в мастер-узел

Команда gpconfig должна выполняться на мастер-узле, имя хоста которого имеет формат <cluster-name>-0-0.
В ранее развернутом кластере имя хоста мастер-узла — db0-0-0.

Выполните:

kubectl exec -it db0-0-0 --namespace matrixdb-ns -- sudo -u mxadmin -i

чтобы открыть оболочку (shell) в поде, где находится мастер.

5.1.2 Настройка с помощью gpconfig

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

gpconfig -l

Подробнее об использовании gpconfig см. в: документации gpconfig

5.1.3 Перезапуск базы данных

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

gpstop -a -r -M fast

5.1.4 Выход

Наконец, выполните exit, чтобы выйти из оболочки пода, где находится мастер.

6. Использование кластеров

6.1 Конфигурация по умолчанию для кластеров

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

| Имя пользователя | Пароль | |--------------------------| | mxadmin | changeme |

6.2 Просмотр развернутых сервисов

При использовании кластера необходимо определить, к какому сервису базы данных вы подключаетесь.

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

kubectl get svc --namespace matrixdb-ns

Примерный вывод:

NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
db0            ClusterIP   None             <none>        22/TCP     7d22h
db0-cylinder   ClusterIP   172.20.148.232   <none>        4637/TCP   7d22h
db0-gate       ClusterIP   None             <none>        4617/TCP   7d22h
db0-pg         ClusterIP   172.20.216.189   <none>        5432/TCP   7d22h
db0-ui         ClusterIP   172.20.157.163   <none>        8240/TCP   7d22h

Здесь db0-pg — это сервис, к которому необходимо подключаться для работы с базой данных. db0-ui — сервис, который используется при работе с пользовательским интерфейсом базы данных.

6.3 Подключение к базе данных с помощью клиента PostgreSQL 12 (замените пример IP-адреса на реальный IP-адрес)

6.3.1 Прямое подключение к сервису db0-pg

В среде с доступом к IP-адресу кластера выполните:

psql -h 172.20.216.189 -p 5432 -U mxadmin

чтобы подключиться к базе данных. (Введите запрашиваемый пароль для mxadmin)

6.3.2 Использование port-forward

Используйте kubectl port-forward для временного доступа к сервису.

6.4 Подключение к интерфейсу MatrixDB (замените пример IP-адреса на реальный IP-адрес)

6.4.1 Прямое подключение к сервису db0-ui

В среде с доступом к IP-адресу кластера откройте в браузере http://172.20.157.163:8240

Введите пароль пользователя mxadmin, чтобы войти в интерфейс.

6.4.2 Использование proxy

Proxy, созданный с помощью kubectl proxy, можно использовать для временного доступа к сервису.

6.4.3 Импорт данных с помощью Kafka в интерфейсе

См.: Импорт данных с помощью Kafka

6.5 Подключение приложений базы данных к кластеру

Метод использования аналогичен psql.

7. Управление кластерами

7.1 Получение оболочки мастер-узла

Текущий matrixdb-operator разворачивает кластер базы данных в виде нескольких StatefulSet.
Например, развертывание кластера db0 выглядит так:

$ kubectl get statefulset
NAME       READY   AGE
db0-0      2/2     9d
db0-1      2/2     9d
db0-2      2/2     9d
db0-gate   1/1     9d

Среди них все StatefulSet с именем db0-{StatefulSet serial number} являются частью кластера базы данных.

StatefulSet с порядковым номером 0 разворачивает сегмент master.
Соответствующий под db0-0-{Replication serial number} разворачивает основной сегмент master (номер репликации 0) и зеркало standby (номер репликации 1).

StatefulSet с порядковым номером, отличным от 0, разворачивает сегмент data.
Соответствующий под db0-{StatefulSet serial number}-{Replication serial number} разворачивает основной сегмент primary сегмента data (номер репликации 0) и зеркало (номер репликации 1).

Основные инструменты управления gp* и mx* должны запускаться на master.

Выполните следующую команду, чтобы получить оболочку пода, где работает master (запуск от пользователя mxadmin):

kubectl exec -n matrixdb-ns -it db0-0-0 -- sudo -u mxadmin -i

7.2 PV с данными

Данные, хранящиеся в базе данных, в конечном итоге сохраняются в PV.
Эти PV создаются по запросу PVC matrixdb-operator в кластере Kubernetes:

$ kubectl get pvc
NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
db0-data-db0-0-0      Bound    pvc-7d7fdf0c-0922-4d2a-9cdd-f72ce9cd8441   1Gi        RWO            gp2            9d
db0-data-db0-0-1      Bound    pvc-966dbad2-f7b0-4af4-b7b1-62073492833d   1Gi        RWO            gp2            9d
db0-data-db0-1-0      Bound    pvc-eaa0bd6f-d9bc-4578-aeec-4375a86d6c21   1Gi        RWO            gp2            9d
db0-data-db0-1-1      Bound    pvc-fac53281-9ffd-423e-ba71-0e3d381b3cc8   1Gi        RWO            gp2            9d
db0-data-db0-2-0      Bound    pvc-a0ddc01a-6cc7-4640-8b8e-1471ccc5a8ab   1Gi        RWO            gp2            9d
db0-data-db0-2-1      Bound    pvc-b5ee24f9-d7e6-4448-8c54-ebdb60488bcb   1Gi        RWO            gp2            9d
db0-data-db0-gate-0   Bound    pvc-ad685e25-8f18-4d30-9227-a3868bb19f90   1Gi        RWO            gp2            9d

Эти PV монтируются в каталог /mxdata соответствующего пода. Управление жизненным циклом этих PVC и PV должно осуществляться вручную администратором базы данных.

8. Часто задаваемые вопросы

8.1 Как получить образ базы данных MatrixDB?

Образ Community-версии MatrixDB размещен на DockerHub и может быть загружен напрямую.
Если вам нужен образ Enterprise-версии MatrixDB, свяжитесь с нами для получения соответствующей ссылки на скачивание,
чтобы импортировать его в собственное хранилище образов контейнеров с помощью docker или nerdctl.

Предположим, вы скачали образ matrixdb-v4.5.0.enterprise-v0.8.0.tar.gz.

Выполните следующую команду, чтобы импортировать его в локальное хранилище образов и загрузить в хранилище образов, используемое вашим кластером Kubernetes:

# Use docker load to import image files
gunzip -c matrixdb-v4.5.0.enterprise-v0.8.0.tar.gz | docker load
# The output is omitted here
... 
Loaded image: matrixdb/matrixdb-enterprise:v4.5.0.enterprise-v0.8.0

# retag mirror
docker tag matrixdb/matrixdb-enterprise:v4.5.0.enterprise-v0.8.0 \
           <your-image-repo>/matrixdb-enterprise:v4.5.0.enterprise-v0.8.0

# Push new tags to your image storage
docker push <your-image-repo>/matrixdb-enterprise:v4.5.0.enterprise-v0.8.0

# After that, when you deploy the database, you can use the above custom repo and tag in the CRD file.