Конфигурирование EVPT для работы с Граничным прокси (IGEG)#

Описание работы с транспортом Kafka#

Для работы компонента EVPT с компонентом Граничный прокси (IGEG) продукта Platform V Synapse Service Mesh необходимо в файле vars.yaml в блоке istio заполнить параметры в блоках annotations и kafka.

Пример заполнения блока annotations#

За выпуск сертификатов для подключения отвечает vault-agent по параметрам из аннотаций, которые указываются в блоке istio.egress.deployment.annotations файла vars.yml.

annotations:
  sidecar.istio.io/inject: 'true' # Включение интеграции с Сервисным прокси SVPX/ istio

Пример заполнения блока istio#

Компонент EVPT подключается к внутренним hosts Kafka без протокола TLS по PLAINTEXT, терминация трафика происходит на Граничном прокси (IGEG).

Для перечисления hosts брокеров кластера Kafka необходимо использовать блок istio.kafka.

  istio: # настройки манифестов Istio
    egress:
      deployment:
        create: true # создавать ли Deployment для istio egressgateway
        name: evpt-egressgateway
        resources:
          limits:
            cpu: 0.1
            memory: 128M
          requests:
            cpu: 0.1
            memory: 64M
        annotations: # Заполнить аннотации для выпуска сертификатов
          sidecar.istio.io/inject: 'true' # Включение интеграции с Сервисным прокси SVPX/ istio
          # Дополнительные аннотации для граничного прокси. Здесь можно описать импорт сертификатов из vault/secman
          vault.hashicorp.com/agent-inject-template-cert.pem: |
            {%- raw %}
            {{- with secret "A/DEV/SY/EVPT/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: TEST
          vault.hashicorp.com/role: test-role
          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/EVPT/KV/example-audit-cert" -}}
            {{ index .Data "key" }}
            {{- end }}
            {%- endraw %}
          vault.hashicorp.com/agent-inject-template-ca.pem: |
            {%- raw %}
            {{- with secret "A/DEV/SY/EVPT/KV/example-audit-cert" -}}
            {{ index .Data "ca" }}
            {{- end }}
            {%- endraw %}
        labels:
          secman-injector: enabled # лейбл для активации интеграции с secman vault agent injector
        istioDiscoveryService: istiod # название discovery сервиса панели Istio к которой подключен ваш namespace
        istioControlPlane: control-plane-01 # название namespace контрольной панели Istio к которой подключен ваш namespace
        proxyImage: image # ссылка на образ граничного прокси (IGEG)
    egressService: # параметры сервиса Egress
      name: "egressgateway0-svc" # имя сервиса Egress
      create: true # создавать ли манифест сервиса
      internalPort: 9443 # внутренний порт Egress
      selector: # содержимое поля spec.selector в манифесте сервиса
        app: evpt-egressgateway
        istio: egressgateway
    gateway: # параметры манифеста Gateway для Istio Egress
      name: egressgateway0-gw # имя манифеста
      create: true # создавать ли манифест
      selector: # содержимое поля spec.selector в манифесте
        istio: egressgateway
      destinationRule:
        name: egressgateway0-dr
        create: true
          tls:
            mode: MUTUAL # DISABLE | SIMPLE | MUTUAL (own certs) | ISTIO_MUTUAL (control plane certs)
            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: 5
            interval: 5m
            baseEjectionTime: 5m
            maxEjectionPercent: 50
  # После задания параметров перенаправления для 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 # создавать ли манифест
    vault: # параметры для интеграции с HashiCorp Vault
      host: vault.host # хост сервиса HashiCorp Vault
      port: 8200 # порт сервиса HashiCorp Vault для обращения из pod'а
      externalPort: 8200 # порт сервиса HashiCorp Vault
      # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
      # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
      gwPort: 9444 # порт на egressGateway
      gwProtocol: TLS # протокол на egressGateway
      gwSvcProtocol: TCP # протокол на service egressGateway
      gwTls:
        mode: ISTIO_MUTUAL # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
      destinationRule: # параметры для манифеста DestinationRule Istio
        name: epf-vault-dr # имя манифеста
        create: false # создавать ли манифест
           tls: # параметры TLS в манифесте spec.trafficPolicy.portLevelSettings[0].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
           sni: vault.host
      virtualService: # параметры для манифеста VirtualService
        name: scheduler-vault-vs # имя манифеста
        protocol: http # протокол для создания virtual service. Валидные значения: http, tls, tcp
        create: true # создавать ли манифест VirtualService
    serviceEntry:
      - host: my_hostname
        port:
          name: tcp-kafka
          number: 9092
          protocol: TCP
        resolution: DNS
#        annotations: # расскомментировать если нужно чтобы serviceEntry осталась после helm uninstall
#          "helm.sh/resource-policy": keep
#      - host: my_hostname_2
#        addresses: { IP_ADDRESS } 
#        port:
#          name: tcp-kafka
#          number: 9092
#          protocol: TCP
#        resolution: STATIC
#      - host: my_hostname_3
#        port:
#          name: tcp-kafka
#          number: 9092
#          protocol: TCP
#        resolution: NONE

Блок istio.serviceEntry предназначен для соединений отличных от Kafka.

При запуске создаются:

  • манифест Deployment «evpt-eggressgateway» с Istio proxy;

  • манифесты Istio для маршрутизации трафика от EVPT через Deployment «evpt-eggressgateway» в Kafka.

Описание работы с базой данных#

Для работы компонента EVPT с компонентом Граничный прокси (IGEG) продукта Platform V Synapse Service Mesh необходимо в файле vars.yaml в блоке istio заполнить параметры в блоках annotations и postgres.

Пример заполнения блока annotations#

За выпуск сертификатов для подключения отвечает vault-agent по параметрам из аннотаций, которые указываются в блоке istio.egress.deployment.annotations файла vars.yml.

annotations:
  sidecar.istio.io/inject: "true" # Включение интеграции с Сервисным прокси SVPX/ istio

Пример заполнения блока istio#

Компонент EVPT подключается к внутренним hosts базы данных без пртокола TLS по PLAINTEXT, терминация трафика происходит на Граничном прокси (IGEG).

Для перечисления hosts базы данных необходимо использовать блок istio.postgres.

  istio: # настройки манифестов Istio
    egress:
      deployment:
        create: true # создавать ли Deployment для istio egressgateway
        name: evpt-egressgateway
        resources:
          limits:
            cpu: 0.1
            memory: 128M
          requests:
            cpu: 0.1
            memory: 64M
        annotations: # Заполнить аннотации для выпуска сертификатов
          sidecar.istio.io/inject: 'true' # Включение интеграции с Сервисным прокси SVPX/ istio
          # Дополнительные аннотации для граничного прокси. Здесь можно описать импорт сертификатов из vault/secman
          vault.hashicorp.com/agent-inject-template-cert.pem: |
            {%- raw %}
            {{- with secret "A/DEV/SY/EVPT/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: TEST
          vault.hashicorp.com/role: test-role
          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/EVPT/KV/example-audit-cert" -}}
            {{ index .Data "key" }}
            {{- end }}
            {%- endraw %}
          vault.hashicorp.com/agent-inject-template-ca.pem: |
            {%- raw %}
            {{- with secret "A/DEV/SY/EVPT/KV/example-audit-cert" -}}
            {{ index .Data "ca" }}
            {{- end }}
            {%- endraw %}
        labels:
          secman-injector: enabled # лейбл для активации интеграции с secman vault agent injector
        istioDiscoveryService: istiod # название discovery сервиса панели Istio к которой подключен ваш namespace
        istioControlPlane: control-plane-01 # название namespace контрольной панели Istio к которой подключен ваш namespace
        proxyImage: image # ссылка на образ граничного прокси (IGEG)
    egressService: # параметры сервиса Egress
      name: "egressgateway0-svc" # имя сервиса Egress
      create: true # создавать ли манифест сервиса
      internalPort: 9443 # внутренний порт Egress
      selector: # содержимое поля spec.selector в манифесте сервиса
        app: evpt-egressgateway
        istio: egressgateway
    gateway: # параметры манифеста Gateway для Istio Egress
      name: egressgateway0-gw # имя манифеста
      create: true # создавать ли манифест
      selector: # содержимое поля spec.selector в манифесте
        istio: egressgateway
      destinationRule:
        name: egressgateway0-dr
        create: true
          tls:
            mode: MUTUAL # DISABLE | SIMPLE | MUTUAL (own certs) | ISTIO_MUTUAL (control plane certs)
            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: 5
            interval: 5m
            baseEjectionTime: 5m
            maxEjectionPercent: 50
  # После задания параметров перенаправления для kafka, из прикладного приложения к bootstrap серверу нужно обращаться на хост следующего формата:
  # # {название_сервиса_egressgateway}.{имя_неймспейса}.svc.cluster.local:{gwPort_для_кафки_указываемый_ниже}
    postgres: # настройки манифестов Istio для работы с базой данных
       host: postgres.host # хост сервиса Postgres; указывать валидный SAN из сертификата
       port: 5432 # порт сервиса Postgres для обращения из pod'а
       externalPort: 5432 # порт сервиса Postgres
       # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
       # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
       gwPort: 9445 # порт на egressGateway
       gwProtocol: TCP # протокол на egressGateway
       gwSvcProtocol: TCP # протокол на service egressGateway
       gwTls:
         mode: ISTIO_MUTUAL # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
      destinationRule:
        create: false # создавать ли манифест
        name: postgres-dr-1 # имя манифеста
        tls:
          mode: MUTUAL # DISABLE | SIMPLE | MUTUAL (own certs) | ISTIO_MUTUAL (control plane certs)
          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: 5
          interval: 5m
          baseEjectionTime: 5m
          maxEjectionPercent: 50
      virtualService: # параметры для манифеста VirtualService
        #      name: postgres-vs-1 # имя манифеста
        create: false # создавать ли манифест VirtualService
    vault: # параметры для интеграции с HashiCorp Vault
      host: vault.host # хост сервиса HashiCorp Vault
      port: 8200 # порт сервиса HashiCorp Vault для обращения из pod'а
      externalPort: 8200 # порт сервиса HashiCorp Vault
      # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
      # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
      gwPort: 9444 # порт на egressGateway
      gwProtocol: TLS # протокол на egressGateway
      gwSvcProtocol: TCP # протокол на service egressGateway
      gwTls:
        mode: ISTIO_MUTUAL # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
      destinationRule: # параметры для манифеста DestinationRule Istio
        name: epf-vault-dr # имя манифеста
        create: false # создавать ли манифест
           tls: # параметры TLS в манифесте spec.trafficPolicy.portLevelSettings[0].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
           sni: vault.host
      virtualService: # параметры для манифеста VirtualService
        name: scheduler-vault-vs # имя манифеста
        protocol: http # протокол для создания virtual service. Валидные значения: http, tls, tcp
        create: true # создавать ли манифест VirtualService
    serviceEntry:
      - host: my_hostname
        port:
          name: tcp-kafka
          number: 9092
          protocol: TCP
        resolution: DNS
#        annotations: # расскомментировать если нужно чтобы serviceEntry осталась после helm uninstall
#          "helm.sh/resource-policy": keep
#      - host: my_hostname_2
#        addresses: { IP_ADDRESS }
#        port:
#          name: tcp-kafka
#          number: 9092
#          protocol: TCP
#        resolution: STATIC
#      - host: my_hostname_3
#        port:
#          name: tcp-kafka
#          number: 9092
#          protocol: TCP
#        resolution: NONE

Блок istio.serviceEntry предназначен для соединений отличных от базы данных.

При запуске создаются:

  • манифест Deployment «evpt-eggressgateway» с Istio proxy;

  • манифесты Istio для маршрутизации трафика от EVPT через Deployment «evpt-eggressgateway» в базе данных.

Манифесты Istio после выполнения скриптов установки#

  1. Service — сервис для Deployment «evpt-eggressgateway»:

kind: Service
apiVersion: v1
metadata:
  name: egressgateway0-svc-test
  namespace: namespace
  labels:
    app: scheduler-evpt
    app.kubernetes.io/managed-by: Helm
    appVersion: version
    istio: egressgateway
    version: 3.0.0-14
spec:
  clusterIP: 
  ipFamilies:
    - IPv4
  ports:
    - name: status-port
      protocol: TCP
      port: 15021
      targetPort: 15021
    - name: tcp-vault-9447
      protocol: TCP
      port: 9447
      targetPort: 9447
    - name: kafka-10092
      protocol: TCP
      port: 10092
      targetPort: 10092
  internalTrafficPolicy: Cluster
  clusterIPs:
  type: ClusterIP
  ipFamilyPolicy: SingleStack
  sessionAffinity: None
  selector:
    app: evpt-egressgateway
    istio: egressgateway
  1. ServiceEntry — запись для доступа к брокерам Kafka вне ServiceMesh:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: vm-syevseg-sy-broker1-9092-service-entry
  namespace: namespace
spec:
  endpoints:
    - address: broker1
      ports:
        kafka-9092: 9092
    - address: broker2
      ports:
        kafka-9092: 9092
  exportTo:
    - .
  hosts:
    - broker1
  location: MESH_EXTERNAL
  ports:
    - name: kafka-9092
      number: 9092
      protocol: kafka
  resolution: DNS
  1. VirtualService — правило для перенаправления трафика внутри mesh на «evpt-egressgateway» и из него в Kafka:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  resourceVersion: '345483853'
  name: eventprocessflowakka-evpt-js-kafka-vs-10092
  namespace: namespace
  labels:
    app: scheduler-evpt
    app.kubernetes.io/managed-by: Helm
    appVersion: version
    version: 3.0.0-14
spec:
  exportTo:
    - .
  gateways:
    - egressgateway0-gw-test
    - mesh
  hosts:
    - egressgateway0-svc-test.namespace.svc.cluster.local
  tcp:
    - match:
        - gateways:
            - mesh
          port: 10092
      route:
        - destination:
            host: egressgateway0-svc-test
            port:
              number: 10092
    - match:
        - gateways:
            - egressgateway0-gw-test
          port: 10092
      route:
        - destination:
            host: broker1
            port:
              number: 9092
  1. Gateway — указывает, какой порт открыть в прокси «evpt-egressgateway»:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: egressgateway0-gw-test
  namespace: namespace
  labels:
    app: scheduler-evpt
    app.kubernetes.io/managed-by: Helm
    appVersion: version
    version: 3.0.0-14
spec:
  selector:
    app: evpt-egressgateway
    istio: egressgateway
  servers:
    - hosts:
        - secman.solution.sbt
      port:
        name: tls-vault-9447
        number: 9447
        protocol: TLS
      tls:
        mode: PASSTHROUGH
    - hosts:
        - egressgateway0-svc-test.namespace.svc.cluster.local
      port:
        name: kafka-10092
        number: 10092
        protocol: kafka
      tls:
        mode: ISTIO_MUTUAL
  1. DestinationRule — задает правило с какими сертификатами подключаться к кластеру Kafka (одно на каждый брокер Kafka):

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: eventprocessflowakka-evpt-js-kafka-dr-10092
  namespace: namespace
spec:
  exportTo:
    - .
  host: broker1
  trafficPolicy:
    tls:
      clientCertificate: <сертификат выпускаемый vault-agent>
      caCertificates: <сертификат УЦ от vault-agent>
      mode: MUTUAL
      privateKey: <приватный ключ выпускаемый vault-agent>
  workloadSelector:
    matchLabels:
      istio: egressgateway
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: eventprocessflowakka-evpt-js-kafka-dr-10092
  namespace: namespace
spec:
  exportTo:
    - .
  host: broker2
  trafficPolicy:
    tls:
      clientCertificate: <сертификат выпускаемый vault-agent>
      caCertificates: <сертификат УЦ от vault-agent>
      mode: MUTUAL
      privateKey: <приватный ключ выпускаемый vault-agent>
  workloadSelector:
    matchLabels:
      istio: egressgateway