europe-west2-b 35.246.122.1 n1-standard-1 3 RUNNING
Выполним установку базы данных. Для этого нам понадобится cockroachdb-statefulset.yaml с описанием двух сервисов: PodDisruptionBudget и StatefulSet. StatefulSet – разновидность deploymets, поды которого при пересоздании не меняют своих сетевых наименований и идентификатора для хранилища, а при масштабировании и обновлении, выполняя rolling updates, на пересоздаваемых подах отравляет приложению сигналы, что под будет пересоздан. Это важно, так как в случае с StateLess (без сохранения состояния) приложением, например, Nginx просто отдающего статику, при его жёстком выключении и последующем включении, не вызовет никаких проблем, если он будет перенесён на другой сервер, у него будет другой IP-адрес, мы лишь потеряем несколько соединений, но чтобы их не потерять, трафик должен был отключить входной балансировщик. С StateFull ситуация намного сложнее. В простейшем случае, если у нас один инстанс StateFull, то перенос его на другой сервер означает потерю диска, а от база данных после перезагрузки будет пустой. Наши поды используют диск объёмом 100G, что хорошо, так как при падении нод данные сохраняются:
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl get pvc
NAME VOLUME CAPACITY
datadir-cockroachdb-0 pvc-c8ee368b-9c38-11ea-8b36-42010a9a006f 100Gi
datadir-cockroachdb-1 pvc-c8f2954c-9c38-11ea-8b36-42010a9a006f 100Gi
datadir-cockroachdb-2 pvc-c8fb011b-9c38-11ea-8b36-42010a9a006f 100Gi
datadir-cockroachdb-3 pvc-5bca0229-9c6e-11ea-8b36-42010a9a006f 100Gi
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl get pv pvc-c8ee368b-9c38-11ea-8b36-42010a9a006f \
–o json | jq '.spec.capacity.storage'
"100Gi"
С кластером StateFull ситуация ещё сложнее – реплики не смогут сами найти новый инстанс по IP-адресу, отличному от того, который был объявлен при инициализации. Для этого StatefulSet сохраняет название пода, тем самым сохраняя DNS-адрес внутри Kubernetes кластера, тем самым, для кластера базы данных перезагрузка пода означает всего лишь временную его недоступность. Наш StatefulSet имеет replicas: 3 и создаст 3 пода.
dev_essch@cloudshell:~ (cockroachdb-1)$ curl -O \
https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cockroachdb-statefulset.yaml
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl create -f cockroachdb-statefulset.yaml
service/cockroachdb-public created
service/cockroachdb created
poddisruptionbudget.policy/cockroachdb-budget created
statefulset.apps/cockroachdb created
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl get pods
NAME READY STATUS RESTARTS
cockroachdb-0 0/1 Running 0
cockroachdb-1 0/1 Running 0
cockroachdb-2 0/1 Running 0
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl get persistentvolumes
NAME CAPACITY CLAIM
pvc-9527ba48-9c21-11ea-b1d0-42010a9a00c3 100Gi default/datadir-cockroachdb-0
pvc-9534680b-9c21-11ea-b1d0-42010a9a00c3 100Gi default/datadir-cockroachdb-1
pvc-954e29ce-9c21-11ea-b1d0-42010a9a00c3 100Gi default/datadir-cockroachdb-2
Мы создали ноды и поды. Теперь, нужно создать реплики. Для этого есть команда cockroach init –insecure –host=cockroachdb-0.cockroachdb", которая запускается с помощью:
dev_essch@cloudshell:~ (cockroachdb-1)$ curl https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cluster-init.yaml
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl create -f cluster-init.yaml
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl get pods
NAME READY STATUS RESTARTS AGE
cluster-init-wgbjm 0/1 Completed 0 15s
cockroachdb-0 1/1 Running 0 61s
cockroachdb-1 1/1 Running 0 61s
cockroachdb-2 1/1 Running 0 61s
Нам нужно развернуть базу данных на нодах и сформировать кластер – то есть совместную работу нод, как единое целое. Для этого, дадим права нодам ходить к друг-другу от лица администратора:
dev_essch@cloudshell:~ (cockroachdb-1)$ gcloud info \
| grep Account | grep -P \-o '\[\C+\]' | sed 's/\[//' | sed 's/\]//'
dev_essch@cloudshell:~ (cockroachdb-1)$ echo $USER
dev_essch
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl create clusterrolebinding \
$USER-cluster-admin-binding \
–-clusterrole=cluster-admin \
–-user=$(gcloud info | grep Account | grep -P -o '\[\C+\]' | sed 's/\[//' | sed 's/\]//')
clusterrolebinding.rbac.authorization.Kubernetes.io/dev_essch-cluster-admin-binding created
dev_essch@cloudshell:~ (cockroachdb-1)$ kubectl describe \
clusterrolebinding.rbac.authorization.Kubernetes.io/dev_essch-cluster-admin-binding
Name: