Настройка интеграции с Istio#

Для работы EVTA с Istio возможно указание параметров в конфигурационном файле vars.yml.

В аннотации развертывания (поле annotations файла vars.yml) необходимо добавить:

sidecar.istio.io/inject: 'true'

Блок настроек файла vars.yml, относящихся к Istio:

  istio: # настройки манифестов Istio
  #  destinationRule: # параметры для манифеста DestinationRule Istio
  #    outlierDetection:
  #      consecutive5xxErrors: 3
  #      interval: 30s
  #      baseEjectionTime: 1m
  #      maxEjectionPercent: 10
    peerAuthentication:
      create: false
    #    name: peer-auth-0
    #    mtls_mode: PERMISSIVE # UNSET (default) | DISABLE | PERMISSIVE | STRICT
    ingress:
      deployment:
        create: false # создавать ли Deployment для istio ingressgateway
        name: evta # Суффикс названия деплоймента и сервиса входного граничного прокси. К этому названию автоматически будет добавлен префикс "ingressgateway-"
        # resources:
        #   limits:
        #     cpu: 0.1
        #     memory: 128M
        #   requests:
        #     cpu: 0.1
        #     memory: 64M
        podAntiAffinity:
          enabled: true # Если значение установлено в true, то антитенантность будет применена к подам ingressgateway
        readinessProbe: {}
        #   initialDelaySeconds: 1
        #   timeoutSeconds: 1
        #   periodSeconds: 2
        #   successThreshold: 1
        #   failureThreshold: 30
        annotations:
          sidecar.istio.io/inject: 'false'
          # # Дополнительные аннотации для граничного прокси. Здесь можно описать импорт сертификатов из vault/secman
          # vault.hashicorp.com/agent-inject-secret-ca.pem: 'true'
          # vault.hashicorp.com/secret-volume-path-ca.pem: /vault/ingress
          # vault.hashicorp.com/namespace: DEV_DZO
          # vault.hashicorp.com/role: role-ga-secman-eda
          # vault.hashicorp.com/secret-volume-path-key.pem: /vault/ingress
          # vault.hashicorp.com/agent-inject: 'true'
          # vault.hashicorp.com/agent-inject-secret-key.pem: 'true'
          # vault.hashicorp.com/agent-init-first: 'true'
          # vault.hashicorp.com/agent-limits-cpu: 100m
          # vault.hashicorp.com/agent-requests-cpu: 100m
          # vault.hashicorp.com/secret-volume-path-crt.pem: /vault/ingress
          # vault.hashicorp.com/agent-inject-secret-crt.pem: 'true'
          # vault.hashicorp.com/agent-inject-template-key.pem: |
          #   {%- raw %}
          #   {{- with secret "PKI/issue/role-ga-secman-eda"
          #   "common_name=evta.eda.solution.sbt" "format=pem" "ttl=20h"
          #   "private_key_format=pkcs8" -}}
          #   {{ .Data.private_key }}
          #   {{- end }}
          #   {%- endraw %}
          # vault.hashicorp.com/agent-inject-template-ca.pem: |
          #   {%- raw %}
          #   {{- with secret "PKI/issue/role-ga-secman-eda"
          #   "common_name=evta.eda.solution.sbt" "format=pem" "ttl=20h"
          #   "private_key_format=pkcs8" -}}
          #   {{- range $idx, $cert := .Data.ca_chain }}
          #   {{ $cert }}
          #   {{- end }}
          #   {{- end }}
          #   {%- endraw %}
          # vault.hashicorp.com/agent-inject-template-crt.pem: |
          #   {%- raw %}
          #   {{- with secret "PKI/issue/role-ga-secman-eda"
          #   "common_name=evta.eda.solution.sbt" "format=pem" "ttl=20h"
          #   "private_key_format=pkcs8" -}}
          #   {{ .Data.certificate }}
          #   {{- end }}
          #   {%- endraw %}
        labels: {}
        #   secman-injector: enabled # лейбл для активации интеграции с secman vault agent injector
        # istioDiscoveryService: istiod # название discovery сервиса панели истио к которой подключен ваш неймспейс
        # istioControlPlane: control-plane-01 # название неймспейса контрольной панели истио к которой подключен ваш неймспейс
        # proxyImage: image # ссылка на образ граничного прокси (IGEG)
      service: # параметры сервиса Ingress
        create: false # создавать ли манифест сервиса
        # name: evta-ingressgateway-svc # имя сервиса Ingress (по умолчанию имя генерируется автоматически)
        # port:
        #   name: https-8082
        #   number: 8082
        #   protocol: TCP
      # selector: # Селектор для интеграции с уже существующим подом ingressgateway
      #   istio: ingressgateway-tribe-sy-synes-nt
      #   app: ingressgateway-tribe-sy-synes-nt
      # route, ссылающийся на имя описанного в ingress service порт, по которому будет производиться маршрутизация внутри ingress.
      route:
        create: false # создавать ли манифест Route
        # host: test1-https-ingress.apps.stands-vdc01.solution.sbt
        # annotations: {}
        # tls:
        #   termination: passthrough
        # service:
        #   port: https-8082
        #   name: evta-ingressgateway-svc
      # gateway, в котором указывается параметр содержащий ingress url, который указан в route, и порт из service ingress'a, в который будет заворачиваться трафик.
      gateway:
        create: false # создавать ли манифест Gateway
        # name: evta-ingressgateway-gw # имя манифеста (по умолчанию имя генерируется автоматически)
        # hosts: test1-https-ingress.apps.stands-vdc01.solution.sbt
        # port:
        #   name: https
        #   number: 8082
        #   protocol: HTTPS
        # tls:
        #   caCertificates: /etc/istio/egressgateway0-ca-certs/ca-chain.cert.pem
        #   cipherSuites:
        #     - ECDHE-RSA-AES256-GCM-SHA384
        #     - ECDHE-ECDSA-AES128-GCM-SHA256
        #     - ECDHE-RSA-AES128-GCM-SHA256
        #     - AES256-GCM-SHA384
        #     - AES128-GCM-SHA256
        #   minProtocolVersion: TLSV1_2
        #   mode: MUTUAL
        #   privateKey: /etc/istio/egressgateway0-certs/tls.key
        #   serverCertificate: /etc/istio/egressgateway0-certs/tls.crt
      # virtualService
      virtualService:
        create: false # создавать ли манифест VirtualService
        # hosts: 'test1-https-ingress.apps.stands-vdc01.solution.sbt'
        # http:
        #   # example for rest
        #   - prefix: /publish
        #     port: 8080
        #   - prefix: /subscribe
        #     port: 8081
        #   # example for grpc
        #   - prefix: /ru.sbt.synapse.fpss.adapter.grpc.api.PublishService
        #     port: 8080
        #   - prefix: /ru.sbt.synapse.fpss.adapter.grpc.api.SubscribeService
        #     port: 8081
    # массив serviceEntry, которые нужно создать
    #  serviceEntry:
    #    - host: my_hostname
    #      addresses: { IP_ADDRESS }/32
    #      resolution: NONE
    #      port:
    #        name: tcp-kafka
    #        number: 9092
    #        protocol: TCP
    #    #    annotations: # раскомментировать, если нужно, чтобы serviceEntry осталась после helm uninstall
    #    #      "helm.sh/resource-policy": keep
    #    - host: secman-dzo.solution.sbt
    #      resolution: DNS
    #      port:
    #        name: tcp-vault
    #        number: 8443
    #        protocol: TCP
    #    - host: ext.audit2-http-proxy.apps.stands-vdc01.solution.sbt
    #      resolution: DNS
    #      port:
    #        name: https-audit
    #        number: 443
    #        protocol: HTTPS
    egress:
      deployment:
        create: false # создавать ли Deployment для istio egressgateway
        name: evta # Суффикс названия деплоймента и сервиса выходного граничного прокси. К этому названию автоматически будет добавлен префикс "egressgateway-"
        # resources:
        #   limits:
        #     cpu: 0.1
        #     memory: 128M
        #   requests:
        #     cpu: 0.1
        #     memory: 64M
        podAntiAffinity:
          enabled: true # Если значение установлено в true, то антитенантность будет применена к подам egressgateway
        readinessProbe: {}
        #   initialDelaySeconds: 1
        #   timeoutSeconds: 1
        #   periodSeconds: 2
        #   successThreshold: 1
        #   failureThreshold: 30
        annotations:
          sidecar.istio.io/inject: 'false'
          # # Дополнительные аннотации для граничного прокси. Здесь можно описать импорт сертификатов из vault/secman
          # vault.hashicorp.com/agent-inject-template-cert.pem: |
          #   {%- raw %}
          #   {{- with secret "A/DEV/SY/EVTD/KV/example-audit-cert" -}}
          #   {{ index .Data "cert" }}
          #   {{- end }}
          #   {%- endraw %}
          # vault.hashicorp.com/agent-inject-secret-ca.pem: 'true'
          # vault.hashicorp.com/secret-volume-path-ca.pem: /vault
          # vault.hashicorp.com/namespace: DEV_DZO
          # vault.hashicorp.com/role: role-ga-secman-eda
          # vault.hashicorp.com/agent-inject-secret-cert.pem: 'true'
          # vault.hashicorp.com/secret-volume-path-key.pem: /vault
          # vault.hashicorp.com/agent-inject: 'true'
          # vault.hashicorp.com/secret-volume-path-cert.pem: /vault
          # vault.hashicorp.com/agent-inject-secret-key.pem: 'true'
          # vault.hashicorp.com/agent-init-first: 'true'
          # vault.hashicorp.com/agent-limits-cpu: 200m
          # vault.hashicorp.com/agent-requests-cpu: 200m
          # vault.hashicorp.com/agent-inject-template-key.pem: |
          #   {%- raw %}
          #   {{- with secret "A/DEV/SY/EVTD/KV/example-audit-cert" -}}
          #   {{ index .Data "key" }}
          #   {{- end }}
          #   {%- endraw %}
          # vault.hashicorp.com/agent-inject-template-ca.pem: |
          #   {%- raw %}
          #   {{- with secret "A/DEV/SY/EVTD/KV/example-audit-cert" -}}
          #   {{ index .Data "ca" }}
          #   {{- end }}
          #   {%- endraw %}
        labels: {}
          # secman-injector: enabled # лейбл для активации интеграции с secman vault agent injector
        # istioDiscoveryService: istiod # название discovery сервиса панели истио к которой подключен ваш неймспейс
        # istioControlPlane: control-plane-01 # название неймспейса контрольной панели истио к которой подключен ваш неймспейс
        # proxyImage: image # ссылка на образ граничного прокси (IGEG)
      service: # параметры сервиса Egress
        name: evta-egressgateway-svc # имя сервиса Egress (по умолчанию имя генерируется автоматически)
        create: false # создавать ли манифест сервиса
        # internalPort: 9443 # внутренний порт Egress
        # internalPortName: http-9443
        # internalPortProtocol: http
        # selector: # содержимое поля spec.selector в манифесте. По умолчанию выбирается создаваемый выше egressgateway
        #   app: egressgateway-tribe-sy-synes-nt
        #   istio: egressgateway-tribe-sy-synes-nt
      gateway: # параметры манифеста Gateway для Istio Egress
        create: false # создавать ли манифест
        # name: evta-egressgateway-gw # имя манифеста (по умолчанию имя генерируется автоматически)
        # selector: # содержимое поля spec.selector в манифесте. По умолчанию выбирается создаваемый выше egressgateway
        #   istio: egressgateway-tribe-sy-synes-nt
      destinationRule: # Конфигурация destination rule к сервису egressgateway
        create: false
        # name: evta-egressgateway-dr # имя манифеста (по умолчанию имя генерируется автоматически)
        # outlierDetection:
        #   consecutive5xxErrors: 3
        #   interval: 30s
        #   baseEjectionTime: 1m
        #   maxEjectionPercent: 10
    # # При создании istio манифестов для проксирования трафика kafka из прикладного приложения к bootstrap серверу нужно обращаться на хост следующего формата:
    # # {название_сервиса_egressgateway}.{имя_неймспейса}.svc.cluster.local:{gwPort_для_кафки_указываемый_ниже}
      kafka: [] # параметры для направления kafka трафика через istio egressgateway. Можно указать список bootstrap серверов кафки
    #  - hosts: bootstrap.server1.host:9093,bootstrap.server2.host:9093 # хост и порт bootstrap серверов кафки. Если кластер, можно указать несколько. Разделитель ","
    #    gwPort: 10092 # порт сервиса egressgateway по которому будет доступна кафка изнутри неймспейса
    #    gwTls:
    #      mode: ISTIO_MUTUAL # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
    #    destinationRule: # параметры для манифеста DestinationRule Istio для кафки
    #      create: true # создавать ли манифест
    #      outlierDetection:
    #        consecutive5xxErrors: 5
    #        interval: 5m
    #        baseEjectionTime: 5m
    #        maxEjectionPercent: 50
    #      tls:
    #        mode: MUTUAL
    #        clientCertificate: /path/to/egress/certificates/ca-chain.cert.pem
    #        privateKey: /path/to/egress/certificates/tls.crt
    #        caCertificates: /path/to/egress/certificates/tls.key
    #    virtualService: # параметры для манифеста VirtualService для кафки
    #      create: true # создавать ли манифест
    #    serviceEntry: # параметры для манифеста ServiceEntry для кафки
    #      create: true # создавать ли манифест
      vault: # параметры для интеграции с HashiCorp Vault
        # host: vault.url # хост сервиса HashiCorp Vault
        # port: 8443 # порт сервиса HashiCorp Vault
        # externalPort: 8443 # порт сервиса HashiCorp Vault для обращения из приклада
        # # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
        # # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
        # gwPort: 9447 # порт на egressGateway
        # gwProtocol: TLS # протокол на egressGateway
        # gwSvcProtocol: TCP # протокол на service egressGateway
        # gwTls:
        #   mode: ISTIO_MUTUAL # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
        destinationRule: # параметры для манифеста DestinationRule Istio
          create: false # создавать ли манифест
          # name: evta-vault-dr # имя манифеста (по умолчанию имя генерируется автоматически)
          # tls:
          #   mode: MUTUAL
          #   caCertificates: /vault/ca.pem
          #   clientCertificate: /vault/cert.pem
          #   privateKey: /vault/key.pem
          # outlierDetection:
          #   consecutive5xxErrors: 3
          #   interval: 30s
          #   baseEjectionTime: 1m
          #   maxEjectionPercent: 10
        virtualService: # параметры для манифеста VirtualService
          create: false # создавать ли манифест VirtualService
          # name: evta-vault-vs # имя манифеста (по умолчанию имя генерируется автоматически)
          # protocol: tls # протокол для создания virtual service. Валидные значения: http, tls, tcp
      audit: # параметры для интеграции с сервисом Аудита
        # host: audit.url # хост сервиса Аудита
        # port: 80 # порт сервиса Аудита для обращения из pod'а
        # externalPort: 443 # порт сервиса Аудита
        # # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
        # # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
        # gwPort: 9446 # порт на egressGateway
        # gwProtocol: HTTP # протокол на egressGateway
        # gwSvcProtocol: TCP # протокол на service egressGateway
        # gwTls:
        #   mode: ISTIO_MUTUAL # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
        destinationRule: # параметры для манифеста DestinationRule Istio
          create: false # создавать ли манифест
          # name: audit-dr # имя манифеста (по умолчанию имя генерируется автоматически)
          # tls:
          #   mode: MUTUAL
          #   caCertificates: /path/to/egress/certificates/ca-chain.cert.pem
          #   clientCertificate: /path/to/egress/certificates/tls.crt
          #   privateKey: /path/to/egress/certificates/tls.key
          # outlierDetection:
          #   consecutive5xxErrors: 3
          #   interval: 30s
          #   baseEjectionTime: 1m
          #   maxEjectionPercent: 10
        virtualService: # параметры для манифеста VirtualService
          create: false # создавать ли манифест VirtualService
          # name: audit-vs # имя манифеста (по умолчанию имя генерируется автоматически)
          # protocol: http # протокол для создания virtual service. Валидные значения: http, tls, tcp
      telemetry: # параметры для интеграции с сервисом телеметрии
        # host: telemetry.url # хост сервиса телеметрии
        # port: 4317 # порт сервиса телеметрии для обращения из pod'а
        # externalPort: 4317 # порт сервиса телеметрии
        # # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
        # # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
        # gwPort: 9478 # порт на egressGateway
        # gwProtocol: HTTPS # протокол на egressGateway
        # gwSvcProtocol: TCP # протокол на service egressGateway
        # gwTls:
        #   mode: ISTIO_MUTUAL
        destinationRule: # параметры для манифеста DestinationRule Istio
          create: false # создавать ли манифест
          # tls:
          #   mode: MUTUAL
          #   clientCertificate: /vault/evta-pki-cert-telemetry.pem
          #   privateKey: /vault/evta-pki-key-telemetry.pem
          #   caCertificates: /vault/evta-pki-truststore-telemetry.pem
          # outlierDetection:
          #   consecutive5xxErrors: 3
          #   interval: 30s
          #   baseEjectionTime: 1m
          #   maxEjectionPercent: 10
        virtualService: # параметры для манифеста VirtualService
          create: false # создавать ли манифест VirtualService
          # name: telemetry-vs # имя манифеста (по умолчанию имя генерируется автоматически)
          # protocol: http # протокол виртуального сервиса

Получение сертификатов из Vault#

В блоке параметров для работы с Istio некоторые значения являются сертификатами, находящимися в egress/ingress контейнерах. Данные сертификаты могут быть получены из Vault.

Для этого в развертывании указанных контейнеров необходимо добавить аннотации для работы с Vault:

Аннотация

Описание

Значение

vault.hashicorp.com/role

Используемая для аутентификации роль

Роль

vault.hashicorp.com/namespace

Используемое пространство имен, которое будет использоваться при запросе секретов из Vault

Namespace

vault.hashicorp.com/agent-inject

Включение инъекции Vault Agent Sidecar

true/false

vault.hashicorp.com/agent-init-first

Должны ли быть получены секреты до старта самого контейнера приложения

true/false

vault.hashicorp.com/agent-pre-populate

Включать ли контейнер init для предварительного заполнения тома общей памяти секретами перед запуском контейнеров

true/false

vault.hashicorp.com/preserve-secret-case

Сохранять ли регистр секретных имен при создании секретных файлов

true/false

vault.hashicorp.com/agent-limits-cpu

Настраивает ограничения на использование CPU в контейнерах Vault Agent

По умолчанию 500m, пустая строка отключает ограничения

vault.hashicorp.com/agent-requests-cpu

Настраивает ограничения на запрос CPU в контейнерах Vault Agent

По умолчанию 250m, пустая строка отключает ограничения

vault.hashicorp.com/agent-limits-mem

Настраивает ограничения на использование памяти в контейнерах Vault Agent

По умолчанию 128Mi, пустая строка отключает ограничения

vault.hashicorp.com/agent-requests-mem

Настраивает ограничения на запрос памяти в контейнерах Vault Agent

По умолчанию 64Mi, пустая строка отключает ограничения

vault.hashicorp.com/agent-inject-secret-<имя_файла>

Секрет, полученный из хранилища, будет добавлен в контейнер с указанным именем файла. Если используется agent-inject-template, то для того, чтобы полученный секрет был записан в файл, необходимо указать данную аннотацию с любым значением (будет переписано шаблоном)

true/false (рекомендовано) или путь до KV хранилища, где находится секрет

vault.hashicorp.com/secret-volume-path-<имя_файла>

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

В какую директорию будет записан полученный секрет

vault.hashicorp.com/agent-inject-template-<имя_файла>

Секрет, полученный после выполнения шаблона, будет добавлен в контейнер с указанным именем файла

Шаблон для получения секрета

Пример аннотаций для выгрузки KV секрета:#

  annotations:
    vault.hashicorp.com/agent-inject-secret-test.yml: 'true'
    vault.hashicorp.com/secret-volume-path-test.yml: /vault/test
    vault.hashicorp.com/namespace: namespace
    vault.hashicorp.com/role: role
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/agent-init-first: 'true'

После запуска в контейнере в директории /vault/test появится файл test.yml. В файле будут содержаться ключи и значения секрета PATH/TO/KV/test. Предположим, что в секрете содержатся следующие значения: key1 -> value1 и key2 -> value2, тогда содержимое файла будет:

sh-4.4$ cat /vault/test/test.yml
key: value1
keystore: value2

Если необходимо получить конкретное значение:

  annotations:
    vault.hashicorp.com/agent-inject-secret-test.yml: 'true'
    vault.hashicorp.com/secret-volume-path-test.yml: /vault/test
    vault.hashicorp.com/agent-inject-template-test.yml: |
      {%- raw %}
      {{- with secret "PATH/TO/KV/test" -}}
      {{ index .Data "key1" }}
      {{- end }}
      {%- endraw %}
    vault.hashicorp.com/namespace: namespace
    vault.hashicorp.com/role: role
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/agent-init-first: 'true'

После запуска в контейнере в директории /vault/test появится файл test.yml. В файле будет содержаться значения key1 секрета PATH/TO/KV/test:

sh-4.4$ cat /vault/test/test.yml
value1

Пример аннотаций для выпуска сертификата через Vault:#

  annotations:
    vault.hashicorp.com/agent-inject-secret-ca.cert: 'true'
    vault.hashicorp.com/secret-volume-path-ca.cert: /vault/test
    vault.hashicorp.com/agent-inject-template-ca.cert: >
      {{- with secret "PKI/issue/role" "common_name=test" -}}

      {{ .Data.issuing_ca }}

      {{- end }}
    vault.hashicorp.com/agent-inject-secret-server.key: 'true'
    vault.hashicorp.com/secret-volume-path-server.key: /vault/test
    vault.hashicorp.com/agent-inject-template-server.key: >
      {{- with secret "PKI/issue/role" "common_name=test" -}}

      {{ .Data.private_key }}

      {{- end }}
    vault.hashicorp.com/namespace: namespace
    vault.hashicorp.com/role: role
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/agent-init-first: 'true'
    vault.hashicorp.com/agent-inject-secret-server.cert: 'true'
    vault.hashicorp.com/secret-volume-path-server.cert: /vault/test
    vault.hashicorp.com/agent-inject-template-server.cert: >
      {{- with secret "PKI/issue/role" "common_name=test" -}}

      {{ .Data.certificate }}

      {{- end }}

После запуска в контейнере в директории /vault/test появится три файла: server.cert, server.key, ca.cert.

Пример аннотаций для получения сертификата через Vault:#

  annotations:
    vault.hashicorp.com/agent-inject-secret-ca.cert: 'true'
    vault.hashicorp.com/secret-volume-path-ca.cert: /vault/test
    vault.hashicorp.com/agent-inject-template-ca.cert: >
      {{- with secret "PATH/TO/KV/cert" -}}

      {{ base64Decode (index .Data "ca.cert") }}

      {{- end }}
    vault.hashicorp.com/agent-inject-secret-server.key: 'true'
    vault.hashicorp.com/secret-volume-path-server.key: /vault/test
    vault.hashicorp.com/agent-inject-template-server.key: >
      {{- with secret "PATH/TO/KV/cert" -}}

      {{ base64Decode (index .Data "server.key") }}

      {{- end }}
    vault.hashicorp.com/namespace: namespace
    vault.hashicorp.com/role: role
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/agent-init-first: 'true'
    vault.hashicorp.com/agent-inject-secret-server.cert: 'true'
    vault.hashicorp.com/secret-volume-path-server.cert: /vault/test
    vault.hashicorp.com/agent-inject-template-server.cert: >
      {{- with secret "PATH/TO/KV/cert" -}}

      {{ base64Decode (index .Data "server.cert") }}

      {{- end }}

После запуска в контейнере в директории /vault/test появится три файла: server.cert, server.key, ca.cert.

Настройка egress/ingress для работы с Vault#

Ниже приведены примеры шаблонов, которые необходимы для настройки работы контейнеров, использующих egress/ingress с Vault:

Service:

apiVersion: v1
kind: Service
metadata:
  name: egressgateway-svc
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  ports:
    - name: http-{{ .Values.istio.egress.egressPort }}
      port: {{ .Values.istio.egress.egressPort }}
      protocol: TCP
    - name: tls-8550
      protocol: TCP
      port: 8550
      targetPort: 8550
      {{- range .Values.istio.egress.services_ports }}
    - name: tcp-{{.}}
      protocol: TCP
      port: {{.}}
      targetPort: {{.}}
      {{- end }}
  selector:
    app: egressgateway-{{ .Values.istio.egress.projectName }}
    istio: egressgateway-{{ .Values.istio.egress.projectName }}

Gateway:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: egress-secman-gw
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  selector:
    istio: egressgateway-{{ .Values.istio.egress.projectName }}
  servers:
    - hosts:
        - {{ .Values.istio.egress.secmanHost }}
      port:
        name: tls-8550
        number: 8550
        protocol: TLS
      tls:
        mode: PASSTHROUGH

VirtualService:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  namespace: {{ .Values.istio.egress.projectName }}
  name: egress-secman-vs
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  exportTo:
    - .
  gateways:
    - egress-secman-gw
    - mesh
  hosts:
    - {{ .Values.istio.egress.secmanHost }}
  tls:
    - match:
        - gateways:
            - mesh
          port: 443
          sniHosts:
            - {{ .Values.istio.egress.secmanHost }}
      route:
        - destination:
            host: egressgateway-svc.{{ .Values.istio.egress.projectName }}.svc.cluster.local
            port:
              number: 8550
    - match:
        - gateways:
            - egress-secman-gw
          port: 8550
          sniHosts:
            - {{ .Values.istio.egress.secmanHost }}
      route:
        - destination:
            host: {{ .Values.istio.egress.secmanHost }}
            port:
              number: 443

ServiceEntry:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: egress-secman-se
  namespace: {{ .Values.istio.egress.projectName }}
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  exportTo:
    - .
  hosts:
    - {{ .Values.istio.egress.secmanHost }}
  location: MESH_EXTERNAL
  ports:
    - name: tls-443
      number: 443
      protocol: TLS
  resolution: DNS

PeerAuthentication:

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: egress-pa
  namespace: {{ .Values.istio.egress.projectName }}
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  portLevelMtls:
    '8550':
      mode: DISABLE
  selector:
    matchLabels:
      app: egressgateway-{{ .Values.istio.egress.projectName }}

DestinationRule:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: egress-secman-dr
  namespace: {{ .Values.istio.egress.projectName }}
  labels:
      egress: {{ .Values.istio.egress.projectName }}
spec:
  exportTo:
    - .
  host: egressgateway-svc.{{ .Values.istio.egress.projectName }}.svc.cluster.local
  trafficPolicy:
    portLevelSettings:
      - port:
          number: 8550
        tls:
          mode: DISABLE