Skip to content
Snippets Groups Projects

Установка Picodata с помощью Helm

Одним из самых распространенных способов управлять установкой приложений в kubernetes является пакетный менеджер helm. Он позволяет шаблонизировать манифесты, динамичестки конфигурировать приложение, разделять релизы и управлять порядком установки в кластер. Чарт picodata позволяет установить picodata в кластер kubernetes одной командой, а также гибко конфигурировать кластер с помощью переопределения chart values в едином файле.


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

Чтобы протестировать picodata, первым делом нужно поднять кластер kubernetes или minikube, а затем установить чарт. Для начала клонируем репозиторий:

git clone https://git.picodata.io/picodata/picodata/picodata-chart.git

Переходим в директорию с чартом:

cd picodata/

Наиболее простой вариант установки — это установка с параметрами по умолчанию. Выполняем вызов helm без параметров.

helm upgrade --install picodata -n picodata . --create-namespace

helm chart выкладывается в репозиторий из которого его можно получить следующими командами:

helm pull oci://docker-public.binary.picodata.io/helm/picodata
helm upgrade --install picodata -n picodata <путь к tgz архиву> --create-namespace

Аргументы командной строки helm


Полезные опции

Для примера основных опция helm можно рассмотреть команду:


helm upgrade my-release-name picodata \
  --install \
  --namespace my-namespace \
  --create-namespace
  --values my-values.yml \
  --version 0.0.3 \
  --devel \
  --debug \
  --wait \
  --atomic

Пояснение:

  • helm upgrade — обновить уже установленный релиз.
  • my-release-name — название релиза, в рамках которого будут сохраняться ревизии.
  • picodata — название чарта, который мы устанавливаем (может быть путем в файловой системе, или путем в репозитории).
  • --install — установить чарт если еще не установлен.
  • --namespace my-namespace — установить релиз в неймспейс my-namespace.
  • --create-namespace — создать неймспейс, указанный в опции --namespace, если он еще не создан.
  • --values my-values.yml — пусть к values, которые перезапишут дефолтные.
  • --version 0.0.1 — версия устанавливаемого чарта (версия приложения захардкожена в конкретной версии чарта).
  • --devel — позволяет устанавливать develop-версии чартов, например 0 .0.1-alpha, или 22.10-beta-test.
  • --debug — вывести подробную информацию об установке и отрендеренные манифесты.
  • --wait — дождаться пока все поды будут запланированы планировщиком и перейдут в статус Running.
  • --atomic — атомарная установка. Если установка новой ревизий прошла неуспешно (поды не перешли в состояние Running), то откатить на предыдущую версию и удалить текущий релиз.

Переопределение параметров и запуск своего кластера

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

helm show values >> my-new-values.yml

В полученном файле my-release-values.yml есть следующие параметры, которые можно переопределить.

  • Параметры образа, а также репозиторий, откуда будет получен образ picodata
  • Образ собирается из на осонове rockylinux:8 из Dockerfile
image:
  repository: docker-public.binary.picodata.io
  pullPolicy: IfNotPresent
  # Если убрать тег в values, то будет использован тег, указанный в chartVersion,
  # или переданный в опции --version
  tag: 'picodata:master'

# Если кластер kubernetes находится в закрытом контуре и используется
# приватный репозиторий, то необходимо заранее создать imagePullSecrets
imagePullSecrets: []

Параметры service account

serviceAccount:
  # Обозначает, должен ли быть создан service account
  create: true
  # Дополнительные аннотации
  annotations: {}
  # Имя service account, который будет использован текущим релизом.
  # Если не задавать имя, то оно будет сгенерировано автоматически.
  name: ''
  • Параметры перезаписи имени.
nameOverride: ''
fullnameOverride: ''

Параметры дисковой подсистемы для кластера

  # Рабочая директория инстанса.
  instanceDir: /pico
  volumes:
    - name: picodata
      accessModes:
        - ReadWriteOnce
      # Точка монтирования рабочей директории инстанса.
      mountPath: /pico
      # Управление классамом хранилища
      storageClassName: yc-network-ssd

Задание портов для сервисов

  service:
    type: ClusterIP
    ports:
        # Бинарный порт общения между инстансами
      - name: binary
        protocol: TCP
        port: 3301
        targetPort: 3301
        # Порт HTTP-сервера, где доступно WebUI, а также url для сбора метрик (/metrics)
      - name: http
        protocol: TCP
        port: 8081
        targetPort: 8081
        # Порт общения по протоколу Pgproto
      - name: psql
        protocol: TCP
        port: 5432
        targetPort: 5432
        # Если включен плагин radix. Для общения по протоколу redis
      - name: radix
        protocol: TCP
        port: 7379
        targetPort: 7379

Определение конфигурации тиров

  # В дефолтном values.yaml определен один тир
  tiers:
    - tierName: default
      # Фактор репликации к котому будет стремиться кластер.
      replication_factor: 1
      # Количество подов (инстансов) picodata
      replicas: 2
      # Признак тира <tier_name>, определяющий возможность инстансов участвовать в голосовании на выборах raft-лидера.
      can_vote: true
      # Размер диска для каждого инстанса
      diskSize: 1Gi
      plugin_dir: null
      audit: null
      # Режим безопасного удаления рабочих файлов инстанса путем многократной перезаписи специальными битовыми последовательностями
      shredding: false
      memtx:
        # Объем памяти в байтах, выделяемый для хранения кортежей
        memory: 128M
      vinyl:
        # Максимальное количество оперативной памяти в байтах, которое использует движок хранения vinyl.
        memory: 67108864
        # Размер кэша в байтах для движка хранения vinyl.
        cache: 33554432
      # Модуль Pgproto реализует протокол PostgreSQL
      pg:
        # Признак использования протокола SSL при подключении к Pgproto.
        ssl: false
      log:
        level: info
        destination: null
        format: plain
      # Значения по-умолчанию для cpu/mem ресурсов.
      resources:
        limits:
          cpu: 200m
          memory: 256Mi
        requests:
          cpu: 100m
          memory: 128Mi
        # Дополнительные переменные окружения
        env:
        - name: PICODATA_LOG_LEVEL
          value: info
      # affinity для каждого тира
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - services
      # Параметры ingress для каждого тира
      ingress:
        enabled: false
        className: 'nginx'
        annotations:
          kubernetes.io/tls-acme: "true"
          cert-manager.io/cluster-issuer: letsencrypt
        hosts:
          - host: picodata.local
            paths:
              - path: /
                pathType: ImplementationSpecific
        tls:
          - secretName: picodata-local-tls
            hosts:
              - picodata.local


  # livenessProbe/readinessProbe для кластера Picodata
  livenessProbe:
    tcpSocket:
      port: binary
    timeoutSeconds: 3
    periodSeconds: 20
    successThreshold: 1
    failureThreshold: 3
  readinessProbe:
    tcpSocket:
      port: binary
    timeoutSeconds: 3
    periodSeconds: 20
    successThreshold: 1
    failureThreshold: 3
  startupProbe:
    tcpSocket:
      port: binary
    periodSeconds: 30
    failureThreshold: 20
    timeoutSeconds: 3

  # Управление автоматическим горизонтальным масштабированием
  autoscaling:
    # По умолчанию автомасштабирование отключено
    enabled: false
    # Минимальное количество реплик (нужно конфигурировать совместно с
    # replicationFactor и replicasCount)
    minReplicas: 2
    maxReplicas: 100
    targetCPUUtilizationPercentage: 80
    targetMemoryUtilizationPercentage: 80

  nodeSelector: {}

  tolerations: []

  topologySpreadConstraints: {}
    # — maxSkew: 1
    #   topologyKey: kubernetes.io/hostname
    #   whenUnsatisfiable: DoNotSchedule
    #   matchLabelKeys:
    #     — router

Определение конфигурации плагинов

Более полная документация по плагинам доступна по адресу.

Нужно поменять имя образа, собранного с плагином, в разделе image.tag и добавить порт в service

- name: radix
  protocol: TCP
  port: 7379
  targetPort: 7379

Далее подключиться к инстансу пикодаты

kubectl exec -it default-picodata-0 -n picodata -- bash

В контейнере подключиться к административной консоли инстанса:

picodata admin admin.sock

И выполнить sql комманды:

CREATE PLUGIN radix 0.2.0;
ALTER PLUGIN radix 0.2.0 ADD SERVICE radix TO TIER default;
ALTER PLUGIN radix MIGRATE TO 0.2.0;
ALTER PLUGIN radix 0.2.0 ENABLE;

Проверить правильность установки плагина:

SELECT * FROM _pico_plugin;

s3 Integration

docs: https://github.com/yandex-cloud/k8s-csi-s3

Install

Добавить ключи для s3 бакета:

kubectl apply -f backup/pico-s3-secret.yml

Установить csi-s3 драйвер в kubernetes кластер:

cd backup/yandex-s3
helm repo add yandex-s3 https://yandex-cloud.github.io/k8s-csi-s3/charts
helm install csi-s3 yandex-s3/csi-s3 -f values.yml -n picodata