Евгений Сергеевич Штольц

Облачная экосистема


Скачать книгу

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/\]//'

      [email protected]

      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: