ELMA365 On-Premises можно установить в уже существующий Kubernetes-кластер. ELMA365 поставляется в виде helm-чартов:
- elma365-stack — полный стэк ELMA365, включает в себя Helm-пакеты
elma365
,elma365-dbs
иelma365-addons
; - elma365 — пакет приложения ELMA365;
- elma365-dbs — набор баз данных и хранилищ, необходимых для работы ELMA365. Также есть возможность использовать собственные базы данных PostgreSQL, MongoDB, Redis, RabbitMQ, хранилище S3, указав строки подключения к ним values пакета elma365. При этом в файле
values.yaml
установку соответствующих компонентов можно отключить, выставив значениеfalse
, например, для PostgreSQLglobal.postgresql.enabled
. Если все пять компонентов чарта будут выставлены вfalse
, установка этого чарта не требуется. О создании баз данных читайте в разделе «Подготовка внешних баз данных»; - elma365-addons — дополнения для ELMA365 Enterprise, включающие в себя систему маршрутизации (Service Mesh) Linkerd, систему мониторинга Prometheus + Grafana, а также Descheduler, NodeLocal DNSCache и модуль Аудит безопасности.
начало внимание
Чарты elma365-extension больше не поддерживаются. Переход на чарты elma365-dbs с новыми версиями баз данных выполняется с помощью дампа и его восстановления.
конец внимание
Требования к конфигурации Kubernetes
Установленная версия кластера Kubernetes должна поддерживать Kubernetes API v.2 (версия Kubernetes 1.19 - 1.26) и содержать следующие компоненты: ingress-nginx контроллер, coredns, rbac, storageclass.
Установка производится с использованием Helm v.3.
Должно быть разрешено проксирование из pod’ов во внешнюю сеть.
Установка ELMA365 с помощью чарта elma365-stack
- Добавьте репозиторий Helm ELMA365 и извлеките список переменных пакета приложения со всеми необходимыми компонентами в файл:
helm repo add elma365 https://charts.elma365.tech
helm repo update
helm show values elma365/elma365-stack > values-elma365-stack.yaml
- Заполните переменные в файле
values-elma365-stack.yaml
, заменив как минимум следующие параметры:
- elma365.global.host — домен (FQDN) или ip-адрес, по которому будет доступна система;
- elma365.bootstrapCompany.email — электронная почта администратора;
- elma365.bootstrapCompany.password — пароль администратора;
- elma365.db.psqlUrl — строка подключения к БД PostgreSQL;
- elma365.db.mongoUrl — строка подключения к БД MongoDB для приложения;
- elma365.db.vahterMongoUrl — строка подключения к БД MongoDB для сервера авторизации;
- elma365.db.redisUrl — строка подключения к Redis;
- elma365.db.amqpUrl — строка подключения к RabbitMQ;
- elma365.db.s3.method — метод запросов к s3;
- elma365.db.s3.accesskeyid — имя пользователя s3;
- elma365.db.s3.secretaccesskey — пароль для пользователя s3;
- elma365.db.s3.bucket — бакет s3;
- elma365.db.s3.backend.address — адрес s3;
- elma365.db.s3.backend.region — регион s3;
- elma365.db.s3.ssl.enabled — включение SSL s3.
- Если требуется создать отдельный namespace, укажите его во всех командах установки.
- Сохраните файл
values-elma365-stack.yaml
для последующих обновлений.
Установка баз данных
- При использовании своих баз данных установку встроенных баз можно пропустить, изменив значение в параметре
global.elma365-dbs.enabled
наfalse
в файлеvalues-elma365-stack.yaml
. В случае использования одной или нескольких внешних баз, например, PostgreSQL, можно пропустить его установку, изменив параметрglobal.postgresql.enabled
наfalse
. - Выполните установку баз данных. На этом шаге необходимо отключить установку приложения ELMA365 следующей командой (обратите внимание на параметр
--set global.elma365.enabled=false
):
helm upgrade --install elma365-stack elma365/elma365-stack \
-f values-elma365-stack.yaml \
--set global.elma365.enabled=false \
--timeout=30m --wait \
[-n namespace]
Установка приложения ELMA365
- Если необходимо восстановить дамп, перед установкой ELMA365 выполните скрипт elma365db.sh:
helm pull elma365/elma365-stack --untar
./elma365-stack/charts/elma365/elma365db.sh --restore --path /backup/path/ \
[--kubeconfig /path/to/config --context prod] [-n namespace]
- Выполните установку приложения ELMA365 командой:
helm upgrade --install elma365-stack elma365/elma365-stack \
-f values-elma365-stack.yaml \
--timeout=30m --wait [-n namespace]
- Для создания дампа можно воспользоваться скриптом elma365db.sh из чарта elma365:
helm pull elma365/elma365-stack --untar
./elma365-stack/charts/elma365/elma365db.sh --dump --path /backup/path/ \
[--kubeconfig /path/to/config --context prod] [-n namespace]
Установка средств мониторинга (опционально)
- В файле
values-elma365-stack.yaml
отключите неиспользуемые компоненты, изменив значение в параметрахglobal.linkerd2.enabled
,global.descheduler.enabled
,global.node-local-dns.enabled
иglobal.audit.enabled
наfalse
, так как для их установки необходимы предварительные настройки. - В параметрах
elma365-addons.kube-prometheus-stack
иelma365-addons.grafana
укажите требуемыйnamespace
для сервиса мониторинга (например,namespaceOverride: monitoring
), адрес, по которому будет доступен сервис мониторинга и включите дашборды, изменив значение в параметреelma365.global.dashboard.enabled
наtrue
. - Создайте
namespace
для сервиса мониторинга командой:
kubectl create namespace monitoring
- Выполните установку следующей командой (обратите внимание на параметр
--set global.elma365-addons.enabled=true
):
helm upgrade --install elma365-stack elma365/elma365-stack \
-f values-elma365-stack.yaml \
--set global.elma365-addons.enabled=true \
--timeout=30m --wait \
[-n namespace]
Установка Linkerd и автомасштабирование сервисов (опционально)
Linkerd — это выделенный уровень инфраструктуры, который помогает обрабатывать связь между сервисами, автоматически шифровать соединения, обрабатывать повторные запросы и тайм-ауты. Также он предоставит вам телеметрию (коэффициент успешности, задержки) и многое другое.
- Сгенерируйте сертификаты с помощью openssl, выполнив команды ниже. Linkerd требует сертификат привязки доверия и сертификаты эмитента с соответствующим ключом для поддержки взаимных TLS-соединений между сервисами, для всех сертификатов требуется алгоритм ECDSA P-256.
# Создать закрытый ключ CA
openssl ecparam -name prime256v1 -genkey -noout -out ca-private.pem
# Создать открытый ключ CA
openssl ec -in ca-private.pem -pubout -out ca-public.pem
# Создать самоподписанный сертификат CA
openssl req -x509 -new -key ca-private.pem -days 365 \
-out ca.crt -subj "/CN=root.linkerd.cluster.local"
# Создать закрытый ключ эмитента
openssl ecparam -name prime256v1 -genkey -noout -out issuer-private.pem
# Создать открытый ключ эмитента
openssl ec -in issuer-private.pem -pubout -out issuer-public.pem
# Создать запрос на подпись сертификата
openssl req -new -key issuer-private.pem -out issuer.csr \
-subj "/CN=identity.linkerd.cluster.local" \
-addext basicConstraints=critical,CA:TRUE
# Создать сертификат эмитента, подписав запрос
openssl x509 \
-extfile /etc/ssl/openssl.cnf \
-extensions v3_ca \
-req \
-in issuer.csr \
-days 180 \
-CA ca.crt \
-CAkey ca-private.pem \
-CAcreateserial \
-extensions v3_ca \
-out issuer.crt
# Удалить запрос на подпись сертификата
rm issuer.csr
- В файле
values-elma365-stack.yaml
отключите неиспользуемые компоненты, изменив значение в параметрахglobal.kube-prometheus-stack.enabled
,global.grafana.enabled
,global.descheduler.enabled
,global.node-local-dns.enabled
иglobal.audit.enabled
наfalse
, так как для их установки необходимы предварительные настройки. - В параметрах
elma365-addons.linkerd2
укажите требуемыйnamespace
для сервиса Linkerd (например,namespace: linkerd
), содержимое сертификатов, ключа и срок действия сертификата crtExpiry. Обратите внимание, значение должно соответствовать дате истечения срока действия сертификата эмитента.
identityTrustAnchorsPEM: |
-----BEGIN CERTIFICATE-----
содержимое сертификата ca.crt
-----END CERTIFICATE-----
identity:
issuer:
crtExpiry: 2023-03-30T05:28:39Z
tls:
crtPEM: |
-----BEGIN CERTIFICATE-----
содержимое сертификата issuer.crt
-----END CERTIFICATE-----
keyPEM: |
-----BEGIN EC PRIVATE KEY-----
содержимое сертификата issuer-private.pem
-----END EC PRIVATE KEY-----
- Включить автомасштабирование сервисов, изменив значение в параметре
elma365.global.autoscaling.enabled
наtrue
. - Выполните установку следующей командой (обратите внимание на параметр
--set global.elma365-addons.enabled=true
):
helm upgrade --install elma365-stack elma365/elma365-stack \
-f values-elma365-stack.yaml --set global.elma365-addons.enabled=true \
--timeout=30m --wait [-n namespace]
- Добавьте аннотацию на namespace с приложением ELMA365 для автоматической инъекции контейнеров Linkerd-proxy в сервисы ELMA365 командой:
kubectl annotate namespace default linkerd.io/inject=enabled
- Перезапустите все сервисы командой:
kubectl rollout restart deploy [-n namespace] && kubectl rollout restart ds [-n namespace]
Установка NodeLocal DNS Cache (опционально)
Установка NodeLocal DNS Cache позволяет снизить нагрузку по DNS-запросам в кластере Kubernetes и повысить стабильность преобразования DNS имён. Это позволит избежать правил DNAT, connection tracking и ограничений по количеству соединений.
- Получите IP-адрес сервиса kube-dns:
kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP}
- В файле
values-elma365-stack.yaml
отключите неиспользуемые компоненты, изменив значение в параметрахglobal.kube-prometheus-stack.enabled
,global.grafana.enabled
,global.descheduler.enabled
,global.linkerd2.enabled
иglobal.audit.enabled
наfalse
, так как для их установки необходимы предварительные настройки. - В параметрах
elma365-addons.node-local-dns
укажите следующие параметры:
- pillar_dns_domain — домен кластера;
- pillar_dns_server — IP-адрес сервиса kube-dns;
- pillar_local_dns — локальный IP-адрес для NodeLocal DNS Cache.
- Выполните установку командой (обратите внимание на параметр
--set global.elma365-addons.enabled=true
):
helm upgrade --install elma365-stack elma365/elma365-stack \
-f values-elma365-stack.yaml --set global.elma365-addons.enabled=true \
--timeout=30m --wait [-n namespace]
Установка Kyverno (опционально)
Kyverno позволяет управлять специфическими конфигурациями среды независимо от конфигураций ресурсов, применять передовые методы настройки для своих кластеров в частности путём блокировки или изменения запросов API.
Политика добавления пользовательских сертификатов CA во все контейнеры
В некоторых случаях требуется доверять пользовательским сертификатам CA. Kyverno позволяет автоматически монтировать их в контейнеры. Политика добавляет том, содержащий сертификат, ко всем контейнерам с меткой tier=elma365.
- Создайте ConfigMap с сертификатом корневого CA.
kubectl create configmap elma365-onpremise-ca --from-file=/etc/ssl/certs/rootCA.pem [-n namespace]
- В файле
values-elma365-stack.yaml
включите Kyverno, изменив значение в параметреglobal.kyverno.enabled
наtrue
. Затем отключите неиспользуемые компоненты, изменив значение у дополнения в параметреglobal
наfalse
, так как для их установки необходимы предварительные настройки. - В параметрах
elma365-addons.kyverno
укажите требуемыйnamespace
для сервиса Kyverno, например,namespace: kyverno
. Затем включите политику добавления сертификатов, изменив значение в параметреelma365-addons.kyverno.injectСerts.enabled
наtrue
, укажите имя ConfigMap с сертификатом корневого CA. В параметреinjectNamespace
укажите списокnamespace
, в которых будет применена политика добавления сертификатов. - Создайте
namespace
для сервиса Kyverno командой:
kubectl create namespace kyverno
- Выполните установку следующей командой (обратите внимание на параметр
--set global.elma365-addons.enabled=true
:
helm upgrade --install elma365-stack elma365/elma365-stack \
-f values-elma365-stack.yaml --set global.elma365-addons.enabled=true \
--timeout=30m --wait [-n namespace]
- Перезапустите все сервисы командой:
kubectl rollout restart deploy [-n namespace] && kubectl rollout restart ds [-n namespace]
Обновление версии ELMA365
- Обновите список чартов в репозитории:
helm repo update
- Используйте файл
values-elma365-stack.yaml
, сохранённый на этапе установки, а затем выполните команду:
helm upgrade --install elma365-stack elma365/elma365-stack -f values-elma365-stack.yaml --timeout=30m --wait [-n namespace]
В случае изменения строк подключения (сonnection strings) к БД при обновлении приложения, перезапустите все сервисы командой:
kubectl default rollout restart deploy [-n namespace] && kubectl default rollout restart ds [-n namespace]
Удаление чарта elma365
Для удаления пакета ELMA365 посмотрите список установленных релизов, а затем выполните команду удаления:
helm list [-n namespace]
helm uninstall elma365-stack [-n namespace]
Параметры чарта elma365-stack
Имя |
Описание |
Значение по умолчанию |
Глобальные параметры |
||
global.elma365.enabled |
Включить установку приложения ELMA365 |
true |
global.elma365-dbs.enabled |
Включить установку баз данных |
true |
global.postgresql.enabled |
Включить Postgres в установку баз данных |
true |
global.mongodb.enabled |
Включить MongoDB в установку баз данных |
true |
global.redis.enabled |
Включить Redis в установку баз данных |
true |
global.rabbitmq.enabled |
Включить Rabbitmq в установку баз данных |
true |
global.minio.enabled |
Включить MinIO для S3 хранилища в установку баз данных |
true |
global.elasticsearch.enabled |
Включить elasticsearch в установку баз данных (включается для ELMA Bot) |
false |
global.elma365-addons.enabled |
Включить установку дополнении для ELMA365 |
false |
global.kube-prometheus-stack.enabled |
Включить prometheus в установку дополнении для ELMA365 (перед установкой необходимо создать namespace monitoring) |
true |
global.grafana.enabled |
Включить grafana в установку дополнении для ELMA365 |
true |
global.linkerd2.enabled |
Включить linkerd в установку дополнении для ELMA365 |
true |
global.descheduler.enabled |
Включить descheduler в установку дополнении для ELMA365 (необходимо не менее 3 узлов в кластере) |
false |
global.node-local-dns.enabled |
Включить NodeLocal DNS Cache в установку дополнении для ELMA365 |
true |
global.audit.enabled |
Включить сервиса аудит безопасности в установку дополнении для ELMA365 |
true |
Глобальные параметры ELMA365 |
||
elma365.global.host |
Домен (FQDN) или ip адрес, по которому будет доступна система |
example.ru |
elma365.global.ingress.hostEnabled |
Включение host в ingress (значение берётся из global.host). |
false |
elma365.global.ingress.onpremiseTls.enabled |
Включение https |
false |
elma365.global.ingress.onpremiseTls.secret |
Имя секрета с сертификатами для работы https |
"elma365-onpremise-tls" |
elma365.global.ingress.onpremiseTls.enabledCA |
Включение сертификата корневого CA для работы https с самоподписанным сертификатом |
false |
elma365.global.ingress.onpremiseTls.configCA |
Имя конфигмапы с сертификатом корневого CA для работы https с самоподписанным сертификатом |
"elma365-onpremise-ca" |
elma365.global.ingress.annotations |
Аннотации для ingress |
{"kubernetes.io/ingress.class": "nginx"} |
elma365.global.autoscaling.enabled |
Включение автомасштабирования сервисов |
true |
elma365.global.autoscaling.minReplicas |
Минимальное количество реплик |
1 |
elma365.global.autoscaling.maxReplicas |
Максимальное количество реплик |
9 |
elma365.global.dashboard.enabled |
Включение дашбордов для Grafana |
false |
elma365.global.image.repository |
Адрес для registry |
hub.elma365.tech |
elma365.global.image.dockerRegistry |
Адрес для registry |
" " |
elma365.global.image.pullSecret |
Секрет с правами доступа к приватному registry, должен быть создан вручную, зашифрованный в Base64 |
[yandexsecret] |
Дополнительные параметры |
||
elma365.global.postgres.maxIdleConns |
Максимальное количество подключений в пуле незанятых подключений |
50 |
elma365.global.postgres.maxOpenConns |
Максимальное количество открытых подключений из пула |
150 |
elma365.global.postgres.maxConnLife |
Максимальное время жизни подключения из пула |
1m |
elma365.global.postgres.poolMaxIdleConns |
Максимальное количество подключений в пуле незанятых подключений |
50 |
elma365.global.postgres.poolMaxOpenConns |
Максимальное количество открытых подключений из пула |
150 |
elma365.global.postgres.poolConnMaxLifetime |
Максимальное время жизни подключения из пула |
5m |
elma365.global.maxGrpcMessageSize |
Максимальный размер ответов |
8388608 |
elma365.global.maxGrpcBackoffDelay |
Максимальная задержка между попытками установки GRPC соединения |
2s |
elma365.global.activeDeadlineSeconds |
Количество секунд, которое отводится всему Job на выполнение |
3000 |
elma365.global.curlCreateCompanyMaxTime |
Количество секунд, которое отводится на выполнение Job создание компании |
1800 |
elma365.global.curlMigrationsMaxTime |
Количество секунд, которое отводится на выполнение Job миграции |
3000 |
Общие параметры |
||
elma365.debug |
Включить режим отладки платформы |
false |
elma365.bootstrapCompany.email |
Электронная почта администратора |
admin@mail.com |
elma365.bootstrapCompany.password |
Пароль администратора |
test |
elma365.bootstrapCompany.locale |
Язык установленной системы, возможные варианты: ru-RU, en-US, sk-SK |
ru-RU |
elma365.language.default |
Язык установленной системы, возможные варианты: ru-RU, en-US, sk-SK |
ru-RU |
Строки подключения (сonnection strings) для подключения к БД |
||
elma365.db.psqlUrl |
Строка подключения к БД PostgreSQL |
"db.psqlUrl: 'postgres:// postgres:pgpassword@ postgres.default.svc.cluster. local:5432/elma365?sslmode=disable" |
elma365.db.psqlSecret |
Имя секрета со строкой подключения к БД PostgreSQL, зашифрованной в Base64 (ключ PSQL_URL) |
" " |
elma365.db.roPsqlUrl |
Строка подключения к БД PostgreSQL только для чтения |
" " |
elma365.db.roPsqlSecret |
Имя секрета со строкой подключения к БД PostgreSQL только для чтения, зашифрованной в Base64 (ключ RO_POSTGRES_URL) |
" " |
elma365.db.mongoUrl |
Строка подключения к БД MongoDB для приложения |
"mongodb://elma365:mongopassword@ mongo.default.svc.cluster.local: 27017/elma365?ssl=false&replicaSet= rs0&readPreference= secondaryPreferred" |
elma365.db.mongoSecret |
Имя секрета со строкой подключения к БД MongoDB для приложения, зашифрованной в Base64 (ключ MONGO_URL) |
" " |
elma365.db.vahterMongoUrl |
Строка подключения к БД MongoDB для сервера авторизации |
"mongodb://elma365:mongopassword@ mongo.default.svc.cluster.local: 27017/elma365?ssl=false&replicaSet= rs0&readPreference= secondaryPreferred" |
elma365.db.vahterMongoSecret |
Имя секрета со строкой подключения к БД MongoDB для сервера авторизации |
" " |
elma365.db.redisUrl |
Строка подключения к Redis |
"redis://redis.default.svc.cluster.local:6379/0" |
elma365.db.redisSecret |
Имя секрета со строкой подключения к Redis, зашифрованной в Base64 (ключ REDIS_URL) |
" " |
elma365.db.amqpUrl |
Строка подключения к RabbitMQ |
"amqp://elma365:rmqpassword@ rabbitmq.default.svc. cluster.local:5672/elma365" |
elma365.db.amqpSecret |
Имя секрета со строкой подключения к RabbitMQ, зашифрованной в Base64 (ключ AMQP_URL) |
" " |
elma365.db.s3.method |
Метод запросов |
PUT |
elma365.db.s3.accesskeyid |
Имя пользователя |
PZSF73JG72Ksd955JKU1HIA |
elma365.db.s3.secretaccesskey |
Пароль для пользователя |
aFDkj28Jbs2JKbnvJH678MNwiz88zKjsuNBHHs |
elma365.db.s3.bucket |
Список бакетов |
s3elma365 |
elma365.db.s3.backend.address |
Адрес s3 |
example.ru |
elma365.db.s3.backend.region |
Регион |
us-east-1 |
elma365.db.s3.ssl.enabled |
Включение SSL |
"false" |
elma365.db.s3Secret |
Имя секрета с подключением к S3 хранилищу файлов, зашифрованной в Base64 # (ключи S3_BACKEND_ADDRESS, S3_REGION, S3_KEY, S3_SECRET, S3_BUCKET, S3_SSL_ENABLED, S3_UPLOAD_METHOD) |
" " |
Настройки для подключения к SMTP серверу отправки почты |
||
elma365.mailer.smtp.host |
Адрес SMTP-сервера |
" " |
elma365.mailer.smtp.port |
Порт SMTP-сервера |
" " |
elma365.mailer.smtp.from |
Адрес отправителя электронной почты |
" " |
elma365.mailer.smtp.user |
Пользователь для авторизации на SMTP сервере |
" " |
elma365.mailer.smtp.password |
Пароль для авторизации на SMTP сервере |
" " |
elma365.mailer.smtp.needTLS |
Используется ли шифрование |
false |
Глобальные параметры сервиса «Аудит безопасности» |
||
elma365-addons.audit.global.psql_url |
Строка подключения к БД PostgreSQL |
"postgresql://postgres:pgpassword@ postgres.default.svc.cluster. local:5432/audit?sslmode=disable" |
elma365-addons.audit.image.repository |
Адрес для registry |
hub.elma365.tech |
elma365-addons.audit.image.pullSecret |
Секрет с правами доступа к приватному registry, должен быть создан вручную, зашифрованный в Base64 |
[yandexsecret] |