0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: базы данных, mysql, бд, k8s, gcloud sql, администрирование баз данных</p>
1
<p>Теги: базы данных, mysql, бд, k8s, gcloud sql, администрирование баз данных</p>
2
<p>Задача перехода на облачную инфраструктуру в последнее время появляется уже практически в любой компании. Появилась такая задача и у меня.</p>
2
<p>Задача перехода на облачную инфраструктуру в последнее время появляется уже практически в любой компании. Появилась такая задача и у меня.</p>
3
<p>Суть моего маленького проекта сводилась к следующему: - развернуть кубернетес кластер; - определиться с размещением базы. База - mysql; - организовать поддержку версионности структуры БД; - запустить контейнер с приложением, которое будет цепляться и работать с БД.</p>
3
<p>Суть моего маленького проекта сводилась к следующему: - развернуть кубернетес кластер; - определиться с размещением базы. База - mysql; - организовать поддержку версионности структуры БД; - запустить контейнер с приложением, которое будет цепляться и работать с БД.</p>
4
<p>В качестве облака был выбран<strong>gcloud</strong>.</p>
4
<p>В качестве облака был выбран<strong>gcloud</strong>.</p>
5
<p>Какое-то время я выбирал между развёртыванием mysql HA от<a>Presslabs</a>и gcloud sql.</p>
5
<p>Какое-то время я выбирал между развёртыванием mysql HA от<a>Presslabs</a>и gcloud sql.</p>
6
<p>В итоге победил gcloud sql, т. к работа с ним оказалась проще, понятнее и дешевле.</p>
6
<p>В итоге победил gcloud sql, т. к работа с ним оказалась проще, понятнее и дешевле.</p>
7
<p>Чтобы создать инстанс базы, есть два пути: - web-консоль; - командная строка через gcloud.</p>
7
<p>Чтобы создать инстанс базы, есть два пути: - web-консоль; - командная строка через gcloud.</p>
8
<p>GKE может подключаться к sql-инстансу двумя путями: - на публичный адрес через proxy-контейнер; - на приватный адрес через VPC.</p>
8
<p>GKE может подключаться к sql-инстансу двумя путями: - на публичный адрес через proxy-контейнер; - на приватный адрес через VPC.</p>
9
<p>Я выбрал второй вариант, потому что не люблю, когда база торчит публичным IP-адресом в сеть.</p>
9
<p>Я выбрал второй вариант, потому что не люблю, когда база торчит публичным IP-адресом в сеть.</p>
10
<p>Для начала подготавливаемся к работе с командной строкой: - авторизуемся; - выставляем нужный проект; - выбираем географическую зону, в которой будем работать.</p>
10
<p>Для начала подготавливаемся к работе с командной строкой: - авторизуемся; - выставляем нужный проект; - выбираем географическую зону, в которой будем работать.</p>
11
gcloud auth gcloud projects list gcloud config set project <your_project_id> gcloud config set compute/zone europe-north1-a<p>Создаём VPC-сеть:</p>
11
gcloud auth gcloud projects list gcloud config set project <your_project_id> gcloud config set compute/zone europe-north1-a<p>Создаём VPC-сеть:</p>
12
gcloud compute networks create my-network \ --subnet-mode=auto \ --bgp-routing-mode=regional<p>Создаём инстанс базы c репликой, которая подключена к нужной сети. Опция --no-assign-ip отключает публичный адрес. Включаем<strong>servicenetwroking</strong>:</p>
12
gcloud compute networks create my-network \ --subnet-mode=auto \ --bgp-routing-mode=regional<p>Создаём инстанс базы c репликой, которая подключена к нужной сети. Опция --no-assign-ip отключает публичный адрес. Включаем<strong>servicenetwroking</strong>:</p>
13
gcloud beta sql instances create my-master --failover-replica-name my-slave \ --tier db-n1-standard-1 --enable-bin-log --no-assign-ip \ --network=my-network gcloud services enable servicenetworking.googleapis.com --project=< ид проекта><p>Данная команда отрабатывает, но не активировалась VPC. В итоге, инстанс я создал через веб-консоль с нужной сетью. Затем я создал пользователя и базу для коннекта:</p>
13
gcloud beta sql instances create my-master --failover-replica-name my-slave \ --tier db-n1-standard-1 --enable-bin-log --no-assign-ip \ --network=my-network gcloud services enable servicenetworking.googleapis.com --project=< ид проекта><p>Данная команда отрабатывает, но не активировалась VPC. В итоге, инстанс я создал через веб-консоль с нужной сетью. Затем я создал пользователя и базу для коннекта:</p>
14
gcloud sql users set-password root --host % --instance my-master --password myPASS gcloud sql users create myuser --host=% --instance=my-master --password=User#19 gcloud sql databases create mydb --instance=my-master<p>Затем я создал gke-кластер в той же сети: - создаём кластер (из одной ноды); - устанавливаем kubectl; - прописываем доступы для kubectl; - смотрим информацию по кластеру.</p>
14
gcloud sql users set-password root --host % --instance my-master --password myPASS gcloud sql users create myuser --host=% --instance=my-master --password=User#19 gcloud sql databases create mydb --instance=my-master<p>Затем я создал gke-кластер в той же сети: - создаём кластер (из одной ноды); - устанавливаем kubectl; - прописываем доступы для kubectl; - смотрим информацию по кластеру.</p>
15
gcloud container clusters create my-cluster \ --network=my-network --num-nodes=1 \ --enable-ip-alias \ --cluster-ipv4-cidr=/16 \ --services-ipv4-cidr=/22 gcloud container cluster list gcloud components install kubectl gcloud container clusters get-credentials my-cluster kubectl cluster-info kubectl get nodes kubectl get pods kubectl get services<p>Смотрим выданный IP-адрес:</p>
15
gcloud container clusters create my-cluster \ --network=my-network --num-nodes=1 \ --enable-ip-alias \ --cluster-ipv4-cidr=/16 \ --services-ipv4-cidr=/22 gcloud container cluster list gcloud components install kubectl gcloud container clusters get-credentials my-cluster kubectl cluster-info kubectl get nodes kubectl get pods kubectl get services<p>Смотрим выданный IP-адрес:</p>
16
gcloud beta sql instances list<p>Ну и запускаем тестовый pod в кубере для проверки работы коннекта к базе:</p>
16
gcloud beta sql instances list<p>Ну и запускаем тестовый pod в кубере для проверки работы коннекта к базе:</p>
17
kubectl run -it my-client --image=arey/mysql-client -- -h <instance private ip> -u \ myuser -p'User#19'
17
kubectl run -it my-client --image=arey/mysql-client -- -h <instance private ip> -u \ myuser -p'User#19'