Установка


Установка Okmeter Хранилище

Подготовка

  1. Для развертывания компонентов также потребуется сервер или виртуальная машина с установленным Docker, kubectl и доступом к узлам Postgres по SSH и к apiserver кластеров Kubernetes под управлением Deckhouse, далее - bastion

  2. Для установки отказоустойчивого варианта Okmeter Хранилище необходимо как минимум 3 ЦОД-а.

    • В каждом из ЦОД-ов должен быть развернут кластер Kubernetes под управлением Deckhouse.

    • Между серверами в разных ЦОД-ах должна быть обеспечена полная сетевая связность.

Установка компонентов

Предварительные действия

  1. Скачайте файлы подготовленные дистрибьютором

    mkdir okmeter && cd okmeter
    wget -O okmeter.tar.gz https://<УНИКАЛЬНАЯ_ССЫЛКА>/okmeter.tar.gz && tar zxvf okmeter.tar.gz
    
  2. Создайте файл credentials-registry.okmeter.ru с содержимым, предоставленным дистрибьютером:

    DOCKER_HOST=registry.okmeter.ru
    DOCKER_USERNAME=user
    DOCKER_PASSWORD=password
    
  3. Если планируется использование private registry:

    1. Создайте файл credentials-my.private.registry с данными для доступа в ваш registry:

         DOCKER_HOST=my.private.registry
         DOCKER_USERNAME=user
         DOCKER_PASSWORD=password
      
    2. Скачайте бандлы из registry okmeter

         ./okmeter.sh bundles --registry-credentials credentials-registry.okmeter.ru --download bundles
      
    3. Загрузите бандлы в ваш приватный registry:

         ./okmeter.sh bundles --registry-credentials credentials-my.private.registry --upload bundles
      
    4. В дальнейшем, для установки, используйте флаг --registry-credentials credentials-my.private.registry

Подготовка values-файлов

Дистрибьютор подготавливает values-файлы для каждого ЦОДа согласно утвержденным спецификациям, однако ряд значений требует обязательной проверки и изменения:

  1. values-$datacenter/common.yaml - содержит общие для всех компонентов настройки: доменное имя сервиса, список соседних кластеров

  2. values-$datacenter/okmeter-infra.yaml

    1. Секция .patroni.tls заполняется данными корневого сертификата кластера patroni:

      export PATH=$PATH:$PWD/bin
      ./pki.sh --pki-path pki --gen-ca --dump-yaml ca 2>/dev/null | yq -iM ea 'select(fi==1) as $src | select(fi==0) | .patroni.tls += $src' values-dc1/okmeter-infra.yaml -
      ./pki.sh --pki-path pki --gen-ca --dump-yaml ca 2>/dev/null | yq -iM ea 'select(fi==1) as $src | select(fi==0) | .patroni.tls += $src' values-dc2/okmeter-infra.yaml -
      

      и клиентского сертификата, который используется Prometheus для сбора метрик из кластера Patroni:

      export PATH=$PATH:$PWD/bin
      ./pki.sh --pki-path pki --gen-client --dump-yaml client prometheus Prometheus 2>/dev/null | yq -iM ea 'select(fi==1) as $src | select(fi==0) | .patroni.tls += $src' values-dc1/okmeter-infra.yaml -
      ./pki.sh --pki-path pki --gen-client --dump-yaml client prometheus Prometheus 2>/dev/null | yq -iM ea 'select(fi==1) as $src | select(fi==0) | .patroni.tls += $src' values-dc2/okmeter-infra.yaml -
      
    2. Секция .patroni.hosts. Необходимо заполнить IP-адреса серверов Postgres. Указывается внутренний адрес (internalIP) и внешний адрес (externalIP). Внешний адрес также является ssh-хостом для Ansible. При отсутствии внешнего адреса в оба поля необходимо указать внутренний.

    3. Секция .patroni.spilo. Необходимо заполнить поля adminPassword (пароль пользователя patroni), superuserPassword (пароль суперпользователя postgres), standbyPassword (пароль пользователя репликации) и extraUsers[0].password (пароль пользователя okmeter) взломостойкими паролями.

    4. Секция .patroni.firewall. Необходимо заполнить поля allowedIPs и/или allowedNets списком адресов и сетей, которым разрешен доступ до кластера patroni. Как минимум трафик со всех нод кластера Kubernetes должны быть разрешен в настройках firewall.

  3. TBD

Развертывание внешнего кластера Postgres под управлением Patroni

Развертывание осуществляется спомощью Ansible. Выполнение playbook-а происходит из docker-контейнера. Получить команду запуска контейнера можно с помощью скрипта okmeter.sh с указанием пути до values-файлов любого из ЦОД-ов, поскольку настройки patroni в них идентичные. Пример:

  1. Выполнить команду

    ./okmeter.sh ansible --registry-credentials credentials-registry.okmeter.ru --values-path values-dc1 --user ubuntu
    
  2. Запустить контейнер полученной в п.1 командой, пример:

    docker run -it --rm -v /root/.ssh:/tmp/.ssh -v /home/ubuntu/pki:/ansible/pki -v /home/ubuntu/patroni-inventory.yaml:/ansible/patroni-inventory.yaml registry.okmeter.ru/okmeter/patroni:04f1a964a9111b5b16059f10d7f32616d44431e604f1398afd9c8c34-1679998386004
    
  3. Внутри контейнера добавить в ssh-agent ключ для доступа к серверам patroni, пример:

    ssh-add /tmp/.ssh/your-ssh-key
    
  4. Внутри контейнера выполнить Ansible Playbook, пример:

    ansible-playbook -u ubuntu -Ki patroni-inventory.yaml postgres.yaml
    

После успешного выполнения плейбука необходимо проверить состояние кластера patroni:

  1. Зайти по ssh на любой из серверов кластера

  2. Войти в контейнер с Postgres:

    docker exec -it postgres bash
    
  3. Получить состояние кластера:

    patronictl list
    

    в выводе команды должны быть все сервера, на которых разворачивался Postgres, среди них должен быть сервер с ролью Leader. Пример:

    root@postgres-0:/home/postgres# patronictl list
    + Cluster: okmeter ---------+---------+---------+----+-----------+
    | Member     | Host         | Role    | State   | TL | Lag in MB |
    +------------+--------------+---------+---------+----+-----------+
    | postgres-0 | 10.241.32.14 | Replica | running |  2 |         0 |
    | postgres-1 | 10.241.32.40 | Replica | running |  2 |         0 |
    | postgres-2 | 10.241.32.37 | Leader  | running |  2 |           |
    +------------+--------------+---------+---------+----+-----------+
    
  4. В случае, если Postgres в ЦОД-е, где не предусмотрен кластер Kubernetes, нужно поменять мастера

    root@postgres-0:/home/postgres# patronictl switchover
    Current cluster topology
    + Cluster: okmeter ---------+---------+---------+----+-----------+
    | Member     | Host         | Role    | State   | TL | Lag in MB |
    +------------+--------------+---------+---------+----+-----------+
    | postgres-0 | 10.241.32.14 | Replica | running |  2 |         0 |
    | postgres-1 | 10.241.32.40 | Replica | running |  2 |         0 |
    | postgres-2 | 10.241.32.37 | Leader  | running |  2 |           |
    +------------+--------------+---------+---------+----+-----------+
    Primary [postgres-2]: 
    Candidate ['postgres-0', 'postgres-1'] []: postgres-0
    When should the switchover take place (e.g. 2023-01-01T10:00 )  [now]: 
    Are you sure you want to switchover cluster okmeter, demoting current leader postgres-2? [y/N]: y
    2023-01-01 10:01:10.1000 Successfully switched over to "postgres-0"
    + Cluster: okmeter ---------+---------+---------+----+-----------+
    | Member     | Host         | Role    | State   | TL | Lag in MB |
    +------------+--------------+---------+---------+----+-----------+
    | postgres-0 | 10.241.32.14 | Leader  | running |  2 |         0 |
    | postgres-1 | 10.241.32.40 | Replica | running |  2 |         0 |
    | postgres-2 | 10.241.32.37 | Replica | running |  2 |           |
    +------------+--------------+---------+---------+----+-----------+
    

Развертывание сервиса

Установка всех компонентов сервиса в кластер Kubernetes производится выполнением команды для каждого из ЦОД-ов c последовательнм переключением контекста, например:

Начинать установку нужно с того ЦОД-а, Postgres в котором находится в состоянии Leader

./bin/werf kubectl config use-context dc1
./okmeter.sh install --registry-credentials credentials-registry.okmeter.ru --values-path values-dc1
./bin/werf kubectl config use-context dc2
./okmeter.sh install --registry-credentials credentials-registry.okmeter.ru --values-path values-dc2

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

./okmeter.sh copy-secret --source okmeter-onprem-infra/okmeter-onprem-wildcard --target-name okmeter-onprem-wildcard
./bin/werf kubectl config use-context dc1
./okmeter.sh copy-secret --source okmeter-onprem-infra/okmeter-onprem-wildcard --target-name okmeter-onprem-wildcard

Проверка инсталяции

Если во время развертывания сервиса не возникло никаких ошибок, должны соблюдаться следующие критерии работоспособности:

  • Домен инсталляции доступен из веб-браузера.
  • Работает регистрация пользователя.
  • Проекты создаются без ошибок.
  • Агент устанавливается по инструкциям со страницы проекта
  • После установки агента, на странице проекта появляется хост, отрисовываются стандартные графики.
  • Работает отправка алертов (тестовый алерт)

В случае проблем с установкой обратитесь к поставщику.

Обновление инсталяции

Обновить файл versions после выполнить те-же команды, что и для установки

Начинать обновление нужно с того ЦОД-а, Postgres в котором находится в состоянии Leader

./bin/werf kubectl config use-context dc1
./okmeter.sh install --registry-credentials credentials-registry.okmeter.ru --values-path values-dc1
./bin/werf kubectl config use-context dc2
./okmeter.sh install --registry-credentials credentials-registry.okmeter.ru --values-path values-dc2

Удаление инсталляции

Удаление всех компонентов сервиса в кластере Kubernetes производится командой:

./okmeter.sh uninstall

с ключом --yes-i-really-want-to-uninstall.

Данную операцию необходимо повторить для каждого из ЦОД-ов с переключением контекста kubectl

Инсталляция кластера Postgres данным действием не затрагивается.

ВНИМАНИЕ: выполнение данной операции приведет к безвозвратной потере метрик и логов, хранящихся в S3.