Введение

В этой статье мы рассмотрим, как развернуть масштабируемый кластер SQL в Kubernetes. Прежде чем мы начнем, важно понять, что такое Kubernetes и некоторые детали, связанные с ним. Если вы не знаете основ, я предлагаю взглянуть на эту ссылку, чтобы начать.



Чтобы развернуть масштабируемую структуру MySQL, мы можем разбить ее на 3 части:

Создание кластера Kubernetes в DigitalOcean

Настройка оператора MySQL и базы данных

Тестирование возможностей кластера и эксперименты

Создание кластера Kubernetes в DigitalOcean

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

Я выбрал регион своего центра обработки данных как Бангалор (BLR1), но вы можете выбрать любой.

Я больше ничего не менял при создании кластера, кроме имени, которое я установил на sql-k8s-cluster.

После этого нажмите «Создать», и все готово!

Настройка кластера занимает 5 минут, в это время вы можете загрузить файл конфигурации для кластера и добавить его в каталог, в котором вы работаете. Мой файл конфигурации назывался sql-k8s-cluster-kubeconfig.yaml. После запуска кластера мы запускаем следующую команду.

cd ~/.kube && kubectl --kubeconfig="sql-k8s-cluster-kubeconfig.yaml" get nodes

Это показывает узлы, а также их детали. Вывод выглядит примерно так.

Следующим шагом является настройка оператора MySQL и нашей базы данных.

Настройка оператора MySQL и базы данных

Чтобы понять, что такое оператор MySQL, нам нужно понять, что такое оператор в Kubernetes. Оператор упаковывает, развертывает и управляет приложением Kubernetes.

Оператор MySQL

Оператор MySQL управляет настройками кластера MySQL InnoDB в кластере Kubernetes. Оператор управляет полным жизненным циклом, включая настройку и обслуживание приложения, автоматизируя обновления и резервное копирование.

Примечание. Оператор MySQL для Kubernetes в настоящее время находится в состоянии предварительного просмотра. НЕ ИСПОЛЬЗОВАТЬ В ПРОИЗВОДСТВЕ — оператор MySQL на GitHub.

Что такое ИнноДБ?

Справочное руководство MySQL говорит:

InnoDB — это механизм хранения общего назначения, который сочетает в себе высокую надежность и высокую производительность. В MySQL 5.6 InnoDB является механизмом хранения MySQL по умолчанию.

По сути, это программный компонент MySQL, который обрабатывает операции SQL, такие как создание, чтение, обновление и удаление таблиц.

Сначала мы устанавливаем оператор MySQL отсюда и выполняем следующую команду. Чтобы это работало, убедитесь, что установлен Helm (менеджер пакетов, работающий поверх K8s).

helm install mysql-operator helm/mysql-operator --namespace mysql-operator --create-namespace --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml

Вывод должен быть примерно таким.

Пространства имен

В Kubernetes пространства имен позволяют изолировать ресурсы в пределах одного кластера. Имена ресурсов должны быть уникальными внутри пространства имен, но не между пространствами имен.

Затем мы создаем пространство имен с именем sql-cluster, выполнив следующую команду.

kubectl create namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml

Чтобы создать кластер MySQL InnoDB с использованием kubectl, нам нужно создать секрет, содержащий учетные данные. Выполните следующую команду в своем терминале и установите пароль по вашему выбору.

kubectl create secret generic mypwds \
        --from-literal=rootUser=root \
        --from-literal=rootHost=% \
        --from-literal=rootPassword="your secret password, REPLACE ME"

Следующим шагом будет запись конфигурации нашего кластера. Мы создаем файл с именем config.yaml и вводим следующие данные.

apiVersion: mysql.oracle.com/v2alpha1
kind: InnoDBCluster
metadata:
    name: sql-cluster
    namespace: sql-cluster
spec:
    secretName: mypwds
    instances: 3
    router:
        instances: 1

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

kubectl apply -f config.yaml --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml

Чтобы просмотреть состояние нашего кластера и увидеть, как запускаются модули, мы выполняем следующую команду и наблюдаем магию. Это занимает около 5 минут, так что берите кофе! ☕️

kubectl get innodbcluster --watch --namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml

Чтобы получить сведения о службе и посмотреть, на каком порту доступен наш кластер MySQL, выполните следующие команды.

kubectl get service sql-cluster  --namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
kubectl describe service sql-cluster  --namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml

Чтобы получить доступ к кластеру MySQL, мы перенаправляем его на порт и обращаемся к нему через командную строку. Мы также можем использовать клиенты MySQL, такие как DataGrip или PHPMyAdmin. Выполняем следующую команду и замечаем, что кластер доступен через порт 6446.

kubectl port-forward service/sql-cluster mysql  --namespace sql-cluster --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml

Теперь мы можем получить доступ к нашему кластеру, который находится на порту 6446, выполнив приведенную ниже команду. Нам будет предложено ввести пароль, который мы установили ранее.

mysql -h127.0.0.1 -P6446 -uroot -p

Сделав это, мы успешно создали наш кластер MySQL с помощью оператора MySQL. Теперь мы рассмотрим добавление данных и тестирование возможностей нашего кластера Kubernetes.

Тестирование возможностей кластера и эксперименты

Чтобы увидеть, насколько устойчив и масштабируем наш кластер, нам нужны некоторые данные.

Мы создаем таблицу с именем students, в которой хранятся id, name и department учащегося.

CREATE TABLE students (id INT(3) PRIMARY KEY, name VARCHAR(20) NOT NULL, dept VARCHAR(5) NOT NULL);
INSERT INTO user (1, "Anjaneya", "CSE");
SELECT * FROM students;

При выполнении получаем следующее.

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

Устойчивость

Сначала нам нужно определить модуль, в котором хранится приведенная выше таблица. Мы идентифицируем его, определяя, какая переменная в MySQL имеет имя переменной, установленное как hostname.

SHOW VARIABLES WHERE Variable_name = 'hostname';

Я получил ответ sql-cluster-3, но это зависит от каждого пользователя. Не волнуйтесь, если вы получите какое-то другое имя.

Теперь мы удаляем этот модуль, выполнив следующую команду (в другом окне терминала).

kubectl delete -n sql-cluster pod sql-cluster-3

В нашем предыдущем окне терминала мы можем наблюдать за изменениями в реальном времени.

Мы видим, как сервер MySQL теряет соединение, определяет, что соединение потеряно, а затем повторно подключается к другому экземпляру и показывает нам наши данные, как будто ничего не произошло.

Масштабируемость

Чтобы определить, является ли наш кластер масштабируемым, нам нужно изменить файл конфигурации (config.yaml).

Давайте изменим количество экземпляров с 3 на 4.

apiVersion: mysql.oracle.com/v2alpha1
kind: InnoDBCluster
metadata:
    name: sql-cluster
    namespace: sql-cluster
spec:
    secretName: mypwds
    instances: 4
    router:
        instances: 1

Теперь давайте посмотрим, как наш кластер kubernetes запускает новые экземпляры. Он понимает, что фактическое состояние отличается от желаемого состояния, и немедленно начинает работать над достижением желаемого состояния.

Не забудьте применить изменения перед просмотром!

kubectl apply -f config.yaml --kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml
kubectl get innodbcluster --watch  --namespace sql-cluster kubeconfig ~/.kube/sql-k8s-cluster-kubeconfig.yaml

При этом мы успешно развернули наш кластер MySQL и убедились, что он отказоустойчив и масштабируем!



config.yaml, который использовался в проекте, можно найти в репозитории GitHub.

Ресурсы