Руководство по использованию Tarantool Cartridge в Kubernetes

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.


Привет, меня зовут Иван, и сегодня я расскажу как управлять приложением Tarantool Cartridge в кластере Kubernetes при помощи Tarantool Operator. Мы пройдем полный цикл от разработки до эксплуатации:


  • Подготовим инструменты
  • Создадим тестовое приложение
  • Упакуем его в docker
  • Установим приложение в kubernetes кластер
  • Маштабируем приложение
  • Обновим версию приложения
  • Разберем возможные проблемы
  • Кастомизируем наш кластер
  • Разберемся с установкой в закрытом контуре

Устанавливаем инструменты


Нам потребуется:


  1. cartridge-cli — утилита для работы с cartridge-приложениями. Нам нужна версии 2.3.0 или выше.
    Инструкция по установке здесь. Если установка прошла успешно, в системе появится утилита cartridge.


    $ cartridge version
    ---
    Tarantool Cartridge CLI v2.3.0 linux/amd64 commit: 06a5dad

  2. kubectl — инструмент для управления кластерами kubernetes. Нам потребуется релиз версии 1.16 или выше.
    Инструкцию по установке можно найти тут.


    $ kubectl version --client
    ---
    Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:36:53Z",     GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

  3. helm — пакетный менеджер для приложений Kubernetes.
    Нам понадобится релиз версии 3.3.x. Инструкцию по установке можно найти здесь.


    $ helm version
    ---
    version.BuildInfo{Version:"v3.3.1", GitCommit:"249e5215cde0c3fa72e27eb7a30e8d55c9696144", GitTreeState:"clean", GoVersion:"go1.14.7"}

  4. minikube — инструмент для создания локального кластера Kubernetes. Нам нужен версии 1.12 и выше. Как установить можно прочитать тут.


    $ minikube version
    ---
    minikube version: v1.12.3
    commit: 2243b4b97c131e3244c5f014faedca0d846599f5-dirty

  5. kind (необязательно) — еще один инструмент для создания локального кластера. Можно использовать вместо minikube. Инструкция по установке здесь.


    $ kind version
    kind v0.9.0 go1.15.2 linux/amd64


Создаем приложение


Создадим приложение test-app утилитой cartridge-cli:


$ cartridge create --name test-app
---
   • Create application test-app
   • Generate application files
   • Initialize application git repository
   • Application "test-app" created successfully

В директории test-app получим приложение, созданное из шаблона.


$ ls test-app
---
...

instances.yaml
test-app-scm-1.rockspec
...

Приложение полностью функционально и умеет отвечать на HTTP GET запрос /hello.


NOTE проверьте версию cartridge в test-app-scm-1.rockspec:


dependencies = {
    ...
    'cartridge == 2.3.0-1',
    ...
}

Версия cartridge должна быть >= 2.3.0. С этой версии cartridge ожидает, когда инстанс станет доступен по своему DNS-адресу при запуске, это нужно для корректной работы в Kubernetes. Для версий ниже 2.3.0 приложение нужно дорабатывать и реализовывать ожидание самостоятельно. Пример, как это сделать, есть по ссылке.


Собираем приложение


Соберем docker-образ с помощью cartridge-cli:


$ cartridge pack docker --tag vanyarock01/test-app:0.1.0-0-g68f6117
---
...
Running in 0ffbd57a0edf
Removing intermediate container 0ffbd57a0edf
 ---> aceef7a3be63
 ---> aceef7a3be63
Successfully built aceef7a3be63
Successfully tagged test-app:0.1.0-0-g68f6117
   • Created result image test-app:0.1.0-0-g68f6117
   • Application was successfully packed

Загружаем образ в registry:


$ docker push vanyarock01/test-app:0.1.0-0-g68f6117
---
The push refers to repository [docker.io/vanyarock01/test-app]
b327b35afe0a: Pushed 
de30ed3f758d: Pushed 
3c8808fbd85d: Pushed 
291f6e44771a: Pushed 
0.1.0-0-g275baa8: digest: sha256:5b3b92a615b34c7f132e72e2d61f692cf2091ca28be27bbbfed98106398d1c19 size: 1160

NOTE Вы должны быть авторизированы через docker login и иметь права доступа к целевому registry.


Создаем кластер Kubernetes


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


Minikube


Создадим кластер Kubernetes версии 1.16.4 с объемом выделенного RAM 4Gb (рекомендуемые параметры).


$ minikube start --kubernetes-version v1.16.4 --memory 4096
---
  minikube v1.12.3 on Ubuntu 18.10
  Automatically selected the docker driver. Other choices: kvm2, virtualbox
  Starting control plane node minikube in cluster minikube
  Creating docker container (CPUs=2, Memory=4096MB) ...
  Preparing Kubernetes v1.16.4 on Docker 19.03.8 ...
  Verifying Kubernetes components...
  Enabled addons: default-storageclass, storage-provisioner
  Done! kubectl is now configured to use "minikube"

Убедимся, что кластер в порядке, дождавшись статуса Ready.


$ kubectl get nodes
---
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   21m   v1.16.4

Kind — альтернатива minikube


$ kind create cluster  --image kindest/node:v1.16.4
---
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.16.4)  
 ✓ Preparing nodes   
 ✓ Writing configuration  
 ✓ Starting control-plane ️ 
 ✓ Installing CNI  
 ✓ Installing StorageClass  
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next?   Check out https://kind.sigs.k8s.io/docs/user/quick-start/

Проверим статус кластера.


$ kubectl get nodes
---
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   48s   v1.16.4

Запускаем приложение


Устанавливать оператор и разворачивать кластер будем через helm. Чарты опубликованы в нашем репозитории, добавим его:


$ helm repo add tarantool https://tarantool.github.io/tarantool-operator

В репозитории доступно два чарта:


$ helm search repo tarantool
---
NAME                            CHART VERSION   APP VERSION DESCRIPTION                  
tarantool/tarantool-operator    0.0.8           1.16.0      kubernetes tarantool operator
tarantool/cartridge             0.0.8           1.0         A Helm chart for tarantool 

Чарт tarantool/tarantool-operator устанавливает и настраивает оператор, который управляет кластерами tarantool cartridge.


Чарт tarantool/cartridge — это шаблон для создания кластеров tarantool cartridge. С настройками по умолчанию этот чарт развернет example-приложение из 3 инстансов. Чарт работает только в паре с tarantool-operator'ом.


NOTE Используйте одинаковые версии чартов. Если ставите чарт оператора версии 0.0.8, ставьте cartridge чарт версии 0.0.8.


Установим tarantool-operator в пространство имен tarantool.


$ helm install tarantool-operator tarantool/tarantool-operator --namespace tarantool --create-namespace --version 0.0.8
---
NAME: tarantool-operator
LAST DEPLOYED: Sun Sep 13 23:29:28 2020
NAMESPACE: tarantool
STATUS: deployed
REVISION: 1
TEST SUITE: None

Дождемся, пока под с оператором перейдет в рабочее состояние:


$ kubectl get pods -n tarantool
---
NAME                                 READY   STATUS    RESTARTS   AGE
tarantool-operator-xxx-yyy   0/1     Pending   0          3s

А пока под с оператором поднимается, давайте поговорим о том, что вообще такое Tarantool Operator и зачем он нужен.


Tarantool Operator


Это kubernetes-приложение, которое умеет управлять ресурсами Tarantool Cartridge.


Что это означает для нас?


Нам не нужно знать, как выполнять административные действия, такие как join узла или создание репликасета. Как это делать лучше знает оператор, и если ему сообщить желаемую конфигурацию системы, он начнет приводить кластер в нужное состояние.


Сам по себе Tarantool Operator является реализацией паттерна проектирования Kubernetes Operator. Он предписывает автоматизировать работу с кастомными ресурсами при помощи контроллеров, реагирующих на различные изменения.


Разобраться с операторами могут помочь эти ссылки:


  • Официальное описание от kubernetes.io
  • Обзор от создателей паттерна (CoreOS)
  • Статья на Хабре про разработку оператора от Lamoda

Тем временем, наш под перешел в состояние Running. Следующим шагом будет установка приложения при помощи helm чарта tarantool/cartridge, для которого нужно подготовить описание системы.


Поднимаем кластер Tarantool Cartridge


Подняли кластер, установили оператор, можем переходить к запуску приложения.


Приложение будем разворачивать с помощью чарта tarantool/cartridge. Это шаблон, запустите его с настройками по умолчанию и получите наше example-приложение из 3 инстансов. Определите свои настройки и сможете развернуть любое приложение на Tarantool Cartrdige, любой топологии.


Зададим вот такие настройки в файле values.yaml. В комментариях есть пояснения, что они означают:


# Название среды и название кластера.
ClusterEnv: dev
ClusterName: test-app

# Docker-образ, из которого создаем контейнеры
image:
  repository: vanyarock01/test-app
  tag: 0.1.0-0-g68f6117
  pullPolicy: IfNotPresent

# Топология кластера, включающая в себя описание количества
# и характеристик репликасетов. Описывается в разделе RoleConfig

# Допустим, мы хотим создать кластер, содержащий два типа репликасетов:
# routers и storages
RoleConfig:
  - RoleName: routers  # Название типа репликасетов
    ReplicaCount: 1    # Количество реплик в репликасете
    ReplicaSetCount: 1 # Количество репликасетов у данной роли
    DiskSize: 1Gi      # Размер персистентного хранилища
    CPUallocation: 0.1 # Часть vCPUs выделенного под каждый контейнер
    MemtxMemoryMB: 256 # Количество RAM выделяемого под каждый контейнер
    RolesToAssign:     # Роли cartridge
      - app.roles.custom
      - vshard-router

  - RoleName: storages
    ReplicaCount: 2
    ReplicaSetCount: 1
    DiskSize: 1Gi
    CPUallocation: 0.1
    MemtxMemoryMB: 256
    RolesToAssign:
      - app.roles.custom
      - vshard-storage

На основе такой конфигурации получим:


  1. Кластер Tarantool Cartridge, который называется test-app.
  2. В кластере два репликасета: routers и storages.
  3. В репликасете routers один инстанс Tarantool'a.
  4. В репликасете storages два инстанса Tarantool'a — мастер и реплика.
  5. В каждом репликасете запустятся роли, которые перечислены в параметре RolesToAssign.

Установим приложение:


$ helm install -f values.yaml test-app tarantool/cartridge --namespace tarantool --version 0.0.8
---
NAME: test-app
LAST DEPLOYED: Mon Sep 14 10:46:50 2020
NAMESPACE: tarantool
STATUS: deployed
REVISION: 1

Подождем, когда все поды запустятся:


kubectl -n tarantool get pods
NAME                         READY   STATUS    RESTARTS   AGE
routers-0-0                  0/1     Running   0          10s
storages-0-0                 1/1     Running   0          10s
...
tarantool-operator-xxx-yyy   1/1     Running   0          2m

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


kubectl port-forward -n tarantool routers-0-0 8081:8081


Теперь webUI кластера Tarantool Cartridge доступен по адресу http://localhost:8081.



Управляем кластером


Добавляем новую реплику


Чтобы увеличить количество реплик в репликасете:


  1. Меняем конфигурацию в файле values.yaml.
  2. Обновляем приложение: helm upgrade.

За количество инстансов в репликасете отвечает параметр ReplicaCount. Выставим его равным 3 для репликасета storages:


- RoleName: storages
  ReplicaCount: 3
  ReplicaSetCount: 1
  DiskSize: 1Gi
  CPUallocation: 0.10
  MemtxMemoryMB: 256
  RolesToAssign: custom.vshard-storage

Обновим приложение:


$ helm upgrade -f values.yaml test-app tarantool/cartridge --namespace tarantool --version 0.0.8
---
Release "test-app" has been upgraded. Happy Helming!
NAME: test-app
LAST DEPLOYED: Tue Sep 15 10:35:55 2020
NAMESPACE: tarantool
STATUS: deployed
REVISION: 2

Ожидаем, когда все новые поды перейдут в состояние Running и смотрим в webUI cartridge.



В репликасете storages 3 инстанса, 1 мастер и 2 реплики.


Добавляем шард (репликасет)


За количество репликасетов одного типа отвечает параметр ReplicaSetCount.


Увеличим количество репликасетов routers до 2:


- RoleName: routers
  ReplicaCount: 1
  ReplicaSetCount: 2
  DiskSize: 1Gi
  CPUallocation: 0.10
  MemtxMemoryMB: 256
  RolesToAssign: custom.vshard-router

Обновляем приложение:


helm upgrade -f values.yaml test-app tarantool/cartridge --namespace tarantool
---
Release "test-app" has been upgraded. Happy Helming!
NAME: test-app
LAST DEPLOYED: Tue Sep 15 10:37:57 2020
NAMESPACE: tarantool
STATUS: deployed
REVISION: 3

Подождем, когда новый под запустится:



Обновляем версию приложения


Сейчас логика приложения состоит из одного эндпоинта /hello, который в ответ на HTTP GET запрос возвращает строку "Hello world!".


Чтобы проверить, прокинем порты до нужного узла:


$ kubectl port-forward -n tarantool routers-0-0 8081:8081
---
Forwarding from 127.0.0.1:8081 -> 8081
Forwarding from [::1]:8081 -> 8081

И выполним запрос:


$ curl http://localhost:8081/hello
---
Hello world!

Добавим еще один эндпоинт, который будет возвращать строку "Hello world, new version of the app!". Для этого в функции init, в роли app/roles/custom.lua добавим еще один httpd:route:


local function init(opts) -- luacheck: no unused args
    ...

    -- новый эндпоинт
    httpd:route({method = 'GET', path = '/v2/hello'}, function()
        return {body = 'Hello world, new version of the app!'}
    end)

    ...
end

Собираем приложение с новой версией:


$ cartridge pack docker --tag vanyarock01/test-app:0.1.0-1-g4577716

---

...
Successfully tagged vanyarock01/test-app:0.1.0-1-g4577716
   • Created result image vanyarock01/test-app:0.1.0-1-g4577716
   • Application was successfully packed

Загружаем новую версию образа в docker registry:


$ docker push vanyarock01/test-app:0.1.0-1-g4577716

Указываем новый image.tag в values.yaml:


image:
  repository: vanyarock01/test-app
  tag: 0.1.0-1-g4577716
  pullPolicy: IfNotPresent

Обновляем приложение в Kubernetes:


$ helm upgrade -f values.yaml test-app tarantool/cartridge --namespace tarantool --version 0.0.8
---
Release "test-app" has been upgraded. Happy Helming!
NAME: test-app
LAST DEPLOYED: Tue Sep 15 10:45:53 2020
NAMESPACE: tarantool
STATUS: deployed
REVISION: 4

Tarantool Operator использует политику обновления OnDelete. Это значит, что обновление дошло до кластера, но чтобы поды обновили образ, нужно их жестко "перезапустить":


$ kubectl delete pods -l tarantool.io/cluster-id=test-app -n tarantool
---
pod "routers-0-0" deleted
pod "routers-1-0" deleted
pod "storages-0-0" deleted
pod "storages-0-1" deleted
pod "storages-0-2" deleted

Подождем, когда поды запустятся заново и проверим обновление:


$ kubectl port-forward -n tarantool routers-0-0 8081:8081
---
Forwarding from 127.0.0.1:8081 -> 8081
Forwarding from [::1]:8081 -> 8081
...

curl http://localhost:8081/v2/hello
---
Hello world, new version of the app!

Запуск нескольких кластеров Tarantool Cartridge в разных namespace


Tarantool Operator может управлять кластерами Tarantool Cartridge только в своем namespace. Поэтому, чтобы развернуть несколько кластеров Cartridge в разных namespace'ах, понадобится развернуть оператор в каждом из них.


Чтобы установить оператор в несколько namespace'ов, достаточно указать нужный namespace при установке:


$ helm install tarantool-operator tarantool/tarantool-operator --namespace NS_1 --create-namespace --version 0.0.8

$ helm install tarantool-operator tarantool/tarantool-operator --namespace NS_2 --create-namespace --version 0.0.8

Эти две команды установят по оператору в namespace'ы NS_1 и NS_2. Дальше в каждом из них можно запускать кластер Tarantool Cartridge.


$ helm install -f values.yaml cartridge tarantool/cartridge --namespace NS_1 --version 0.0.8

$ helm install -f values.yaml cartridge tarantool/cartridge --namespace NS_2 --version 0.0.8

Получим два namespace, в каждом запущен оператор и кластер Tarantool Cartridge. Каждый оператор управляет своим кластером, кластеры не пересекаются.


Удаляем кластер


Для того чтобы удалить Cartridge-приложение выполним:


$ helm uninstall test-app --namespace tarantool
---
release "test-app" uninstalled

Через некоторое время все поды нашего приложения исчезнут, среди подов в неймспейсе tarantool останется только operator.


$ kubectl -n tarantool get pods
---
NAME                                  READY   STATUS    RESTARTS   AGE
tarantool-operator-7dc948c89b-pb9r4   1/1     Running   0          9m45s

Если необходимо удалить и Tarantool Operator выполним:


$ helm uninstall tarantool-operator --namespace tarantool
---
release "tarantool-operator" uninstalled

NOTE helm uinstall не удаляет персистентные хранилища (Persistent Volumes). Чтобы их удалить, нужно дополнительно выполнить:


$ kubectl delete pvc --all -n tarantool
---
persistentvolumeclaim "www-routers-0-0" deleted
persistentvolumeclaim "www-routers-1-0" deleted
persistentvolumeclaim "www-storages-0-0" deleted

Troubleshooting


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


Рассмотрим признаки, возможные причины и решения:


Нехватка CPU


После выполнения helm install/upgrade поды остаются в состоянии Pending.


Выглядит так:


$ kubectl get pods -n tarantool
---
NAME                                  READY   STATUS    RESTARTS   AGE
routers-0-0                           0/1     Pending   0          20m
routers-1-0                           0/1     Pending   0          20m
storages-0-0                          0/1     Pending   0          20m
tarantool-operator-5bd6d895c4-xhjsg   1/1     Running   0          23m

Посмотрим на события одного из подвисших подов.


$ kubectl -n tarantool describe pods routers-0-0
---
Events:
  Type     Reason             Age                    From                Message
  ----     ------             ----                   ----                -------
  Warning  FailedScheduling   34m                    default-scheduler   0/2 nodes are available: 2 Insufficient cpu.
  Warning  FailedScheduling   34m                    default-scheduler   0/2 nodes are available: 2 Insufficient cpu.
  Normal   NotTriggerScaleUp  3m33s (x175 over 34m)  cluster-autoscaler  pod didn't trigger scale-up (it wouldn't fit if a new node is added):

Становится понятно, что нам не хватает CPU. В первую очередь стоит обратить внимание на конфигурацию кластера, которая находится в файле values.yaml, а именно на параметр CPUallocation у репликасетов. Уменьшив его можно добиться положительных результатов.


Нехватка места на дисках


После выполнения helm install/upgrade поды остаются в состоянии ContainerCreating.
Снова посмотрим в kubectl -n tarantool describe pods routers-0-0:


Events:
  Type     Reason                  Age                  From                                              Message
  ----     ------                  ----                 ----                                              -------
  Warning  FailedScheduling        7m44s                default-scheduler                                 pod has unbound immediate PersistentVolumeClaims
  Warning  FailedScheduling        7m44s                default-scheduler                                 pod has unbound immediate PersistentVolumeClaims
  Normal   Scheduled               7m42s                default-scheduler                                 Successfully assigned tarantool/routers-0-0 to kubernetes-cluster-3010-default-group-0
  Normal   SuccessfulAttachVolume  7m37s                attachdetach-controller                           AttachVolume.Attach succeeded for     volume "pvc-e0d3f30a-7dcc-4a67-a69d-4670dc77d556"
  Warning  FailedMount             67s (x9 over 7m5s)   kubelet, kubernetes-cluster-3010-default-group-0  MountVolume.MountDevice failed for volume "pvc-e0d3f30a-7dcc-4a67-a69d-4670dc77d556" : rpc error: code = Internal desc = Unable to find Device path for volume
  Warning  FailedMount             66s (x3 over 5m38s)  kubelet, kubernetes-cluster-3010-default-group-0  Unable to attach or mount volumes: unmounted volumes=[www], unattached volumes=[www default-token-jrz94]: timed out waiting for the condition

Такие события сигнализируют о том, что объема дисков не хватает для создания хранилищ. Изменить размер выделяемой памяти можно через параметр DiskSize в файле values.yaml у репликасетов. Также проблему можно устранить увеличением мощности физического кластера.


Кастомизация


Для большинства кейсов вам хватит helm чарта tarantool/cartridge. Но если требуется кастомизация, можно продолжить использовать чарт, внеся в него собственные правки, либо полностью отказаться от helm в пользу deployment.yaml и kubectl.


Sidecar-контейнеры


Что это такое? В среде Kubernetes есть возможность внутри одного пода создавать несколько контейнеров, разделяющих общие ресурсы такие как дисковое хранилище, сетевые интерфейсы. Такие контейнеры называют sidecar.


Подробнее узнать про данный архитектурный паттерн можно здесь.


Для реализации в Kubernetes необходимо расширить парк контейнеров в описании нужного ресурса. Попробуем добавить к каждому поду, содержащему контейнер с инстансом тарантула еще один сервисный контейнер с nginx на основе данной статьи.


Для этого придется изменить чарт tarantool/cartridge. Найти его можно здесь. Добавим новый контейнер с nginx в шаблон ReplicasetTemplate, который можно найти в файле templates/deployment.yaml.


containers:
- name: pim-storage
  image: "{{ $.Values.image.repository }}:{{ $.Values.image.tag }}"
  ...
- name: nginx-container
  image: nginx
  volumeMounts:
    - name: www
      mountPath: "/data"

NOTE важно описывать дополнительные контейнеры строго после контейнера pim-storage. Иначе при обновлении версии приложения могут возникнуть проблемы, так как Tarantool Operator по умолчанию считает контейнером приложения первый из данного списка.


Далее выполним установку, указав путь до директории с кастомизированным чартом:


$ helm install -f values.yaml test-app tarantool-operator/examples/kv/helm-chart/ --namespace tarantool
---
NAME: test-app
LAST DEPLOYED: Wed Sep 30 11:25:12 2020
NAMESPACE: tarantool
STATUS: deployed
REVISION: 1

Успешность настройки и установки можно проверить взглянув на список подов.


$ kubectl -n tarantool get pods
---
NAME                                  READY   STATUS    RESTARTS   AGE
routers-0-0                           2/2     Running   0          113s
routers-1-0                           2/2     Running   0          113s
storages-0-0                          2/2     Running   0          113s
tarantool-operator-7dc948c89b-fnq28   1/1     Running   0          30m

READY 2/2 означает, что внутри пода готово 2 контейнера.


Установка в закрытом контуре


В enterprise-компаниях обычно доступ в дикий интернет жестко ограничен целях безопастности.


Доставка инструментов


Для того чтобы выполнять описанные выше процедуры с кластером в закрытом контуре, необходимо принести в этот контур helm чарты tarantool-operator и cartridge, docker-образ tarantool-operator и образ вашего приложения.


Скачать чарты можно по следующим ссылкам:


  • tarantool-operator v0.0.8.
  • cartridge v0.0.8.

Далее необходимо запаковать докер образ tarantool-operator. Сперва заберем нужную версию из docker.hub:


$ docker pull tarantool/tarantool-operator:0.0.8
---
0.0.8: Pulling from tarantool/tarantool-operator
Digest: sha256:e3b46c2a0231bd09a8cdc6c86eac2975211b2c597608bdd1e8510ee0054a9854
Status: Downloaded newer image for tarantool/tarantool-operator:0.0.8
docker.io/tarantool/tarantool-operator:0.0.8

И упакуем в архив:


$ docker save tarantool/tarantool-operator:0.0.8 | gzip > tarantool-operator-0.0.8.tar.gz

После доставки архива с контейнером в целевой контур необходимо загрузить образ в локальный docker:


$ docker load < tarantool-operator-0.0.8.tar.gz
---
Loaded image: tarantool/tarantool-operator:0.0.8

Осталось разместить образ в доступном из контура docker registry. Я буду использовать поднятый на localhost:5000 и доступный для Kubernetes docker registry.


$ docker tag tarantool/tarantool-operator:0.0.8 localhost:5000/tarantool-operator:0.0.8
$ docker push localhost:5000/tarantool-operator:0.0.8
---
The push refers to repository [localhost:5000/tarantool-operator]
9ace38e69165: Pushed 
e38e5e822ecf: Pushed 
b6533bbd0bc5: Pushed 
eb29745b8228: Pushed 
0.0.8: digest: sha256:c0cfdc769f545ab106115ef5ee8d924778aea78b08454fbfed4a5b8e42afa5aa size: 1155

NOTE в случае, если сборка приложения в docker-образ осуществляется вне контура, доставить его туда можно способом описанным выше.


Установка Tarantool Operator


Опишем кастомную конфигурацию в файле operator_values.yaml, указав репозиторий, в который мы положили образ на предыдущем шаге.


image:
  repository: localhost:5000/tarantool-operator
  tag: 0.0.8
  pullPolicy: IfNotPresent

И выполним установку, указав путь до чарта:


$ helm install tarantool-operator -f operator_values.yaml ./tarantool-operator-0.0.8.tgz --namespace tarantool --create-namespace
---
NAME: tarantool-operator
LAST DEPLOYED: Tue Dec  1 14:53:47 2020
NAMESPACE: tarantool
STATUS: deployed
REVISION: 1
TEST SUITE: None

Проверим, что запуск оператора прошел успешно


$ kubectl -n tarantool get pods
---
NAME                                  READY   STATUS    RESTARTS   AGE
tarantool-operator-7c867cb467-vthf4   1/1     Running   0          7s

Установка Tarantool Cartridge приложения


Образ приложения я заранее разместил в своем локальном docker registry. Осталось лишь подкорректировать values.yaml указав доступный в нашем контуре репозиторий.


...
image:
  repository: localhost:5000/test-app
  tag: 0.1.0-0-g68f6117
  pullPolicy: IfNotPresent
...

Полную конфигурацию values.yaml можно найти в инструкции по установке Tarantool Cartridge приложения описанной в статье ранее.


И выполнить установку указав путь до чарта:


$ helm install -f values.yaml test-app ./cartridge-
.tgz --namespace tarantool
---
NAME: test-app
LAST DEPLOYED: Tue Dec  1 15:52:41 2020
NAMESPACE: tarantool
STATUS: deployed
REVISION: 1

Посмотрим на поды, чтобы убедиться в успешности установки:


$ kubectl -n tarantool get pods
---
NAME                                  READY   STATUS    RESTARTS   AGE
routers-0-0                           1/1     Running   0          8m30s
storages-0-0                          1/1     Running   0          8m30s
storages-1-0                          1/1     Running   0          8m30s
tarantool-operator-7c867cb467-vthf4   1/1     Running   0          67m

Ссылки


  • Скачать Tarantool можно на официальном сайте.
  • Получить помощь можно в Telegram-чате.
  • Почитать, как на Tarantool сделать распределенный кэш в банке можно тут.
Источник: https://habr.com/ru/company/mailru/blog/533308/

Интересные статьи

Интересные статьи

Мы в okmeter.io в какой-то момент поняли, что нам тоже нужен k8s в production, хотя у нас нет даже CI/CD, но есть задача делить общий пул серверов между приложениями и достаточно ле...
Александр Леонидович Иофа родился в Петрограде 5 марта 1921 года в семье инженера, перед войной окончил школу и поступил в Ленинградский Политехнический институт. В 1941-м его с третьего курс...
В современном мире Kubernetes-облаков, так или иначе, приходится сталкиваться с ошибками в программном обеспечении, которые допустил не ты и не твой коллега, но решать их придется тебе. Данная ст...
Те, кто собираются открывать интернет-магазин, предварительно начитавшись в интернете о важности уникального контента, о фильтрах, накладываемых поисковиками за копирование материалов с других ресурсо...
Прим. перев.: Эта заметка была написана исследователем ИТ-безопасности из компании Aqua Security, специализирующейся на DevSecOps. Она является прекрасной иллюстрацией тех тонкостей в конфигураци...