Управление секретами через Kubernetes Secrets
Параметр existingSecret позволяет хранить чувствительные данные (пароли, токены, credentials) в Kubernetes Secrets вместо values.yaml.
При использовании existingSecret Helm выполняет lookup секрета во время деплоя и подставляет значения напрямую.
Принцип работы
Если
existingSecretзадан — пароли берутся из указанного Kubernetes Secret по соответствующему ключу.Если
existingSecretне задан — используется значение изvalues.yaml(обратная совместимость сохранена).Если
existingSecretзадан, но секрет не найден в кластере — деплой завершится ошибкой.
Примечание
Секрет должен существовать до деплоя — Helm выполняет lookup во время рендеринга шаблонов.
Компоненты и ключи секретов
RabbitmqApp
RabbitmqApp:
existingSecret: <secret-name>
environments:
username: "rabbitmqadmin" # берётся из values.yaml, не из секрета
password: "" # используется только если existingSecret не задан
Ключ в секрете |
Поле в values.yaml |
Дефолт (если оба пусты) |
|---|---|---|
|
|
|
Примечание
username всегда берётся из RabbitmqApp.environments.username, секрет его не переопределяет.
Пример секрета:
apiVersion: v1
kind: Secret
metadata:
name: my-rabbitmq-secret
type: Opaque
stringData:
password: "StrongRabbitPassword"
EcosRegistryApp
EcosRegistryApp:
existingSecret: <secret-name>
environments:
adminPassword: "" # используется только если existingSecret не задан
Ключ в секрете |
Поле в values.yaml |
Дефолт (если оба пусты) |
|---|---|---|
|
|
|
Пример секрета:
apiVersion: v1
kind: Secret
metadata:
name: my-registry-secret
type: Opaque
stringData:
admin-password: "StrongRegistryPassword"
EcosIdentityApp (Keycloak)
EcosIdentityApp:
existingSecret: <secret-name>
environments:
password: "" # используется только если existingSecret не задан
Ключ в секрете |
Поле в values.yaml |
Дефолт (если оба пусты) |
|---|---|---|
|
|
|
Пример секрета:
apiVersion: v1
kind: Secret
metadata:
name: my-identity-secret
type: Opaque
stringData:
password: "StrongKeycloakPassword"
EcosProxyApp
EcosProxyApp:
existingSecret: <secret-name>
eisIntegration:
clientSecret: "" # используется только если existingSecret не задан
Ключ в секрете |
Поле в values.yaml |
Дефолт (если оба пусты) |
|---|---|---|
|
|
|
Пример секрета:
apiVersion: v1
kind: Secret
metadata:
name: my-proxy-secret
type: Opaque
stringData:
client-secret: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
EcosGatewayApp
EcosGatewayApp:
existingSecret: <secret-name>
Ключ в секрете |
Поле в values.yaml |
Дефолт (если оба пусты) |
|---|---|---|
|
— (нет прямого поля в values) |
— (ключ optional) |
Примечание
Ключ truststore-password помечен как optional: true. Если ключ отсутствует в секрете — env var GATEWAY_TRUSTSTORE_PASSWORD просто не будет установлен.
Пример секрета:
apiVersion: v1
kind: Secret
metadata:
name: my-gateway-secret
type: Opaque
stringData:
truststore-password: "strongpassword"
MongoDBApp
MongoDBApp:
existingSecret: <secret-name>
environments:
username: "" # берётся из values.yaml, не из секрета
password: "" # используется только если existingSecret не задан
Ключ в секрете |
Поле в values.yaml |
Дефолт (если оба пусты) |
|---|---|---|
|
|
|
Примечание
username всегда берётся из MongoDBApp.environments.username, секрет его не переопределяет.
Пример секрета:
apiVersion: v1
kind: Secret
metadata:
name: my-mongodb-secret
type: Opaque
stringData:
password: "StrongMongoPassword"
EcosPostgresqlApp
EcosPostgresqlApp:
existingSecret: <secret-name>
environments:
password: "" # пароль superuser — только если existingSecret не задан
databases:
ecosApp:
username: alfresco
password: "" # только если existingSecret не задан
ecosFlowable:
username: alfresco
password: "" # только если existingSecret не задан
Ключ в секрете |
Поле в values.yaml |
Дефолт (если оба пусты) |
|---|---|---|
|
|
|
|
|
|
|
|
|
Пример секрета:
apiVersion: v1
kind: Secret
metadata:
name: my-postgresql-secret
type: Opaque
stringData:
password: "StrongPostgresPassword"
alfresco-db-password: "AlfrescoDbPassword"
flowable-db-password: "FlowableDbPassword"
EcosMicroservicesPostgresqlApp
EcosMicroservicesPostgresqlApp:
existingSecret: <secret-name>
environments:
username: "" # postgres superuser username — не берётся из секрета
password: "" # postgres superuser password — только если existingSecret не задан
databases:
ecosAppsApp:
database: ecos_apps
username: apps # определяет ключ секрета: apps-password
password: appspassword # только если existingSecret не задан
ecosGatewayApp:
username: gateway # ключ секрета: gateway-password
password: gatewaypassword
# ... и т.д. для каждой БД
Ключи паролей для каждой базы данных формируются по шаблону ``{username}-password``:
Ключ в секрете |
|
Поле в values.yaml |
|---|---|---|
|
— (superuser) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Важно
Если username изменён в values.yaml, ключ в секрете должен быть обновлён соответственно. Например, если username: myapps — ключ должен быть myapps-password.
Пример секрета:
apiVersion: v1
kind: Secret
metadata:
name: my-microservices-postgresql-secret
type: Opaque
stringData:
postgres-password: "StrongPostgresPassword"
apps-password: "AppsDbPassword"
gateway-password: "GatewayDbPassword"
uiserv-password: "UiservDbPassword"
notifications-password: "NotificationsDbPassword"
history-password: "HistoryDbPassword"
integrations-password: "IntegrationsDbPassword"
model-password: "ModelDbPassword"
reports-password: "ReportsDbPassword"
casemodel-password: "CasemodelDbPassword"
eis-password: "EisDbPassword"
process-password: "ProcessDbPassword"
camunda-password: "CamundaDbPassword"
edi-password: "EdiDbPassword"
EcosApp
EcosApp:
existingSecret: <secret-name>
environments:
alfresco:
ldap:
enabled: true
injectSyncCredentials: false # false — пароль не берётся из секрета
injectTruststorePassphrase: false # false — пароль не берётся из секрета
mail:
password: "" # используется только если existingSecret не задан
injectPasswordFromSecret: false # false — пароль не берётся из секрета
injectFlowablePasswordFromSecret: false
dataSource:
alfresco:
password: "" # используется если EcosPostgresqlApp.enabled: false
flowable:
password: "" # используется если EcosPostgresqlApp.enabled: false
Ключ в секрете |
Поле в values.yaml |
Управляющий флаг |
Дефолт |
|---|---|---|---|
|
|
— (всегда при existingSecret) |
|
|
|
— (всегда при existingSecret) |
|
|
— (нет прямого поля) |
|
— |
|
— (нет прямого поля) |
|
— |
|
|
|
— |
|
— (нет прямого поля) |
|
— |
Примечание
При injectPasswordFromSecret: true пароль подставляется в свойство mail.password (Alfresco mail). При injectFlowablePasswordFromSecret: true — в flowable.mail.server.password (Flowable mail). Оба можно использовать одновременно с разными паролями.
Пример секрета (полный):
apiVersion: v1
kind: Secret
metadata:
name: my-ecos-app-secret
type: Opaque
stringData:
alfresco-db-password: "AlfrescoDbPassword"
flowable-db-password: "FlowableDbPassword"
ldap-sync-credentials: "LdapBindPassword"
ldap-truststore-passphrase: "strongpassword"
mail-password: "AlfrescoMailPassword"
flowable-mail-password: "FlowableMailPassword"
Полный пример конфигурации
RabbitmqApp:
existingSecret: my-rabbitmq-secret
EcosRegistryApp:
existingSecret: my-registry-secret
EcosIdentityApp:
existingSecret: my-identity-secret
EcosProxyApp:
existingSecret: my-proxy-secret
EcosGatewayApp:
existingSecret: my-gateway-secret
MongoDBApp:
existingSecret: my-mongodb-secret
EcosPostgresqlApp:
existingSecret: my-postgresql-secret
EcosMicroservicesPostgresqlApp:
existingSecret: my-microservices-postgresql-secret
EcosApp:
existingSecret: my-ecos-app-secret
environments:
alfresco:
ldap:
enabled: true
injectSyncCredentials: true
injectTruststorePassphrase: false
mail:
injectPasswordFromSecret: true
injectFlowablePasswordFromSecret: true