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

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

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

sidecar.istio.io/inject: 'true'

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

istio: # настройки манифестов Istio
    egressService: # параметры сервиса Egress
      #      name: "egressgateway0-svc" # имя сервиса Egress
      create: false # создавать ли манифест сервиса
    #      internalPort: 9443 # внутренний порт Egress
    #      selector: # содержимое поля spec.selector в манифесте сервиса
    #        app: egressgateway-tribe-sy-synes-dev
    #        istio: egressgateway-tribe-sy-synes-dev
    gateway: # параметры манифеста Gateway для Istio Egress
      #      name: egressgateway0-gw # имя манифеста
      create: false # создавать ли манифест
    #      selector: # содержимое поля spec.selector в манифесте
    #        istio: egressgateway-tribe-sy-synes-dev
    vault: # параметры для интеграции с HashiCorp Vault
      #      host: srv-68-6.sy.dev.sbt # хост сервиса HashiCorp Vault
      #      port: 8200 # порт сервиса HashiCorp Vault
      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: epf-vault-vs # имя манифеста
        create: false # создавать ли манифест VirtualService
    audit: # параметры для интеграции с сервисом Аудита
      #      host: ext-http.audit2-http-proxy.apps.stands-vdc01.solution.sbt # хост сервиса Аудита
      #      port: 80 # порт сервиса Аудита
      destinationRule: # параметры для манифеста DestinationRule Istio
        #        name: epf-audit-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
      virtualService: # параметры для манифеста VirtualService
        #        name: epf-audit-vs # имя манифеста
        create: false # создавать ли манифест VirtualService

Получение сертификатов из 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:
    outlierDetection:
      consecutive5xxErrors: 7
      interval: 5m
      baseEjectionTime: 15m
      maxEjectionPercent: 10
    portLevelSettings:
      - port:
          number: 8550
        tls:
          mode: DISABLE

Здесь в параметрах блока outlierDetection задается настройка автоматического выключателя, которая отслеживает состояние каждого отдельного хоста в вышестоящей службе. Применимо как к службам HTTP и TCP:

  • для HTTP-сервисов хосты, которые постоянно возвращают ошибки 5xx для вызовов API, выбрасываются из пула на заранее определенный период времени;

  • для TCP-сервисов тайм-ауты соединения или сбои соединения с данным хостом считаются ошибкой при измерении последовательной метрики ошибок.