Установка модуля "Рабочее место AWP"#

Установка#

Сборка docker-образа установку или развертывание на стенд осуществляется сборочной службой в составе FEX.

Конфигурирование компонентов AWP#

Конфигурирование компонентов AWP осуществляется путем заполнения файла application.properties, который находится по пути /{component_dir}/resource/
Файл заполняется в формате {key}={value}
В контексе развертывания в контейнеризированной среде application.properties заполняется через объект kind:ConfigMap, используемый в kind:Deployment соответствующего компонента.

AWP BackEnd Configurator#

Основные параметры приложения AWP BackEnd Configurator:

Параметр

Значение по умолчанию

Обязателен

Описание

Пример

spring.cloud.vault.enabled

Отсутствует

Да

Параметр, отвечающий за использование Spring Cloud Vault для работы с HashiCorp Vault - системой управления секретами и конфигурациями. При использовании Vauld Agent для работы с HashiCorp Vault должен быть задан 'false'

false

spring.config.import

Отсутствует

Нет

Импортирование дополнительных настроек из указанного в значении источника

file:/vault/secrets/secrets.properties

server.port

Отсутствует

Да

Порт, на котором будет запущено Spring Boot-приложение(порт указанный в kind:Deployment)

8080

spring.jpa.hibernate.ddl-auto

Отсутствует

Да

Стратегия управления базой данных для Hibernate. Значение none означает, что Hibernate не будет автоматически создавать, обновлять или удалять структуру базы данных

none

jwt.verify.enable

Отсутствует

Да

Параметр, отвечающий за проверку подписи JWT-токена

true

spring.profiles.active

Отсутствует

Да

Профиль Spring-приложения. Может иметь одно из двух значений - AUTHORIZATION_OWN или AUTHORIZATION_EXTERNAL_KEYCLOAK. При активном профиле AUTHORIZATION_EXTERNAL_KEYCLOAK создается компонент для предоставления публичного ключа для проверки JWT-токена. При активном профиле AUTHORIZATION_OWN создается компонент для предоставления публичного ключа из JWS, указанного в параметре jwt.trust.path

AUTHORIZATION_OWN

jwt.pubkey.update.period

Отсутствует

Да

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

0 * * * * *

jwt.keycloak.info.url

Отсутствует

Да

URL-адрес для получения информации о JWT-токенах

https://example.ru/jwt

server.ssl.enabled

Отсутствует

Да

Параметр позволяет настроить TLS-соединение для передачи запросов в сторону OIDC Provider сервиса

false

server.ssl.client-auth

Отсутствует

Да

Режим проверки сертификата клиента для доступа к компоненту

none

security.rbac*

Отсутствует

Да

Параметр, определяющий контроль доступа к ресурсам на основе ролевой модели

-

spring.datasource.url

Отсутствует

Да

URL-адрес базы данных TFSX для подключения. Значение задается в формате jdbc:postgresql://{hostname}}:{port}/{db-scheme}

jdbc:postgresql://example.db.ru:4321/MYSCHEME

spring.datasource.driverClassName

Отсутствует

Да

Имя класса драйвера JDBC для PostgreSQL

org.postgresql.Driver

spring.jpa.database-platform

Отсутствует

Да

Диалект Hibernate для работы с PostgreSQL

org.hibernate.dialect.PostgreSQL95Dialect

spring.jpa.properties.hibernate.default_schema

Отсутствует

Да

Схема базы данных, которая по умолчанию используется для всех запросов Hibernate

MYSCHEME

spring.datasource.hikari.maximum-pool-size

Отсутствует

Да

Максимальный размер пула подключений к базе данных

1

server.ssl.trust-store

Отсутствует

Да

Параметр указывает путь к файлу хранилища доверенных сертификатов

/certs/file.p12

server.ssl.trust-store-password**

Отсутствует

Да

Пароль для защиты файла с публичным ключом

qwerty123

jwt.trust.path

Отсутствует

Да

Путь к файлу, содержащему публичный ключ для проверки подлинности JWT-токенов

/certs/file.jks

jwt.trust.password**

Отсутствует

Да

Пароль для защиты файла с публичным ключом

qwerty123

jwt.trust.pub.key.alias

Отсутствует

Да

Псевдоним (alias) публичного ключа для проверки подлинности JWT-токенов

qwerty-alias

AWP BackEnd#

Основные параметры приложения AWP BackEnd:

Параметр

Значение по умолчанию

Обязателен

Описание

Пример

spring.cloud.vault.enabled

Отсутствует

Да

Параметр, отвечающий за использование Spring Cloud Vault для работы с HashiCorp Vault - системой управления секретами и конфигурациями. При использовании Vauld Agent для работы с HashiCorp Vault должен быть задан 'false'

false

spring.config.import

Отсутствует

Нет

Импортирование дополнительных настроек из указанного в значении источника

file:/vault/secrets/secrets.properties

server.port

Отсутствует

Да

Порт, на котором будет запущено Spring Boot-приложение(порт указанный в kind:Deployment)

8080

spring.jpa.hibernate.ddl-auto

Отсутствует

Да

Стратегия управления базой данных для Hibernate. Значение none означает, что Hibernate не будет автоматически создавать, обновлять или удалять структуру базы данных

none

jwt.verify.enable

Отсутствует

Да

Параметр, отвечающий за проверку подписи JWT-токена

true

spring.profiles.active

Отсутствует

Да

Профиль Spring-приложения. Может иметь одно из двух значений - AUTHORIZATION_OWN или AUTHORIZATION_EXTERNAL_KEYCLOAK. При активном профиле AUTHORIZATION_EXTERNAL_KEYCLOAK создается компонент для предоставления публичного ключа для проверки JWT-токена. При активном профиле AUTHORIZATION_OWN создается компонент для предоставления публичного ключа из JWS, указанного в параметре jwt.trust.path

AUTHORIZATION_OWN

jwt.pubkey.update.period

Отсутствует

Да

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

0 * * * * *

jwt.keycloak.info.url

Отсутствует

Да

URL-адрес для получения информации о JWT-токенах

https://example.ru/jwt

server.ssl.enabled

Отсутствует

Да

Параметр позволяет настроить TLS-соединение для передачи запросов в сторону OIDC Provider сервиса

false

server.ssl.client-auth

Отсутствует

Да

Режим проверки сертификата клиента для доступа к компоненту

none

security.rbac*

Отсутствует

Да

Параметр, определяющий контроль доступа к ресурсам на основе ролевой модели

-

spring.datasource.url

Отсутствует

Да

URL-адрес базы данных TFSX для подключения. Значение задается в формате jdbc:postgresql://{hostname}:{port}/{db-scheme}

jdbc:postgresql://example.db.ru:4321/MYSCHEME

spring.datasource.driverClassName

Отсутствует

Да

Имя класса драйвера JDBC для PostgreSQL

org.postgresql.Driver

spring.jpa.database-platform

Отсутствует

Да

Диалект Hibernate для работы с PostgreSQL

org.hibernate.dialect.PostgreSQL95Dialect

spring.jpa.properties.hibernate.default_schema

Отсутствует

Да

Схема базы данных, которая по умолчанию используется для всех запросов Hibernate

MYSCHEME

spring.datasource.hikari.maximum-pool-size

Отсутствует

Да

Максимальный размер пула подключений к базе данных

1

server.ssl.trust-store

Отсутствует

Да

Параметр указывает путь к файлу хранилища доверенных сертификатов

/certs/file.p12

server.ssl.trust-store-password**

Отсутствует

Да

Пароль для защиты файла с публичным ключом

qwerty123

jwt.trust.path

Отсутствует

Да

Путь к файлу, содержащему публичный ключ для проверки подлинности JWT-токенов

/certs/file.jks

jwt.trust.password**

Отсутствует

Да

Пароль для защиты файла с публичным ключом

qwerty123

jwt.trust.pub.key.alias

Отсутствует

Да

Псевдоним (alias) публичного ключа для проверки подлинности JWT-токенов

qwerty-alias

AWP BACKEND SCIM#

Параметры описывающие настройку SCIM контроллеров:

Параметр

Значение по умолчанию

Обязателен

Описание

Пример

scim.patch.supportedscim.bult.supportedscim.bult.maxOperationsscim.bult.maxPayloadSize

Отсутствует

Да

Поддержка операции patch

truefalse00

scim.filter.supported

Отсутствует

Да

Поддержка фильтрации

true

scim.filter.maxResult

Отсутствует

Да

Максимальный результат для фильтрации

5000

scim.changePassword.supported

Отсутствует

Да

Поддержка смены пароля

false

scim.sort.supportedscim.etag.supported

Отсутствует

Да

Поддержка сортировки

falsefalse

scim.authenticationSchemes.name

Отсутствует

Да

Имя схемы аутентификации

Mutual TLS

scim.authenticationSchemes.type

Отсутствует

Да

Тип аутентификации (для SCIM контроллеров)

mTLS

scim.authenticationSchemes.description

Отсутствует

Да

Описание схемы аутентификации

Mutual authentication or two-way authentication…

AUDIT#

Параметры отправки событий Аудита:

Параметр

Значение по умолчанию

Обязателен

Описание

Пример

audit.properties.enabled.mock

Отсутствует

Да

Параметр, позволяющий отключить/включить отправление событий в Аудит

true

audit.properties.main.server

Отсутствует

Да

Основная кафка для отправки сообщений аудита.

host:port

audit.properties.fallback.server

Отсутствует

Да

Дополнительная кафка, для отправления если основная недоступна.

host:port

audit.properties.security.protocol

Отсутствует

Да

Включение безопасного соединения для транспорта. SSL или PLAINTEXT

SSL

audit.properties.ssl.protocol

Отсутствует

Нет

Версия протокола безопасного соединения SSL(TLS1.2/TLS1.3)

TLS1.2

audit.properties.ssl.key.password**

Отсутствует

Нет

Пароль к закрытому ключу

qwerty123

audit.properties.ssl.keystore.location

Отсутствует

Нет

Путь к хранилищу закрытых ключей

/certs/file.jks

audit.properties.ssl.keystore.password**

Отсутствует

Нет

Пароль к хранилищу закрытых ключей

qwerty123

audit.properties.ssl.truststore.location

Отсутствует

Нет

Путь к хранилищу доверенных сертификатов

/certs/file.jks

audit.properties.ssl.truststore.password**

Отсутствует

Нет

Пароль к хранилищу доверенных сертификатов

qwerty123

Данные параметры добавляются в application.properties приложения в дополнение к основным.

Kubernetes probes, Prometheus metrics#

Параметр

Значение по умолчанию

Обязателен

Описание

Пример

management.endpoint.health.probes.enabled

Отсутствует

Нет

Параметр включает проверку состояния приложения с помощью проб (health probes).

true

management.health.livenessState.enabled

Отсутствует

Нет

Параметр включает определение состояния жизнеспособности (liveness state) приложения.

true

management.health.readinessState.enabled

Отсутствует

Нет

Параметр включает определение состояния готовности (readiness state) приложения.

true

management.metrics.export.prometheus.enabled

Отсутствует

Нет

Параметр включает экспорт метрик в формате Prometheus

true

management.endpoint.prometheus.enabled

Отсутствует

Нет

Параметр включает доступность конечной точки Prometheus через веб-интерфейс

true

management.endpoint.metrics.enabled

Отсутствует

Нет

Параметр включает доступность конечной точки метрик через веб-интерфейс

true

management.endpoints.web.exposure.include

Отсутствует

Нет

Параметр указывает, какие конечные точки управления (management endpoints) должны быть доступны через веб-интерфейс.

health,refresh,prometheus

management.metrics.distribution.percentiles-histogram."[http.server.requests]"

Отсутствует

Нет

Параметр включает распределение процентилей (percentiles) для метрики http.server.requests. Процентили показывают распределение времени ответа для HTTP-запросов.

true

Данные параметры добавляются в application.properties приложения в дополнение к основным.

Примечания:#

  1. * - security.rbac значение данного параметра имеет формат json. Описание и пример доступны в разделе "Авторизация". Конфигурирование ролевой модели в модуле AWP

  2. ** - значения данных параметров являются паролями/сертификатами или другой информацией, которая относится к категории "секреты". Хранить их в открытом виде не соответствует сандартам безопасности.

Команда разработки настоятельно рекомендует расположить **параметры и их значения в хранилище секретов(Vault KV совместимое хранилище)
Использовать механизмы Vault Agent для их получения и spring.config.import для их импорта

Примеры ConfigMap приложений#

AWP BackEnd

kind: ConfigMap
apiVersion: v1
metadata:
  name: tfsx-awp-arm-application-cm
data:
  application.properties: >-
    spring.cloud.vault.enabled=false

    spring.config.import=file:/vault/secrets/secrets.properties

    server.port=8080

    spring.jpa.hibernate.ddl-auto=none

    jwt.verify.enable=true

    spring.profiles.active=AUTHORIZATION_EXTERNAL_KEYCLOAK

    jwt.pubkey.update.period=0 * * * * *

    jwt.keycloak.info.url=http://oidc.cluster.example.ru.ru:4001/jwt

    server.ssl.enabled=false

    server.ssl.client-auth=none

    security.rbac={"ADMIN":{"POST":["/rest/v1/node","/rest/v1/certificate","/rest/v1/routes/enable","/rest/v1/routes/disable"],"GET":["/rest/v1/node","/rest/v1/certificate","/rest/v1/events","/rest/v1/routes","/rest/v1/whoami","/rest/v1/transactionLogs"]},"AUDITOR":{"GET":["/rest/v1/node","/rest/v1/certificate","/rest/v1/events","/rest/v1/routes","/rest/v1/whoami","/rest/v1/transactionLogs"]}}

    spring.datasource.url=jdbc:postgresql://psql.cluster.example.ru.ru:3001/MYSCHEME

    spring.datasource.driverClassName=org.postgresql.Driver

    spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialect

    spring.jpa.properties.hibernate.default_schema=tfsdb

    spring.datasource.hikari.maximum-pool-size=2

    server.ssl.trust-store=/tfs_awp_backend/resource/certs/file.p12

    server.ssl.key-store=/tfs_awp_backend/resource/certs/file.p12

    jwt.trust.path=/tfs_awp_backend/resource/certs/jwt.trust.path.jks

    management.endpoint.health.probes.enabled=true

    management.health.livenessState.enabled=true

    management.health.readinessState.enabled=true

    management.endpoints.web.exposure.include=health,refresh,prometheus

    management.metrics.export.prometheus.enabled=true

    management.metrics.distribution.percentiles-histogram."[http.server.requests]"=true

    audit.properties.enabled.mock=false

    audit.properties.main.server=ip:9094

    audit.properties.fallback.server=ip:9094

    audit.properties.security.protocol=PLAINTEXT

    audit.properties.ssl.protocol=

    audit.properties.ssl.keystore.location=/tfs_awp_backend/resource/certs/file.jks

    audit.properties.ssl.truststore.location=/tfs_awp_backend/resource/certs/file.jks

    scim.patch.supported=true

    scim.bult.supported=false

    scim.bult.maxOperations=0

    scim.bult.maxPayloadSize=0

    scim.filter.supported=true

    scim.filter.maxResult=5000

    scim.changePassword.supported=false

    scim.sort.supported=false

    scim.etag.supported=false

    scim.authenticationSchemes.name=mTLS

    scim.authenticationSchemes.type=Mutual TLS

    scim.authenticationSchemes.description=Mutual authentication or two-way
    authenticationrefers to two parties authenticating each other at the same
    timein an authentication protocol
    
  # Ниже указаны параметры, указывать которые в СonfigMap не соответствует стандартам безопасности
  # Настоятельно рекомендуем расположить данные параметры в хранилище секретов
  # Приведены исключительно для наглядного примера конфигурации
    
    spring.datasource.password=123456

    server.ssl.trust-store-password=123456

    server.ssl.key-store-password=123456

    jwt.trust.password=123456

    audit.properties.ssl.key.password=123456

    audit.properties.ssl.keystore.password=123456

    audit.properties.ssl.truststore.password=123456

AWP BackEnd Configurator

kind: ConfigMap
apiVersion: v1
metadata:
  name: tfsx-awp-configurator-cm
data:
  application.properties: >-
    spring.cloud.vault.enabled=false

    spring.config.import=file:/vault/secrets/secrets.properties

    server.port=8080

    spring.jpa.hibernate.ddl-auto=none

    jwt.verify.enable=true

    spring.profiles.active=AUTHORIZATION_EXTERNAL_KEYCLOAK

    jwt.pubkey.update.period=0 * * * * *

    jwt.keycloak.info.url=http://oidc.cluster.example.ru.ru:4001/jwt

    features.visible.featureToggle=true

    spring.datasource.driver-class-name=org.postgresql.Driver

    spring.datasource.url=jdbc:postgresql://psql.cluster.example.ru.ru:3001/MYSCHEME

    spring.datasource.hikari.maximum-pool-size=1

    spring.jpa.properties.hibernate.default_schema=TFSDB

    spring.constructordatasource.driver-class-name=org.postgresql.Driver

    spring.constructordatasource.hikari.maximum-pool-size=1

    spring.jpa.properties.hibernate.constructor_schema=tfs_constructor

    spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialect

    spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

    jwt.trust.path=/tfs_configurator_backend/resource/certs/file.jks

    audit.properties.enabled.mock=false

    audit.properties.main.server=ip:9094

    audit.properties.fallback.server=ip:9094

    audit.properties.security.protocol=PLAINTEXT

    audit.properties.ssl.protocol=

    audit.properties.ssl.keystore.location=/tfs_configurator_backend/resource/certs/file.jks

    audit.properties.ssl.truststore.location=/tfs_configurator_backend/resource/certs/file.jks

    management.endpoint.health.probes.enabled=true

    management.health.livenessState.enabled=true

    management.health.readinessState.enabled=true

    management.endpoints.web.exposure.include=health,refresh,prometheus

    management.metrics.export.prometheus.enabled=true

    management.metrics.distribution.percentiles-histogram."[http.server.requests]"=true

    server.ssl.enabled=false

    server.ssl.client-auth=none

    security.rbac={"ADMIN":{"POST":["/rest/v1/integrations/**/**","/rest/v1/contexts/**/**"],"PUT":["/rest/v1/integrations/**/**","/rest/v1/contexts/**/**"],"GET":["/rest/v1/integrations/**/**","/rest/v1/contexts/**/**","/rest/v1/whoami"]},"AUDITOR":{"GET":["/rest/v1/integrations/**/**","/rest/v1/contexts/**/**","/rest/v1/whoami"]}}

    server.ssl.trust-store=/tfs_configurator_backend/resource/certs/file.p12

    server.ssl.key-store=/tfs_configurator_backend/resource/certs/file.p12
                            
  # Ниже указаны параметры, указывать которые в СonfigMap не соответствует стандартам безопасности
  # Настоятельно рекомендуем расположить данные параметры в хранилище секретов
  # Приведены исключительно для наглядного примера конфигурации
                            
    spring.datasource.password=123456

    server.ssl.trust-store-password=123456

    server.ssl.key-store-password=123456

    jwt.trust.password=123456

    audit.properties.ssl.key.password=123456

    audit.properties.ssl.keystore.password=123456

    audit.properties.ssl.truststore.password=123456

Настройка входящих подключений#

Предполагается, что уже настроен ingress-gateway и service для него.

Объявление Ingress-controller до service ingress:

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: ingress-controller # имя вашего Ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-passthrough: 'true'
    nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    # на данном этапе должны быть объявлены 3 hosts(по одному на каждый компонент AWP)
    # объявленные hostname будут использоваться в вашем сервисе, который выступает как прокси
    - host: awp-frontend.cluster.example.ru.ru # для AWP frontend
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: ingress-svc
                port:
                  number: 8443
    - host: awp-backend.cluster.example.ru.ru # для AWP backend
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: ingress-svc
                port:
                  number: 8443
    - host: awp-backend-configurator.cluster.example.ru.ru # для AWP backend configurator
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: ingress-svc
                port:
                  number: 8443

Создание Gateway:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: ingress-gw
spec:
  selector:
    istio: ingress.cluster.example.ru.ru
  servers:
    - hosts:
        # применим ко всем hosts AWP
        - awp-frontend.cluster.example.ru.ru
        - awp-backend.cluster.example.ru.ru
        - awp-backend-configurator.cluster.example.ru.ru
      port:
        name: https-443
        number: 8443
        protocol: HTTPS
      # настройки mTLS
      tls:
        caCertificates: /istio/ingressgateway-certs/ca-chain.cert.pem
        mode: MUTUAL
        privateKey: /istio/ingressgateway-certs/tls.key
        serverCertificate: /istio/ingressgateway-certs/tls.crt

Объявление service's для приложений-компонентов AWP:

AWP FrontEnd

kind: Service
apiVersion: v1
metadata:
  name: tfsx-awp-frontend-svc
spec:
  ipFamilies:
    - IPv4
  ports:
    - name: http-8080
      protocol: TCP
      port: 8080
      targetPort: 8080
  internalTrafficPolicy: Cluster
  type: ClusterIP
  ipFamilyPolicy: SingleStack
  sessionAffinity: None
  selector:
    app: tfsx-awp-frontend # метка POD с приложением 

AWP BackEnd

kind: Service
apiVersion: v1
metadata:
  name: tfsx-awp-arm-svc
spec:
  ipFamilies:
    - IPv4
  ports:
    - name: http-8080
      protocol: TCP
      port: 8080
      targetPort: 8080
  internalTrafficPolicy: Cluster
  type: ClusterIP
  ipFamilyPolicy: SingleStack
  sessionAffinity: None
  selector:
    app: tfsx-awp-arm # метка пода с приложением 

AWP BackEnd Configurator

kind: Service
apiVersion: v1
metadata:
  name: tfsx-awp-configurator-svc
spec:
  ipFamilies:
    - IPv4
  ports:
    - name: http-8080
      protocol: TCP
      port: 8080
      targetPort: 8080
  internalTrafficPolicy: Cluster
  type: ClusterIP
  ipFamilyPolicy: SingleStack
  sessionAffinity: None
  selector:
    app: tfsx-awp-configurator # метка POD с приложением 

Направление трафика с ingress на сервисы приложений:

AWP FrontEnd

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ingress-tfsx-awp-frontend-vs
spec:
  exportTo:
    - .
  gateways:
    - ingress-gw
  hosts:
    - awp-frontend.cluster.example.ru.ru
  http:
    - match:
        - gateways:
            - ingress-gw
        - uri:
            prefix: /
      route:
        - destination:
            host: tfsx-awp-frontend-svc
            port:
              number: 8080
          weight: 100

AWP BackEnd

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ingress-tfsx-awp-arm-vs
spec:
  exportTo:
    - .
  gateways:
    - ingress-gw
  hosts:
    - awp-backend.cluster.example.ru.ru
  http:
    - match:
        - gateways:
            - ingress-gw
        - uri:
            prefix: /
      route:
        - destination:
            host: tfsx-awp-arm-svc
            port:
              number: 8080
          weight: 100

AWP BackEnd Configurator

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ingress-tfsx-awp-configurator-vs
spec:
  exportTo:
    - .
  gateways:
    - ingress-gw
  hosts:
    - awp-backend-configurator.cluster.example.ru.ru
  http:
    - match:
        - gateways:
            - ingress-gw
        - uri:
            prefix: /
      route:
        - destination:
            host: tfsx-awp-configurator-svc
            port:
              number: 8080
          weight: 100

Настройка исходящих подключений#

Предполагается, что настроен egress и service для него.

Настройка исходящего соединения для БД Postgres.

Настройка Gateway:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: egress-gw
spec:
  selector:
    istio: egress.cluster.example.ru.ru
  servers:
    - hosts:
        - psql.cluster.example.ru.ru # hostname, по которому доступна БД Postgres
      port:
        name: tcp-3000
        number: 3000 # порт на egress, заранее убедитесь, что нужный порт открыт
        protocol: TLS
      # межподовый mTLS
      tls:
        mode: ISTIO_MUTUAL

Объявление ServiceEntry до БД Postgres:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: egress-postgres-se
spec:
  addresses:
    - {ip}/32 # ip-адрес вашей БД
  endpoints:
    - address: {ip} # ip-адрес вашей БД
  exportTo:
    - .
  hosts:
    - psql.cluster.example.ru.ru # hostname, по которому доступна БД Postgres
  location: MESH_EXTERNAL
  ports:
    - name: tcp-5432
      number: 5432 # порт БД Postgres
      protocol: TCP # протокол должен быть указан "Postgres"(регистр не важен) при использовании mTLS 
    # порт БД Postgres, указанный а application.properties
    - name: tcp-3001
      number: 3001
      protocol: TCP
  resolution: STATIC # при использовании "DNS", нужно убрать поля addresses и endpoints

Если необходим TLS до ресурсов, к которым производится подключение, настройте DestinationRule:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: egress-postgres-dsr
spec:
  exportTo:
    - .
  host: psql.cluster.example.ru.ru # hostname, по которому доступна БД Postgres
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      - port:
          number: 5432 # порт БД Postgres
        tls:
          # для организации mTLS используем сертификаты на egress
          caCertificates: /istio/pg-certs/pg-ca-chain.cert.pem
          clientCertificate: /istio/pg-certs/pg-tls.crt
          mode: MUTUAL
          privateKey: /istio/pg-certs/pg-tls.key
          sni: psql.cluster.example.ru.ru # SNI сервера БД

Направление трафика из приложений на egress и с egress на целевой хост:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: egress-postgres-vs
spec:
  gateways:
    - mesh
    - egress-gw
  hosts:
    - psql.cluster.example.ru.ru # hostname, который указан в properties приложения
  tcp:
    - match:
        - gateways:
            - mesh
          port: 3001 # порт БД Postgres, который указан в properties приложения
      route:
        - destination:
            host: egress-svc
            port:
              number: 3000 # внутренний порт egress
            subset: postgres
    - match:
        - gateways:
            - egress-gw
          port: 3000 # внутренний порт egress
      route:
        - destination:
            host: psql.cluster.example.ru.ru # hostname, по которому доступна БД Postgres
            port:
              number: 5432 # порт БД Postgres
          weight: 100

Настройка исходящего соединения для OIDC Provider.

Добавьте настройки в Gateway:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: egress-gw
spec:
  selector:
    istio: egress.cluster.example.ru.ru
  servers:
    - hosts:
        - psql.cluster.example.ru.ru # hostname, по которому доступна БД Postgres
      port:
        name: tcp-3000
        number: 3000 # порт на egress, заранее убедитесь, что нужный порт открыт
        protocol: TLS
      # межподовый mTLS
      tls:
        mode: ISTIO_MUTUAL
    # новый блок для OIDC(https)
    - hosts:
        - oidc.cluster.example.ru.ru # hostname, по которому доступен OIDC Provider
      port:
        name: https-4000
        number: 4000 # порт на egress, заранее убедитесь, что нужный порт открыт
        protocol: TLS
      # межподовый mTLS
      tls:
        mode: ISTIO_MUTUAL

Объявление ServiceEntry до OIDC Provider:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: egress-oidc-se
spec:
  exportTo:
    - .
  hosts:
    - oidc.cluster.example.ru.ru # hostname, по которому доступен OIDC Provider
  location: MESH_EXTERNAL
  ports:
    - name: https-443
      number: 443 # порт OIDC Provider
      protocol: TCP
    # порт OIDC Provider, указанный а application.properties
    - name: http-4001
      number: 4001
      protocol: TCP
  resolution: DNS

Если необходим TLS до ресурсов, к которым производится подключение, настройте DestinationRule:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: egress-oidc-dsr
spec:
  exportTo:
    - .
  host: oidc.cluster.example.ru.ru # hostname, по которому доступен OIDC Provider
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      - port:
          number: 443 # порт OIDC Provider
        tls:
          # для организации mTLS используем сертификаты на egress
          caCertificates: /istio/oidc-certs/oidc-ca-chain.cert.pem
          clientCertificate: /istio/oidc-certs/oidc-tls.crt
          mode: MUTUAL
          privateKey: /istio/oidc-certs/oidc-tls.key
          sni: oidc.cluster.example.ru.ru # SNI сервера OIDC

Направление трафика из приложений на egress и с egress на целевой хост:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: egress-oidc-vs
spec:
  gateways:
    - mesh
    - egress-gw
  hosts:
    - oidc.cluster.example.ru.ru # hostname, который указан в properties приложения
  tcp:
    - match:
        - gateways:
            - mesh
          port: 4001 # порт OIDC Provider, который указан в properties приложения
      route:
        - destination:
            host: egress-svc
            port:
              number: 4000 # внутренний порт egress
            subset: postgres
    - match:
        - gateways:
            - egress-gw
          port: 4000 # внутренний порт egress
      route:
        - destination:
            host: oidc.cluster.example.ru.ru # hostname, по которому доступен OIDC Provider
            port:
              number: 443 # порт OIDC Provider
          weight: 100

Настройка исходящего соединения для Аудита(kafka).

Добавьте настройки в Gateway:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: egress-gw
spec:
  selector:
    istio: egress.cluster.example.ru.ru
  servers:
    - hosts:
        - psql.cluster.example.ru.ru # hostname, по которому доступна БД Postgres
      port:
        name: tcp-3000
        number: 3000 # порт на egress, заранее убедитесь, что нужный порт открыт
        protocol: TLS
      # межподовый mTLS
      tls:
        mode: ISTIO_MUTUAL
    - hosts:
        - oidc.cluster.example.ru.ru # hostname, по которому доступен OIDC Provider
      port:
        name: https-4000
        number: 4000 # порт на egress, заранее убедитесь, что нужный порт открыт
        protocol: HTTPS
      # межподовый mTLS
      tls:
        mode: ISTIO_MUTUAL
    # новый блок для AUDIT(kafka)
    - hosts:
        - audit.cluster.example.ru.ru # hostname, по которому доступен AUDIT
      port:
        name: tcp-5000
        number: 5000 # порт на egress, заранее убедитесь, что нужный порт открыт
        protocol: TLS
      # межподовый mTLS
      tls:
        mode: ISTIO_MUTUAL

Объявление ServiceEntry до AUDIT:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: egress-audit-se
spec:
  exportTo:
    - .
  hosts:
    - audit.cluster.example.ru.ru # hostname, по которому доступен AUDIT
  location: MESH_EXTERNAL
  ports:
    - name: tcp-9094
      number: 9094 # порт kafka-broker
      protocol: TCP
  resolution: DNS

Если необходим TLS до ресурсов, к которым производится подключение, настройте DestinationRule:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: egress-audit-dsr
spec:
  exportTo:
    - .
  host: audit.cluster.example.ru.ru # hostname, по которому доступен AUDIT
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      - port:
          number: 9094 # порт порт kafka-broker
        tls:
          # для организации mTLS используем сертификаты на egress
          caCertificates: /istio/kafka-certs/kafka-ca-chain.cert.pem
          clientCertificate: /istio/kafka-certs/kafka-tls.crt
          mode: MUTUAL
          privateKey: /istio/kafka-certs/kafka-tls.key
          sni: audit.cluster.example.ru.ru # SNI сервера Kafka

Направление трафика из приложений на egress и с egress на целевой хост:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: egress-audit-vs
spec:
  gateways:
    - mesh
    - egress-gw
  hosts:
    - audit.cluster.example.ru.ru # hostname, который указан в properties приложения
  tcp:
    - match:
        - gateways:
            - mesh
          port: 9094 # порт AUDIT, который указан в properties приложения
      route:
        - destination:
            host: egress-svc
            port:
              number: 5000 # внутренний порт egress
            subset: postgres
    - match:
        - gateways:
            - egress-gw
          port: 5000 # внутренний порт egress
      route:
        - destination:
            host: audit.cluster.example.ru.ru # hostname, по которому доступен AUDIT
            port:
              number: 9094 # порт AUDIT
          weight: 100

ISTIO MUTUAL(опционально):

Укажите ISTIO_MUTUAL в egress-gw, как это сделано в примерах на данной странице:

      tls:
        mode: ISTIO_MUTUAL

Создайте DestinationRule.
Для egress:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: internal-mtls-egress-dr
spec:
  exportTo:
    - .
  host: egress-svc
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      - port:
          number: 3001
        tls:
          mode: ISTIO_MUTUAL
          sni: vm-test-fex-psql-320.vdc06.sy.your_domain
      - port:
          number: 4001
        tls:
          mode: ISTIO_MUTUAL
          sni: tfsx-keycloak-demo.dap.devpub-01.your_domain
      - port:
          number: 5001
        tls:
          mode: ISTIO_MUTUAL
          sni: vm-misk-fex-mock1-315.vdc06.sy.your_domain

Для AWP FrontEnd

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tfsx-awp-frontend-istio-mtls
spec:
  exportTo:
    - .
  host: tfsx-awp-frontend-svc
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      - port:
          number: 8080
        tls:
          mode: ISTIO_MUTUAL

Для AWP BackEnd

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tfsx-awp-arm-istio-mtls
spec:
  exportTo:
    - .
  host: tfsx-awp-arm-svc
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      - port:
          number: 8080
        tls:
          mode: ISTIO_MUTUAL

Для AWP BackEnd Configurator

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: tfsx-awp-configurator-mtls
spec:
  exportTo:
    - .
  host: tfsx-awp-configurator-svc
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      - port:
          number: 8080
        tls:
          mode: ISTIO_MUTUAL

Создайте PeerAuthentication:

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: internal-mtls-pa
spec:
  mtls:
    mode: STRICT

Hashicorp Vault (опционально): для получения секретов из Vault KV совместимого хранилища используется sidecar Vault Agent, необходимо добавить соответствующие аннотации в deployment приложений.
Ниже приведены шаблоны Vault Agent для получения данных из хранилища и подгрузки их в нужную директорию.

Сертификаты и ключи должны храниться в base64 внутри хранилища

В контейнерах AWP BackEnd Configurator и AWP BackEnd предусмотрены опции:

  • WAIT_ISTIO_START - ожидание запуска sidecar istio-proxy

  • WAIT_FILE_SECRET - ожидание загрузки файла с секретами из хранилища

          env:
            - name: WAIT_ISTIO_START
              # 1 = true, 0 = false
              value: '1'
            - name: WAIT_FILE_SECRET
              # файл с секретами указанный в шаблонах Vault Agent
              # vault.hashicorp.com/agent-inject-template-secrets.properties
              value: /vault/secrets/secrets.properties 

AWP BackEnd Configurator

        vault.hashicorp.com/namespace: vault.exampleDomain.ru # namespace вашего Vault KV совместимого хранилища
        vault.hashicorp.com/role: example-role # role в вашем Vault KV совместимом хранилище
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/agent-pre-populate: 'false'
        vault.hashicorp.com/agent-inject-template-secrets.properties: |
                {{ with secret "KV/EXAMPLE/SECRETS/AWP_BC" }}
                  {{ range \$k, \$v := .Data }}
                    {{ \$k }}={{ \$v }}
                  {{ end }}
                {{ end }}
        vault.hashicorp.com/agent-inject-secret-secrets.properties: KV/EXAMPLE/SECRETS/AWP_BC # путь к секретам внутри хранилища
        vault.hashicorp.com/agent-inject-secret-server.ssl.trust-store.p12: 'true'
        vault.hashicorp.com/secret-volume-path-server.ssl.trust-store.p12: /tfs_configurator_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-server.ssl.key-store.p12: 'true'
        vault.hashicorp.com/secret-volume-path-server.ssl.key-store.p12: /tfs_configurator_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-jwt.trust.path.jks: 'true'
        vault.hashicorp.com/secret-volume-path-jwt.trust.path.jks: /tfs_configurator_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-audit.kafka.truststore.jks: 'true'
        vault.hashicorp.com/secret-volume-path-audit.kafka.truststore.jks: /tfs_configurator_backend/resource/certs
        vault.hashicorp.com/agent-inject-template-server.ssl.trust-store.p12: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_BC"}}{{base64Decode 
          .Data.server_ssl_trust_store_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-server.ssl.key-store.p12: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_BC"}}{{base64Decode
          .Data.server_ssl_key_store_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-jwt.trust.path.jks: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_BC"}}{{base64Decode
          .Data.jwt_trust_path_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-audit.kafka.truststore.jks: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_BC"}}{{base64Decode
          .Data.audit_kafka_truststore_base64}}{{ end }}

AWP BackEnd

        vault.hashicorp.com/namespace: vault.exampleDomain.ru # namespace вашего Vault KV совместимого хранилища
        vault.hashicorp.com/role: example-role # role в вашем Vault KV совместимом хранилище
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/agent-pre-populate: 'false'
        vault.hashicorp.com/agent-inject-template-secrets.properties: |
          {{ with secret "KV/EXAMPLE/SECRETS/AWP_B" }}
            {{ range \$k, \$v := .Data }}
              {{ \$k }}={{ \$v }}
            {{ end }}
          {{ end }}
        vault.hashicorp.com/agent-inject-secret-secrets.properties: KV/EXAMPLE/SECRETS/AWP_B # путь к секретам внутри хранилища
        vault.hashicorp.com/agent-inject-secret-server.ssl.trust-store.p12: 'true'
        vault.hashicorp.com/secret-volume-path-server.ssl.trust-store.p12: /tfs_awp_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-server.ssl.key-store.p12: 'true'
        vault.hashicorp.com/secret-volume-path-server.ssl.key-store.p12: /tfs_awp_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-jwt.trust.path.jks: 'true'
        vault.hashicorp.com/secret-volume-path-jwt.trust.path.jks: /tfs_awp_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-audit.kafka.truststore.jks: 'true'
        vault.hashicorp.com/secret-volume-path-audit.kafka.truststore.jks: /tfs_awp_backend/resource/certs
        vault.hashicorp.com/agent-inject-template-server.ssl.trust-store.p12: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_B"}}{{base64Decode 
          .Data.server_ssl_trust_store_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-server.ssl.key-store.p12: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_B"}}{{base64Decode
          .Data.server_ssl_key_store_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-jwt.trust.path.jks: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_B"}}{{base64Decode
          .Data.jwt_trust_path_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-audit.kafka.truststore.jks: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_B"}}{{base64Decode
          .Data.audit_kafka_truststore_base64}}{{ end }}

Пример конфигурация компонентов AWP (Istio Service Mesh(опционально) + Hashicorp Vault Agent)#

AWP FrontEnd

kind: Deployment
apiVersion: apps/v1
metadata:
  name: tfsx-awp-frontend # указываем имя deployment
  labels:
    app: tfsx-awp-frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tfsx-awp-frontend
  template:
    metadata:
      labels:
        app: tfsx-awp-frontend
      annotations:
        # AWP FrontEnd не использует какие-либо секреты, указываем только аннотации для Data plane
        sidecar.istio.io/inject: 'true'
        sidecar.istio.io/proxyCPU: 256m
        sidecar.istio.io/proxyCPULimit: 256m
        sidecar.istio.io/proxyImage: >-
          registry2.k8s.ose-prod.your_domain/istio-syn/proxyv2@sha256:XXXXXXXXXXXXXXXXXXXX
        sidecar.istio.io/proxyMemory: 256Mi
        sidecar.istio.io/proxyMemoryLimit: 256Mi
        sidecar.istio.io/rewriteAppHTTPProbers: 'true'
    spec:
      volumes: # AWP FrontEnd несет с собой в Docker-образе NGINX
        - name: nginx-log
          emptyDir: {}
        - name: nginx-run
          emptyDir: {}
      containers:
        - resources:
            limits:
              cpu: 300m
              memory: 450Mi
            requests:
              cpu: 300m
              memory: 450Mi
          readinessProbe:
            httpGet:
              path: /
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 1
            timeoutSeconds: 5
            periodSeconds: 2
            successThreshold: 1
            failureThreshold: 3
          terminationMessagePath: /dev/termination-log
          name: tfsx-awp-frontend
          livenessProbe:
            httpGet:
              path: /
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 1
            timeoutSeconds: 5
            periodSeconds: 2
            successThreshold: 1
            failureThreshold: 3
          securityContext: # настройки, рекомендуемые стандартами кибербезопасности
            capabilities:
              drop:
                - ALL
            privileged: false
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
          ports:
            - containerPort: 8080
              protocol: TCP
          imagePullPolicy: Always
          volumeMounts:
            - name: nginx-log
              mountPath: /var/opt/rh/rh-nginx116/log/nginx
            - name: nginx-run
              mountPath: /var/opt/rh/rh-nginx116/run/nginx
          terminationMessagePolicy: File
          image: >-
            HOST/awp-frontend/tfs-awp-frontend@sha256:XXXXXXXXXXXXXXXXXXXX
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: # настройки, рекомендуемые стандартами кибербезопасности
        runAsUser: 1002210000
        runAsGroup: 1002210000
        runAsNonRoot: true
        fsGroup: 1002210000
      imagePullSecrets:
        - name: image-puller-account
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

AWP BackEnd

kind: Deployment
apiVersion: apps/v1
metadata:
  name: tfsx-awp-arm # указываем имя deployment
  labels:
    app: tfsx-awp-arm
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tfsx-awp-arm
  template:
    metadata:
      labels:
        app: tfsx-awp-arm
        secman-injector: enabled # включим Vault Agent inject
      annotations:
        sidecar.istio.io/proxyMemoryLimit: 256Mi
        sidecar.istio.io/proxyImage: >-
          registry2.k8s.ose-prod.your_domain/istio-syn/proxyv2@sha256:XXXXXXXXXXXXXXXXXXXX
        sidecar.istio.io/proxyCPULimit: 256m
        sidecar.istio.io/inject: 'true'
        sidecar.istio.io/proxyCPU: 256m
        vault.hashicorp.com/namespace: vault.exampleDomain.ru # namespace вашего Vault KV совместимого хранилища
        vault.hashicorp.com/role: example-role # role в вашем Vault KV совместимом хранилище
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/agent-pre-populate: 'false'
        vault.hashicorp.com/agent-inject-template-secrets.properties: |
          {{ with secret "KV/EXAMPLE/SECRETS/AWP_B" }}
            {{ range \$k, \$v := .Data }}
              {{ \$k }}={{ \$v }}
            {{ end }}
          {{ end }}
        vault.hashicorp.com/agent-inject-secret-secrets.properties: KV/EXAMPLE/SECRETS/AWP_B # путь к секретам внутри хранилища
        vault.hashicorp.com/agent-inject-secret-server.ssl.trust-store.p12: 'true'
        vault.hashicorp.com/secret-volume-path-server.ssl.trust-store.p12: /tfs_awp_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-server.ssl.key-store.p12: 'true'
        vault.hashicorp.com/secret-volume-path-server.ssl.key-store.p12: /tfs_awp_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-jwt.trust.path.jks: 'true'
        vault.hashicorp.com/secret-volume-path-jwt.trust.path.jks: /tfs_awp_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-audit.kafka.truststore.jks: 'true'
        vault.hashicorp.com/secret-volume-path-audit.kafka.truststore.jks: /tfs_awp_backend/resource/certs
        vault.hashicorp.com/agent-inject-template-server.ssl.trust-store.p12: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_B"}}{{base64Decode 
          .Data.server_ssl_trust_store_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-server.ssl.key-store.p12: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_B"}}{{base64Decode
          .Data.server_ssl_key_store_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-jwt.trust.path.jks: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_B"}}{{base64Decode
          .Data.jwt_trust_path_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-audit.kafka.truststore.jks: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_B"}}{{base64Decode
          .Data.audit_kafka_truststore_base64}}{{ end }}
    spec:
      volumes:
        - name: tfsx-awp-arm-config
          projected:
            sources: # убедитесь, что указанные ConfigMap's созданы в вашем namespace
              - configMap:
                  name: tfsx-awp-arm-application-cm
              - configMap:
                  name: tfsx-awp-arm-log-cm
            defaultMode: 256
        - name: logs
          emptyDir: {}
        - name: certs
          emptyDir: {}
        - name: tmp
          emptyDir: {}
      containers:
        - resources:
            limits:
              cpu: 450m
              memory: 650Mi
            requests:
              cpu: 450m
              memory: 650Mi
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60
            timeoutSeconds: 5
            periodSeconds: 30
            successThreshold: 1
            failureThreshold: 3
          terminationMessagePath: /dev/termination-log
          name: tfsx-awp-arm
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60
            timeoutSeconds: 5
            periodSeconds: 30
            successThreshold: 1
            failureThreshold: 3
          env:
            - name: WAIT_ISTIO_START
              value: '1'
            - name: WAIT_FILE_SECRET
              value: /vault/secrets/secrets.properties # Vault Agent загрузит секреты в данный файл
            - name: CONFIG_FOLDER_PATH
              value: /tfs_awp_backend/resource/
          securityContext: # настройки, рекомендуемые стандартами кибербезопасности
            capabilities:
              drop:
                - ALL
            privileged: false
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
          ports:
            - containerPort: 8080
              protocol: TCP
          imagePullPolicy: Always
          volumeMounts:
            - name: logs
              mountPath: /var/log
            - name: tmp
              mountPath: /tmp
            - name: tfsx-awp-arm-config
              mountPath: /tfs_awp_backend/resource
          terminationMessagePolicy: File
          image: >-
            HOST/awp-backend/tfs-arm-backend@sha256:XXXXXXXXXXXXXXXXXXXX
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: # настройки, рекомендуемые стандартами кибербезопасности
        runAsUser: 1002210000
        runAsGroup: 1002210000
        runAsNonRoot: true
        fsGroup: 1002210000
      imagePullSecrets:
        - name: image-puller-account
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

AWP BackEnd Configurator

kind: Deployment
apiVersion: apps/v1
metadata:
  annotations:
  name: tfsx-awp-configurator # указываем имя deployment
  labels:
    app: tfsx-awp-configurator
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tfsx-awp-configurator
  template:
    metadata:
      labels:
        app: tfsx-awp-configurator
        secman-injector: enabled # включим Vault Agent inject
      annotations:
        sidecar.istio.io/proxyMemoryLimit: 256Mi
        sidecar.istio.io/proxyImage: >-
          registry2.k8s.ose-prod.your_domain/istio-syn/proxyv2@sha256:XXXXXXXXXXXXXXXXXXXX
        sidecar.istio.io/proxyCPULimit: 256m
        sidecar.istio.io/inject: 'true'
        sidecar.istio.io/proxyCPU: 256m
        sidecar.istio.io/proxyMemory: 256Mi
        sidecar.istio.io/rewriteAppHTTPProbers: 'true'
        vault.hashicorp.com/namespace: vault.exampleDomain.ru # namespace вашего Vault KV совместимого хранилища
        vault.hashicorp.com/role: example-role # role в вашем Vault KV совместимом хранилище
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/agent-pre-populate: 'false'
        vault.hashicorp.com/agent-inject-template-secrets.properties: |
          {{ with secret "KV/EXAMPLE/SECRETS/AWP_BC" }}
            {{ range \$k, \$v := .Data }}
              {{ \$k }}={{ \$v }}
            {{ end }}
          {{ end }}
        vault.hashicorp.com/agent-inject-secret-secrets.properties: KV/EXAMPLE/SECRETS/AWP_BC # путь к секретам внутри хранилища
        vault.hashicorp.com/agent-inject-secret-server.ssl.trust-store.p12: 'true'
        vault.hashicorp.com/secret-volume-path-server.ssl.trust-store.p12: /tfs_configurator_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-server.ssl.key-store.p12: 'true'
        vault.hashicorp.com/secret-volume-path-server.ssl.key-store.p12: /tfs_configurator_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-jwt.trust.path.jks: 'true'
        vault.hashicorp.com/secret-volume-path-jwt.trust.path.jks: /tfs_configurator_backend/resource/certs
        vault.hashicorp.com/agent-inject-secret-audit.kafka.truststore.jks: 'true'
        vault.hashicorp.com/secret-volume-path-audit.kafka.truststore.jks: /tfs_configurator_backend/resource/certs
        vault.hashicorp.com/agent-inject-template-server.ssl.trust-store.p12: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_BC"}}{{base64Decode 
          .Data.server_ssl_trust_store_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-server.ssl.key-store.p12: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_BC"}}{{base64Decode
          .Data.server_ssl_key_store_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-jwt.trust.path.jks: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_BC"}}{{base64Decode
          .Data.jwt_trust_path_base64}}{{ end }}
        vault.hashicorp.com/agent-inject-template-audit.kafka.truststore.jks: >-
          {{with secret "KV/EXAMPLE/SECRETS/AWP_BC"}}{{base64Decode
          .Data.audit_kafka_truststore_base64}}{{ end }}
    spec:
      volumes: # убедитесь, что указанные ConfigMap's созданы в вашем namespace
        - name: tfsx-configurator-config
          projected:
            sources:
              - configMap:
                  name: tfsx-awp-configurator-cm
            defaultMode: 256
        - name: logs
          emptyDir: {}
        - name: tmp
          emptyDir: {}
      containers:
        - resources:
            limits:
              cpu: 450m
              memory: 650Mi
            requests:
              cpu: 450m
              memory: 650Mi
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60
            timeoutSeconds: 5
            periodSeconds: 30
            successThreshold: 1
            failureThreshold: 3
          terminationMessagePath: /dev/termination-log
          name: tfsx-awp-configurator
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60
            timeoutSeconds: 5
            periodSeconds: 30
            successThreshold: 1
            failureThreshold: 3
          env:
            - name: WAIT_ISTIO_START
              value: '1'
            - name: WAIT_FILE_SECRET
              value: /vault/secrets/secrets.properties # Vault Agent загрузит секреты в данный файл
            - name: CONFIG_FOLDER_PATH
              value: /tfs_configurator_backend/resource/ # отдельно Vault Agent загрузит нужные сертификаты в каталог /certs
          securityContext: # настройки, рекомендуемые стандартами кибербезопасности
            capabilities:
              drop:
                - ALL
            privileged: false
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
          ports:
            - containerPort: 8080
              protocol: TCP
          imagePullPolicy: Always
          volumeMounts:
            - name: logs
              mountPath: /var/log
            - name: tmp
              mountPath: /tmp
            - name: tfsx-configurator-config
              mountPath: /tfs_configurator_backend/resource/
          terminationMessagePolicy: File
          image: >-
            HOST/awp-backend-configurator/tfs-configurator-backend@sha256:XXXXXXXXXXXXXXXXXXXX
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: # настройки, рекомендуемые стандартами кибербезопасности
        runAsUser: 1002210000
        runAsGroup: 1002210000
        runAsNonRoot: true
        fsGroup: 1002210000
      imagePullSecrets:
        - name: image-puller-account
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

Дополнительные конфигурации#

Если в качестве прокси-сервиса выбран IAM Proxy, приведен пример его конфигурирования для тестовой среды:

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

Переменные среды:

  # Конфигурирование раздела junctions, отвечающего за перенаправление входящего трафика
  # serverAddresses указывает на hosts's, которые были указаны в Ingress-controller при развертывании компонентов AWP
  RDS_START_CONF: |
    {
      "junctions": [
        {
          "junctionPoint": "/rest",
          "indexUrl": "/rest/v1/routes",
          "junctionName": "Administrator AWP (backend)",
          "https": false,
          "sslCommonName": "*",
          "transparent": true,
          "applyJctRequestFilter": "common/rds-set-header-host-to-backend.location.conf, common/rds-set-header-host-to-backend.location.conf",
          "serverAddresses": [
            "awp-backend.cluster.example.ru.ru"
          ]
        },
        {
          "junctionPoint": "/configurator",
          "indexUrl": "/rest/v1/contexts",
          "junctionName": "Сonfigurator (backend)",
          "https": false,
          "sslCommonName": "*",
          "transparent": false,
          "applyJctRequestFilter": "common/rds-set-header-host-to-backend.location.conf, common/rds-set-header-host-to-backend.location.conf",
          "serverAddresses": [
            "awp-backend-configurator.cluster.example.ru.ru"
          ]
        },
        {
          "junctionPoint": "/ui",
          "indexUrl": "/",
          "junctionName": "Administrator AWP (frontend)",
          "https": false,
          "sslCommonName": "*",
          "transparent": false,
          "applyJctRequestFilter": "common/rds-set-header-host-to-backend.location.conf, common/rds-set-header-host-to-backend.location.conf",
          "serverAddresses": [
            "awp-frontend.cluster.example.ru.ru"
          ]
        }
        ]
      }
  # конфигурирование взаимодействия с OIDC Provider и настройки стенда
  PROXY_DNSNAME: host.cluster.example.ru.ru
  PROXY_SESSION_SECRET: >-
    is-very-very-very-big-secret-80--343456567hkhkhkjhkhjkgfdrtrytrufnbcvbnvnbbjhuituyrtdfghddgh878__73434424@#323@#4%6&%456+
  SYSLOG_SERVER: '{ip}'
  OIDC_SCOPE: openid
  PROXY_OIDC_CLIENT_SECRET: 32ae75ad-629b-4638-aca4-d3851a70beaf
  STEND_NAME: test-stend
  OIDC_SSL_VERIFY: 'false'
  DEBUG: '1'
  STEND_ABBR: IAM Test
  OIDC_DISCOVERY_URL: >-
    https://oidc.test.uri.ru/auth
  OIDC_USE_CLIENT_CERT: 'false'
  PROXY_OIDC_CLIENT_ID: test-client
  OIDC_LOGOUT_URI: >-
    https://oidc.test.uri.ru/auth
  STEND_TYPE: Test

Пример Deployment для развертывания в k8s:

При развертывании в k8s, указанные выше переменные среды должны быть заранее занесены в kind:ConfigMap

kind: Deployment
apiVersion: apps/v1
metadata:
  name: iamproxy-test
  labels:
    app: iamproxy-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iamproxy-test
  template:
    metadata:
      labels:
        app: iamproxy-test
      # аннотации для инжектинга сайдкара istio-envoy
      annotations:
        sidecar.istio.io/inject: 'true'
        sidecar.istio.io/proxyCPU: 156m
        sidecar.istio.io/proxyCPULimit: 156m
        sidecar.istio.io/proxyImage: >-
          registry2.k8s.ose-prod.your_domain/istio-syn/proxyv2@sha256:XXXXXXXXXXXXXXXXXXXX
        sidecar.istio.io/proxyMemory: 156Mi
        sidecar.istio.io/proxyMemoryLimit: 156Mi
        sidecar.istio.io/rewriteAppHTTPProbers: 'true'
    spec:
      volumes:
        - name: tmp
          emptyDir: {}
      containers:
        - resources:
            limits:
              cpu: 400m
              memory: 500Mi
            requests:
              cpu: 400m
              memory: 500Mi
          terminationMessagePath: /dev/termination-log
          name: iamproxy-test
          env:
            - name: DEBUG
              value: '0'
            - name: OPENSHIFT_POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
          securityContext: # настройки безопасности
            capabilities:
              drop:
                - ALL
            privileged: false
            runAsUser: 10001
            runAsGroup: 12000
            runAsNonRoot: true
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
            seccompProfile:
              type: RuntimeDefault
          ports:
            - name: http-status
              containerPort: 10080
              protocol: TCP
            - containerPort: 8080
              protocol: TCP
            - containerPort: 8443
              protocol: TCP
          imagePullPolicy: Always
          volumeMounts:
            - name: tmp
              mountPath: /tmp/platformauth-proxy
          terminationMessagePolicy: File
          envFrom:
            - configMapRef:
                name: iamproxy-test-cm # ConfigMap, должен быть создан заранее
          image: 'host/ci90000019_iamproxy/auth/iamproxy:{version}'
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext:
        fsGroup: 13000
      imagePullSecrets:
        - name: '{account}'
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600