﻿# Проксирование S3 в Kubernetes через S3-Gateway

> [HTML Version](proxy-s3-kubernetes.html)

Проксирование трафика до S3‑хранилища — это один из этапов подготовки инфраструктуры для работы с ELMA365. Для этого можно использовать инструмент S3‑Gateway. 

Он обеспечивает доступ к S3‑хранилищу, развёрнутому внутри или вне Kubernetes‑кластера, через единую точку входа — домен (FQDN) или IP‑адрес для ELMA365.

Установка S3‑Gateway состоит из нескольких этапов:

1. [Скачивание Helm-чарта и конфигурационного файла](#download-helm-chart-and-config-file).

2. [Заполнение конфигурационного файла](#fill-config-file).

3. [Установка с помощью Helm в Kubernetes-кластер чарта S3-Gateway](#set-chart-s3-gateway).

4. [Подключение к S3](#s3-connect).

## Шаг 1. Скачивание Helm-чарта и конфигурационного файла

Для установки через интернет получите конфигурационный файл \[OBJECT\], выполнив команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm show values elma365/s3gateway > values-s3gateway.yaml

````
Получение конфигурационного файла для установки в закрытом контуре без доступа в интернет

1. На компьютере с доступом в интернет загрузите архив актуальной версии (latest) чарта S3-Gateway из репозитория elma365, выполнив команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm pull elma365/s3gateway

2. ````
Полученный архив чарта **s3gateway-X.Y.Z.tgz** скопируйте на сервер, где будет производиться установка.

3. На сервере распакуйте чарт **s3gateway-X.Y.Z.tgz** и скопируйте конфигурационный файл по умолчанию \[OBJECT\] в \[OBJECT\]: 

````
tar -xf s3gateway-X.Y.Z.tgz  
cp s3gateway/values.yaml values-s3gateway.yaml
````

## ````
Шаг 2. Заполнение конфигурационного файла

Заполните конфигурационный файл \[OBJECT\] для установки S3‑Gateway:

1. В параметре \[OBJECT\] укажите домен (FQDN) или IP-адрес, по которому доступно приложение ELMA365. 

2. В параметре \[OBJECT\] укажите наименование бакета (в хранилище S3), в котором приложение ELMA365 хранит файлы.  
Наименование бакета в S3 должно соответствовать формату **s3elma365**.

````
Начало примера

````
Пример

1. s3elma365.

2. s3elma365-dev.

3. s3elma365-prod.

````
конец примера

3. ````
Следующие изменения нужно внести в конфигурационный файл, если веб‑интерфейс приложения ELMA365 доступен по HTTPS:

- в параметре \[OBJECT\] укажите домен (FQDN);

- включите поддержку TLS, установив значение \[OBJECT\] в параметре \[OBJECT\];

- раскомментируйте параметры секции \[OBJECT\];

- для параметра \[OBJECT\] укажите домен (FQDN), по которому доступно приложение ELMA365;

- для параметра \[OBJECT\] укажите наименование \[OBJECT\] типа \[OBJECT\] для домена, указанного в \[OBJECT\].

4. Если нужно обеспечить отказоустойчивость, в параметре \[OBJECT\] укажите необходимое количество реплик.

5. В параметре \[OBJECT\] указана конфигурация HAProxy, с которой он запустится в Kubernetes‑кластере. В секции \[OBJECT\] конфигурации HAProxy укажите список серверов S3, на которые необходимо перенаправить пользовательский трафик.

Пример проксирования пользовательского трафика в хранилище S3 MinIO чартом elma365 dbs без поддержки TLS в Kubernetes-кластере

  
В примере S3-хранилище устанавливается согласно инструкции в статье [«MinIO S3»](configure-minio.md).

````
  
\## Настройки haproxy для проксирования подключения к S3 хранилищу.  
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  
\## внутренний health-check/probe URL, который MinIO генерирует для проверки доступности  
   extraPaths:  
   - path: /probe-bsign(.\*)  
     pathType: ImplementationSpecific  
     backend:  
       service:  
         name: s3gateway-haproxy  
         port:  
           name: http  
   ingressClassName: "nginx"  
   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: 1  
 containerPorts:  
   - name: http  
     containerPort: 8080  
\## конфигурация haproxy  
 configuration: |  
   global  
     log stdout format raw local0  
     maxconn 1024  
   defaults  
     log global  
     timeout client 60s  
     timeout connect 60s  
     timeout server 60s  
   frontend fe\_s3\_main  
     bind :8080  
     default\_backend be\_s3\_main  
   backend be\_s3\_main  
     server s3\_1 minio-server1.your-domain:9000 check inter 2s  
\## политики контекста безопасности  
 podSecurityContext:  
   enabled: true  
   fsGroup: 1001  
 containerSecurityContext:  
   enabled: true  
   runAsUser: 1001  
   runAsNonRoot: true  
\## указание ресурсов  
 resources:  
   requests:  
     memory: "64Mi"  
     cpu: "50m"  
   limits:  
     memory: "512Mi"  
     cpu: "500m"  
...


````

````


Пример проксирования пользовательского трафика в хранилище S3 MinIO с поддержкой TLS

  
В примере четыре сервера S3 (MinIO) расположены вне Kubernetes-кластера и развёрнуты согласно инструкции в статье  [«Кластер MinIO»](minio-cluster.md).

````
  
\## Настройки haproxy для проксирования подключения к S3 хранилищу  
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  
\## внутренний health-check/probe URL, который MinIO генерирует для проверки доступности  
   extraPaths:  
   - path: /probe-bsign(.\*)  
     pathType: ImplementationSpecific  
     backend:  
       service:  
         name: s3gateway-haproxy  
         port:  
           name: http  
   ingressClassName: "nginx"  
   annotations:  
     nginx.ingress.kubernetes.io/proxy-body-size: '0'  
\#      kubernetes.io/ingress.class: nginx  
\## включение https  
  tls: true  
    extraTls:  
    - hosts:  
        - elma365-server.your\_domain  
    secretName: elma365-server.your\_domain-tls  
\## количество реплик для обеспечения высокой доступности  
 replicaCount: 1  
 containerPorts:  
   - name: http  
     containerPort: 8080  
\## конфигурация haproxy  
 configuration: |  
   global  
     log stdout format raw local0  
     maxconn 1024  
   defaults  
     log global  
     timeout client 60s  
     timeout connect 60s  
     timeout server 60s  
   frontend fe\_s3\_main  
     bind :8080  
     default\_backend be\_s3\_main  
   backend be\_s3\_main  
      balance leastconn  
      server s3\_1 minio-server1.your\_domain:9000 check-ssl ssl verify none check inter 2s  
      server s3\_2 minio-server1.your\_domain:9000 check-ssl ssl verify none check inter 2s  
      server s3\_3 minio-server1.your\_domain:9000 check-ssl ssl verify none check inter 2s  
      server s3\_4 minio-server1.your\_domain:9000 check-ssl ssl verify none check inter 2s  
\## политики контекста безопасности  
 podSecurityContext:  
   enabled: true  
   fsGroup: 1001  
 containerSecurityContext:  
   enabled: true  
   runAsUser: 1001  
   runAsNonRoot: true  
\## указание ресурсов  
 resources:  
   requests:  
     memory: "64Mi"  
     cpu: "50m"  
   limits:  
     memory: "512Mi"  
     cpu: "500m"  
...


````

6. ````
Если вы устанавливаете S3‑Gateway в закрытом контуре без доступа в интернет, заполните параметры подключения к приватному registry.

Пример заполнения параметров для подключения к приватному registry



1. Задайте адрес в параметре \[OBJECT\].

2. Задайте путь в параметре \[OBJECT\].

3. Укажите наименование секрета с правами доступа к приватному **registry** в параметре** **\[OBJECT\]. Приватный **registry** должен быть создан вручную и зашифрован в Base64.

````
\# Настройки HAProxy для проксирования подключения к S3-хранилищу  
haproxy:  
...  
  # Параметры подключения к приватному registry  
  image:  
    # адрес и путь для приватного registry  
    registry: registry.example.com  
    repository: /bitnami/haproxy  
\#   tag: 2.7.3-debian-11-r5  
    # секрет с правами доступа к приватному registry должен быть создан вручную и зашифрован в Base64  
    pullSecrets:  
      - myRegistryKeySecretName
````

## ````
Шаг 3. Установка с помощью Helm в Kubernetes-кластер чарта S3-Gateway

Установите чарт S3-Gateway в \[OBJECT\].

Для установки через интернет выполните команду:

````
helm upgrade --install s3gateway elma365/s3gateway -f values-s3gateway.yaml -n s3gateway --create-namespace 

````
Для установки без доступа в интернет выполните команду:

````
helm upgrade --install s3gateway ./s3gateway -f values-s3gateway.yaml -n s3gateway --create-namespace 

## ````
Шаг 4. Подключение к S3

Параметры для подключения к S3:

- \[OBJECT\] — укажите \[OBJECT\];

- \[OBJECT\], \[OBJECT\], \[OBJECT\], \[OBJECT\] и \[OBJECT\] — укажите значения согласно параметрам S3-хранилища, для которого настраивается проксирование.

````
начало внимание

````
Подготовка инфраструктуры происходит до установки приложения ELMA365. Если была произведена установка чарта S3-Gateway, измените адрес подключения к S3 (**elma365.s3.backend.address**) в [настройках приложения ELMA365](change-settings-enterprise.md#changes-config-file).

````
конец внимание
````