﻿# Проксирование баз данных в Kubernetes через DB‑Gateway

> [HTML Version](proxy-db-kubernetes.html)

Одним из этапов подготовки инфраструктуры для работы с приложением ELMA365 является настройка проксирования запросов к базам данных. Для этого вы можете использовать инструмент DB‑Gateway. 

Он обеспечивает доступ к базам данных Redis, RabbitMQ, PostgreSQL и MinIO через точку входа в Kubernetes‑кластере. Это упрощает процесс подключения к базам данных и работу с ними, а также оптимизирует количество инфраструктурных компонентов, необходимых для настройки проксирования.

Установка DB‑Gateway состоит из следующих этапов:

1. [Загрузить helm‑чарт и конфигурационный файл](#upload-helm).

2. [Заполнить конфигурационный файл](#configuration-file).

3. [Установить чарт DB‑Gateway с помощью Helm в Kubernetes‑кластер](#install-dbgateway).

4. [Подключиться к базам данных](#connect-db).

## Шаг 1. Загрузить helm-чарт и конфигурационный файл

Для установки через интернет получите конфигурационный файл \[OBJECT\], выполнив команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm show values elma365/dbgateway > values-dbgateway.yaml

````
Получение конфигурационного файла для установки в закрытом контуре без доступа в интернет



1. На компьютере с доступом в интернет загрузите архив актуальной версии (latest) чарта DB‑Gateway из репозитория elma365, выполнив команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm pull elma365/dbgateway

2. ````
Полученный архив чарта \[OBJECT\] скопируйте на сервер, где будет производиться установка.

3. На сервере распакуйте чарт \[OBJECT\] и скопируйте конфигурационный файл по умолчанию \[OBJECT\] в \[OBJECT\]:

````
tar -xf dbgateway-X.Y.Z.tgz  
cp dbgateway/values.yaml values-dbgateway.yaml
````

## ````
Шаг 2. Заполнить конфигурационный файл

Заполните конфигурационный файл \[OBJECT\] для установки DB‑Gateway:

1. В параметре \[OBJECT\] укажите домен (FQDN) или IP‑адрес, по которому доступно приложение ELMA365.

2. В параметре \[OBJECT\] укажите наименование бакета (в хранилище баз данных), в котором хранятся файлы приложения ELMA365.  
Наименование бакета в базе данных должно соответствовать формату DBelma365.

````
Начало примера

````
Пример

1. DBelma365.

2. DBelma365-dev.

3. DBelma365-prod.

````
конец примера

3. ````
Следующие изменения нужно внести в конфигурационный файл, если веб‑интерфейс приложения ELMA365 доступен по HTTPS:

- в параметре \[OBJECT\] укажите домен (FQDN);

- в параметре \[OBJECT\] укажите имя класса ingress‑контроллера;

- включите поддержку TLS, установив значение \[OBJECT\] в параметре \[OBJECT\];

- раскомментируйте параметры секции \[OBJECT\];

- для параметра \[OBJECT\] укажите домен (FQDN), по которому доступно приложение ELMA365;

- для параметра \[OBJECT\] укажите наименование \[OBJECT\] типа \[OBJECT\] для домена, указанного в \[OBJECT\].

4. Если обеспечивается отказоустойчивость, в параметре \[OBJECT\] укажите необходимое количество реплик.

5. В параметре \[OBJECT\] указана конфигурация HAProxy, с которой этот инструмент запустится в Kubernetes‑кластере. В секции \[OBJECT\] конфигурации HAProxy укажите список серверов баз данных, на которые будет перенаправляться пользовательский трафик.

Пример настройки HAProxy для проксирования подключения к хранилищу баз данных

  
В примере рассматриваются базы данных Redis, RabbittMQ, PostgreSQL и MinIO, расположенные вне Kubernetes‑кластера и развёрнутые согласно инструкции в разделе [«Отказоустойчивая инфраструктура»](configure-postgresql.md). Настроим для серверов с этими базами данных проксирование пользовательского трафика.

````
  
\## Настройки haproxy для проксирования подключения к хранилищу баз данных  
haproxy:  
 global:  
   security:  
     allowInsecureImages: true  
\## включение поддержки Gateway API  
 httpRoute:  
   enabled: false  
   parentRefs:  
   - name: main-gateway  
     namespace: istio-system  
 ingress:  
   enabled: true  
\## включение поддержки HAProxy Ingress для работы на платформе OpenShift  
   openshift: false  
\## домен (FQDN) по которому доступна система  
   hostname: elma365-server.your-domain  
\## наименование bucket'а (в хранилище S3) для приложение ELMA365  
   path: /s3elma365  
   ingressClassName: "nginx"  
\## внутренний health-check/probe URL, который MinIO генерирует для проверки доступности  
   extraPaths:  
   - path: /probe-bsign(.\*)  
     pathType: ImplementationSpecific  
     backend:  
       service:  
         name: dbgateway-haproxy  
         port:  
           name: http  
   annotations:  
     nginx.ingress.kubernetes.io/proxy-body-size: '0'  
\#      kubernetes.io/ingress.class: nginx  
\## включение https  
   tls: false  
\#    extraTls:  
\#    - hosts:  
\#        - elma365-server.your-domain  
\#      secretName: elma365-server.your-domain-tls  
\## количество реплик для обеспечения высокой доступности  
 replicaCount: 2  
 containerPorts:  
   - name: http  
     containerPort: 8080  
   - name: redis  
     containerPort: 6379  
   - name: sentinel  
     containerPort: 26379  
   - name: rabbitmq  
     containerPort: 5672  
   - name: rabbitmq-stats  
     containerPort: 15672  
   - name: postgres  
     containerPort: 5000  
\## конфигурация haproxy  
 configuration: |  
   global  
     log stdout format raw local0  
     maxconn 1024  
   defaults  
     log global  
     timeout client 60s  
     timeout connect 60s  
     timeout server 60s  
   ### S3 MinIO ###  
   frontend fe\_s3\_main  
     bind :8080  
     default\_backend be\_s3\_main  
   backend be\_s3\_main  
     balance leastconn  
     server s3\_1 192.168.1.241:9000 check inter 2s  
     server s3\_2 192.168.1.242:9000 check inter 2s  
     server s3\_3 192.168.1.243:9000 check inter 2s  
     server s3\_4 192.168.1.244:9000 check inter 2s  
   ### S3 MinIO ###  
   ### Redis ###  
   listen redis\_master  
     option tcplog  
     option clitcpka  
     bind :6379  
     balance first  
     mode tcp  
     timeout queue 2s  
     timeout connect 2s  
     timeout check 1s  
     option srvtcpka  
     timeout server 24h  
     server redis-server1 192.168.1.237:6379 check inter 5s  
     server redis-server2 192.168.1.238:6379 check inter 5s  
     server redis-server3 192.168.1.239:6379 check inter 5s  
   ### Redis ###  
   ### RabbitMQ ###  
   listen rabbitmq  
       bind :5672  
       mode tcp  
       balance roundrobin  
       server rabbitmq-server1 192.168.1.234:5672 check inter 2s rise 2 fall 3  
       server rabbitmq-server2 192.168.1.235:5672 check inter 2s rise 2 fall 3  
       server rabbitmq-server3 192.168.1.236:5672 check inter 2s rise 2 fall 3  
  
   listen rabbitmq\_management  
       bind :15672  
       balance source  
       server rabbitmq-server1 192.168.1.234:15672 check inter 2s  
       server rabbitmq-server2 192.168.1.235:15672 check inter 2s  
       server rabbitmq-server3 192.168.1.236:15672 check inter 2s  
   ### RabbitMQ ###  
   ### PostgreSQL ###  
   listen postgres\_master  
       bind :5000  
       option tcplog  
       option httpchk OPTIONS /master  
       http-check expect status 200  
       default-server inter 3s fastinter 1s fall 3 rise 4 on-marked-down shutdown-sessions  
       server postgres-server1 192.168.1.251:5432 check port 8008  
       server postgres-server2 192.168.1.252:5432 check port 8008  
       server postgres-server3 192.168.1.253:5432 check port 8008  
  
   listen postgres\_replicas  
       bind :5001  
       option tcplog  
       option httpchk OPTIONS /replica  
       balance roundrobin  
       http-check expect status 200  
       default-server inter 3s fastinter 1s fall 3 rise 2 on-marked-down shutdown-sessions  
       server postgres-server1 192.168.1.251:5432 check port 8008  
       server postgres-server2 192.168.1.252:5432 check port 8008  
       server postgres-server3 192.168.1.253:5432 check port 8008  
   ### PostgreSQL ###  
\## политики контекста безопасности  
 podSecurityContext:  
   enabled: true  
   fsGroup: 1001  
 containerSecurityContext:  
   enabled: true  
   runAsUser: 1001  
   runAsNonRoot: true  
\## указание ресурсов  
 resources:  
   requests:  
     memory: "64Mi"  
     cpu: "50m"  
   limits:  
     memory: "512Mi"  
     cpu: "500m"  
...


````

6. ````
Если вы устанавливаете чарт DB‑Gateway в закрытом контуре без доступа в интернет, заполните параметры подключения к приватному **registry**. 

Пример заполнения параметров для подключения к приватному registry



1. Задайте адрес в параметре \[OBJECT\].

2. Задайте путь в параметре \[OBJECT\].

3. Укажите наименование секрета с правами доступа к приватному **registry** (должен быть создан вручную и зашифрован в Base64) в параметре \[OBJECT\].

````
\# Настройки haproxy для проксирования подключения к хранилищу баз данных  
haproxy:  
...  
  # Параметры подключения к приватному registry  
  image:  
    # адрес и путь для приватного registry  
    registry: registry.example.com  
    repository: /bitnami/haproxy  
    tag: 3.0.5-debian-12-r0  
    # секрет с правами доступа к приватному registry должен быть создан вручную и зашифрован в Base64  
    pullSecrets:  
      - myRegistryKeySecretName
````

## ````
Шаг 3. Установить чарт DB-Gateway с помощью Helm в Kubernetes-кластер 

Установите чарт DB‑Gateway в \[OBJECT\].

Для установки через интернет выполните команду:

````
helm upgrade --install dbgateway elma365/dbgateway -f values-dbgateway.yaml -n dbgateway --create-namespace````
 

Для установки без доступа в интернет выполните команду:

````
helm upgrade --install dbgateway ./dbgateway -f values-dbgateway.yaml -n dbgateway --create-namespace````
 

## Шаг 4. Подключиться к базам данных

В конфигурационном файле \[OBJECT\] заполните параметры, чтобы приложение ELMA365 подключалось к базам данных через настроенный инструмент DB‑Gateway:

- параметры для подключения к MinIO:

	- \[OBJECT\] — укажите \[OBJECT\];

	- \[OBJECT\], \[OBJECT\], \[OBJECT\], \[OBJECT\], \[OBJECT\] и \[OBJECT\] — укажите значения согласно параметрам хранилища базы данных, для которого настраивается проксирование;

- параметры для подключения к Redis:

````
elma365.db.redisUrl — 'redis://:SecretPassword@redis.dbgateway.svc.cluster.local:6379/0';

- ````
параметры для подключения к RabbitMQ:

````
elma365.db.amqpUrl — 'amqp://elma365user:SecretPassword@rabbitmq.dbgateway.svc.cluster.local:5672/0';  
elma365.db.amqpManagementUrl — 'http://rabbitmq-stats.dbgateway.svc.cluster.local:15672';

- ````
параметры для подключения к PostgreSQL:

````
elma365.db.psqlUrl — 'postgres://elma365user:SecretPassword@postgres.dbgateway.svc.cluster.local:5000/elma365?sslmode=disable';  
elma365.db.roPsqlUrl — 'postgresql://elma365user:SecretPassword@postgresqlro.dbgateway.svc.cluster.local:5001/elma365?sslmode=disable';

````
Подробнее о заполнении этих параметров читайте в статье [«Изменение параметров ELMA365 Enterprise»](change-settings-enterprise.md).