Осваиваю кубер: GKE + cloud sql

Задача перехода на облачную инфраструктуру в последнее время появляется уже практически в любой компании. Появилась такая задача и у меня.

Суть моего маленького проекта сводилась к следующему: — развернуть кубернетес кластер; — определиться с размещением базы. База — mysql; — организовать поддержку версионности структуры БД; — запустить контейнер с приложением, которое будет цепляться и работать с БД.

В качестве облака был выбран gcloud.

Какое-то время я выбирал между развёртыванием mysql HA от Presslabs и gcloud sql.

В итоге победил gcloud sql, т. к работа с ним оказалась проще, понятнее и дешевле.

Чтобы создать инстанс базы, есть два пути: — web-консоль; — командная строка через gcloud.

GKE может подключаться к sql-инстансу двумя путями: — на публичный адрес через proxy-контейнер; — на приватный адрес через VPC.

Я выбрал второй вариант, потому что не люблю, когда база торчит публичным IP-адресом в сеть.

Для начала подготавливаемся к работе с командной строкой: — авторизуемся; — выставляем нужный проект; — выбираем географическую зону, в которой будем работать.

gcloud auth
gcloud projects list
gcloud config set project <your_project_id>
gcloud config set compute/zone europe-north1-a

Создаём VPC-сеть:

gcloud compute networks create my-network \
    --subnet-mode=auto \
    --bgp-routing-mode=regional

Создаём инстанс базы c репликой, которая подключена к нужной сети. Опция --no-assign-ip отключает публичный адрес. Включаем servicenetwroking:

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=< ид проекта>

Данная команда отрабатывает, но не активировалась VPC. В итоге, инстанс я создал через веб-консоль с нужной сетью. Затем я создал пользователя и базу для коннекта:

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

Затем я создал gke-кластер в той же сети: — создаём кластер (из одной ноды); — устанавливаем kubectl; — прописываем доступы для kubectl; — смотрим информацию по кластеру.

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

Смотрим выданный IP-адрес:

gcloud beta sql instances list

Ну и запускаем тестовый pod в кубере для проверки работы коннекта к базе:

kubectl run -it my-client --image=arey/mysql-client -- -h <instance private ip> -u \ 
myuser -p'User#19'