Настройка интеграции с 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 |
|
vault.hashicorp.com/agent-init-first |
Должны ли быть получены секреты до старта самого контейнера приложения |
|
vault.hashicorp.com/agent-pre-populate |
Включать ли контейнер init для предварительного заполнения тома общей памяти секретами перед запуском контейнеров |
|
vault.hashicorp.com/preserve-secret-case |
Сохранять ли регистр секретных имен при создании секретных файлов |
|
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, то для того, чтобы полученный секрет был записан в файл, необходимо указать данную аннотацию с любым значением (будет переписано шаблоном) |
|
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-сервисов тайм-ауты соединения или сбои соединения с данным хостом считаются ошибкой при измерении последовательной метрики ошибок.