Как запустить MySQL в Kubernetes с оператором Oracle
Поддержка Kubernetes для приложений с отслеживанием состояния значительно улучшилась за последние несколько лет. Теперь можно разместить базу данных внутри вашего кластера, что позволяет ей пользоваться той же масштабируемостью, что и другие ваши рабочие нагрузки.
MySQL — один из самых популярных движков реляционных баз данных, и теперь он дополнен официальным оператором Kubernetes. Проект с открытым исходным кодом под руководством Oracle предоставляет простой способ создания управляемых кластеров MySQL в Kubernetes.
В этой статье вы узнаете, как установить оператор и приступить к подготовке базы данных. Оператор автоматически создает службы, чтобы приложения в других ваших контейнерах могли подключаться к MySQL.
Что такое оператор MySQL?
Оператор Oracle MySQL — это компонент, который запускается внутри вашего кластера для автоматизации инициализации базы данных. Вам не нужен оператор для использования MySQL в Kubernetes — вы можете развернуть официальный образ контейнера самостоятельно, используя StatefulSet. Однако этот подход является громоздким, так как требует создания и поддержки длинных файлов манифеста для создания надежной среды.
Оператор предоставляет набор пользовательских ресурсов, которые вы можете использовать для создания своих баз данных. При добавлении объекта InnoDBCluster
в кластер Kubernetes оператору предлагается настроить для вас StatefulSets, хранилище и сеть. Он также автоматизирует обновления и резервное копирование, что значительно снижает нагрузку на администраторов.
Установка оператора MySQL
Включенная диаграмма Helm — это самый простой способ установить оператор в вашем кластере. Файлы манифеста доступны в качестве альтернативы, если в вашей среде нет Helm.
Сначала добавьте оператор в список репозиториев Helm:
$ helm repo add mysql-operator https://mysql.github.io/mysql-operator/
Затем обновите базу данных репозитория Helm, чтобы он обнаружил доступные диаграммы:
$ helm repo update
Теперь используйте следующую команду, чтобы установить оператор в новое пространство имен с именем mysql-operator
:
$ helm install mysql-operator mysql-operator/mysql-operator \ --namespace mysql-operator \ --create-namespace NAME: mysql-operator LAST DEPLOYED: Sat Oct 29 15:00:26 2022 NAMESPACE: mysql-operator STATUS: deployed REVISION: 1 TEST SUITE: None
Процесс может занять несколько секунд.
Создание секрета учетных данных корневого пользователя
Каждый создаваемый вами кластер базы данных должен сопровождаться секретом Kubernetes, который содержит учетные данные для пользователя root MySQL. Оператор создаст привилегированную учетную запись с именем пользователя и паролем, указанными в секрете.
Скопируйте следующий манифест YAML и измените значение поля rootPassword
на безопасное. Также измените имя пользователя и настройки хоста пользователя, если это применимо к вашей ситуации. Помните, что указанная здесь учетная запись будет иметь полный контроль над MySQL; вы должны настроить отдельных пользователей для своих приложений позже, используя обычную оболочку MySQL.
apiVersion: v1 kind: Secret metadata: name: mysql-root-user stringData: rootHost: "%" rootUser: "root" rootPassword: "P@$$w0rd"
Сохраните файл как secret.yaml
. Теперь используйте Kubectl, чтобы добавить секрет в свой кластер:
$ kubectl apply -f secret.yaml
secret/mysql-root-user created
Создание базового кластера
Затем создайте новый файл YAML с именем mysql.yaml
и скопируйте следующее содержимое:
apiVersion: mysql.oracle.com/v2 kind: InnoDBCluster metadata: name: mysql-cluster spec: secretName: mysql-root-user instances: 3 tlsUseSelfSigned: true router: instances: 1
Это определяет объект с использованием пользовательского ресурса InnoDBCluster
, предлагаемого оператором MySQL. Применение манифеста к вашему кластеру создаст новую базу данных MySQL с автоматически настроенной репликацией. Прежде чем продолжить, проверьте и измените следующие свойства в манифесте:
spec.secretName
— должно совпадать сmetadata.name
секрета, который вы создали ранее. Указанный секрет будет прочитан для настройки учетной записи пользователя root MySQL.spec.instances
— определяет, сколько реплик MySQL (модулей) нужно запустить. В настоящее время поддерживается до 10 реплик.spec.tlsUseSelfSigned
— в этом примере для поля установлено значениеtrue
, чтобы использовать включенный самозаверяющий сертификат TLS. При желании вы можете указать свой собственный сертификат с помощью секрета Kubernetes, задав поляspec.tlsSecretName
/spec.tlsCASecretName
.spec.router.instances
— компонент MySQL Router отвечает за направление служебного трафика между доступными репликами MySQL. Это поле определяет, сколько экземпляров маршрутизатора нужно запустить. Использование нескольких экземпляров повысит производительность и отказоустойчивость в условиях большого трафика.
Используйте Kubectl, чтобы применить манифест и создать кластер базы данных:
$ kubectl apply -f mysql.yaml
innodbcluster.mysql.oracle.com/mysql-cluster created
Процесс инициализации MySQL может занять пару минут. Оператор использует несколько контейнеров инициализации для настройки учетных записей пользователей и настройки каталога данных MySQL. Подождите несколько секунд перед запуском kubectl get pods
, чтобы проверить, что выполняется:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-cluster-0 2/2 Running 0 2m
mysql-cluster-1 2/2 Running 0 2m
mysql-cluster-2 2/2 Running 0 2m
mysql-cluster-router-6b68f9b5cb-wbqm5 1/1 Running 0 2m
Все три реплики MySQL и один экземпляр маршрутизатора находятся в состоянии Running
. Теперь база данных готова к использованию.
Подключение к вашему кластеру
Оператор MySQL создает службу Kubernetes, которая направляет трафик из модулей вашего приложения в базу данных. Службе назначается имя хоста в следующем формате:
<cluster-name>.<namespace-name>.svc.cluster.local
Правильное имя хоста для примера кластера, показанного выше, — mysql-cluster.default.svc.cluster.local
. Настройте свои приложения для подключения к MySQL по этому адресу, используя порт 3306 и учетные данные пользователя, которые вы указали в секрете.
Доступ к вашей базе данных извне
Вы можете получить доступ к MySQL из-за пределов вашего кластера, используя возможности переадресации портов Kubectl. Выполните следующую команду, чтобы открыть новый сеанс переадресации портов:
$ kubectl port-forward service/mysql-cluster 3306
Замените mysql-cluster
именем InnoDBCluster
, к которому вы хотите подключиться. Теперь вы можете использовать свои локальные инструменты для взаимодействия с вашей базой данных:
$ mysql -h127.0.0.1 -u root -p
Нажатие Ctrl+C в окне терминала с командой kubectl port-forward
закроет соединение.
Настройка параметров сервера MySQL
Вы можете указать любые параметры файла конфигурации MySQL, которые требуются вашему приложению, установив поле spec.mycnf
в манифесте вашего объекта InnoDBCluster
:
apiVersion: mysql.oracle.com/v2 kind: InnoDBCluster spec: # ... mycnf: | [mysqld] max_connections=500 innodb_ft_min_token_size=5
Оператор будет использовать значение этого поля для записи файла my.cnf
в файловую систему модулей вашей базы данных.
Настройка емкости хранилища
Оператор автоматически создает Persistent Volume (PV) и Persistent Volume Claim (PVC) для хранения данных вашей базы данных. По умолчанию предоставляется 2Gi хранилища.
Это можно изменить с помощью поля манифеста datadirVolumeClaimTemplate
, которое позволяет переопределить свойства ресурса PVC, созданного оператором. Задайте для свойства resources.requests.storage
требуемую емкость.
apiVersion: mysql.oracle.com/v2 kind: InnoDBCluster spec: # ... datadirVolumeClaimTemplate: resources: requests: storage: 10Gi
Вы должны установить это значение достаточно высоким, чтобы у ваших данных было достаточно места для роста в будущем. Оператор не поддерживает изменение размера тома на месте, поэтому вы увидите сообщение об ошибке, если попытаетесь увеличить емкость в будущем. Переход на больший том потребует ручной миграции.
Закрепление версии MySQL
Вы можете закрепить конкретную версию MySQL с помощью полей spec.version
и spec.router.version
. Это предотвратит непреднамеренное автоматическое обновление. Выберите одну и ту же версию для своих модулей MySQL и экземпляров маршрутизатора, чтобы гарантировать совместимость.
apiVersion: mysql.oracle.com/v2 kind: InnoDBCluster spec: # ... version: 8.0.31 router: instances: 1 version: 8.0.31
Краткое содержание
MySQL Operator от Oracle предоставляет удобный механизм для запуска баз данных MySQL в кластере Kubernetes. Вы можете подготовить новые реплицированные базы данных, создав объекты InnoDBCluster
. Это намного проще, чем вручную создавать StatefulSet и сервисы, предоставляющие обычные контейнеры MySQL.
Использование оператора не мешает вам управлять MySQL или вашей средой Kubernetes. Вы можете настроить свои модули, указав свои собственные свойства манифеста в поле spec.podSpec
и используя свой собственный файл конфигурации MySQL, выполнив шаги, показанные выше. Оператор также предлагает встроенную поддержку резервного копирования, позволяющую копировать базу данных во внешнее хранилище по повторяющемуся расписанию.