Высокая доступность Ozone S3 Gateway

Ozone S3 Gateway (S3G) предоставляет S3-совместимый интерфейс к хранилищу Ozone. Он спроектирован как stateless-компонент, то есть он не хранит данные локально. В Apache Ozone данные хранятся на локальных дисках Ozone Datanode, а метаданные управляются отдельно с помощью Ozone Manager и Ozone Storage Container Manager.

Такой архитектурный подход позволяет одновременно запускать несколько идентичных экземпляров S3 Gateway без особых проблем синхронизации, что позволяет использовать режим высокой доступности (HA). Если один экземпляр шлюза становится недоступным, другие продолжают обслуживать запросы без потери данных или несогласованности.

Компонент HAProxy Ozone S3G

Переключение между несколькими экземплярами Ozone S3 Gateway выполняется компонентом HAProxy Ozone S3G. Он действует как обратный прокси (reverse proxy) между S3-клиентами и серверами Ozone S3 Gateway в ADH.

Этот компонент основан на проекте HAProxy и использует его модель конфигурации, описанную в документации HAProxy.

ВАЖНО
  • Чтобы использовать Ozone S3 Gateway в режиме HA, S3-клиенты (AWS CLI, SDK или другие S3-совместимые инструменты) должны подключаться к эндпойнту HAProxy Ozone S3G, а не напрямую к отдельным экземплярам S3G.

  • Компоненты HAProxy Ozone S3G и Ozone S3G должны быть установлены на разных хостах, чтобы избежать конфликтов портов.

  • Для реализации HA на сетевом уровне можно развернуть несколько экземпляров HAProxy Ozone S3G.

Конфигурация HAProxy в ADCM

Когда сервис Ozone S3G работает в режиме HA, ADCM автоматически генерирует конфигурацию HAProxy для маршрутизации входящих запросов ко всем доступным экземплярам S3 Gateway.

Основным конфигурационным файлом является /etc/adh-haproxy/conf/haproxy-ozone-s3g.cfg. Этот файл генерируется из Jinja-шаблона в ADCM и его не рекомендуется редактировать вручную на хостах.

Чтобы изменить конфигурацию через ADCM:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите Ozone.

  3. Откройте вкладку Components и выберите HAProxy Ozone S3G.

  4. Выберите параметр haproxy-ozone-s3g.cfg и внесите необходимые изменения.

  5. Подтвердите изменения в конфигурации, нажав Save.

  6. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

При запуске сервиса итоговый файл haproxy-ozone-s3g.cfg будет сгенерирован из следующего шаблона:

{% set ssl_cert = '' %}
{%- if ozone_ssl_enable -%}
    {% set ssl_cert = ozone_haproxy_conf_ssl_vars %}
{% endif %}

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global (1)
    log /dev/log sample 1:10  local0
    log 127.0.0.1:514  local0
    log-tag hp-ozone-s3g

    chroot      /var/lib/adh-haproxy/ozone-s3g
    maxconn     1024
    user        haproxy
    group       haproxy
    daemon

    ssl-server-verify none

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults (2)
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s

listen stats (3)
    bind *:7002 {{ ssl_cert }}
    stats enable
    stats uri /

frontend ozone_s3g_http_in (4)
    bind *:{{ roles_ozone_vars_component_ports['haproxy_ozone_s3g']['s3'] }} {{ ssl_cert }}
    default_backend ozone_s3g_http_servers

backend ozone_s3g_http_servers (5)
    balance roundrobin
    {% for host in haproxy_ozone_s3g_conf_hosts %}
        {{ host }}
    {% endfor %}

frontend ozone_s3g_webui_http_in (6)
    bind *:{{ roles_ozone_vars_component_ports['haproxy_ozone_s3g']['webadmin'] }} {{ ssl_cert }}
    default_backend ozone_s3g_webui_http_servers

backend ozone_s3g_webui_http_servers (7)
    balance roundrobin
    {% for host in haproxy_ozone_s3g_webadmin_conf_hosts %}
        {{ host }}
    {% endfor %}
1 Глобальные параметры HAProxy (логирование, директория chroot, SSL и т.д.).
2 Параметры режима HTTP по умолчанию и настройки тайм-аутов.
3 Включает endpoint статистики и мониторинга HAProxy (по умолчанию: http://<haproxy_host>:7002/).
4 Определяет список прослушиваемых сокетов, принимающих входящие соединения по протоколу S3.
5 Список серверов Ozone S3 Gateway, на которые HAProxy пересылает S3-трафик. В цикле {% for host in …​ %} формируется список серверов Ozone S3G, доступных в кластере ADH. balance roundrobin равномерно распределяет запросы между всеми доступными хостами.
6 Определяет список прослушиваемых сокетов для веб-интерфейса Ozone S3G.
7 Список серверов S3 gateway, на которые HAProxy будет пересылать входящие запросы для веб-интерфейса Ozone S3G.
Пример итогового конфигурационного файла

 

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log /dev/log sample 1:10  local0
    log 127.0.0.1:514  local0
    log-tag haproxy-ozone-s3g

    chroot      /var/lib/adh-haproxy/ozone-s3g
    maxconn     1024
    user        haproxy
    group       haproxy
    daemon

    ssl-server-verify none

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s

listen stats
    bind *:7002 ssl crt /etc/ssl/serverkey.pem
    stats enable
    stats uri /

frontend ozone_s3g_http_in
    bind *:9879 ssl crt /etc/ssl/serverkey.pem
    default_backend ozone_s3g_http_servers

backend ozone_s3g_http_servers
    balance roundrobin
    server server1 test-adh-ozone1.ru-central1.internal:9879 ssl check inter 1s fall 2 rise 5
    server server2 test-adh-ozone2.ru-central1.internal:9879 ssl check inter 1s fall 2 rise 5
    server server3 test-adh-ozone3.ru-central1.internal:9879 ssl check inter 1s fall 2 rise 5

frontend ozone_s3g_webui_http_in
    bind *:19879 ssl crt /etc/ssl/serverkey.pem
    default_backend ozone_s3g_webui_http_servers

backend ozone_s3g_webui_http_servers
    balance roundrobin
    server server1 test-adh-ozone1.ru-central1.internal:19879 ssl check inter 1s fall 2 rise 5
    server server2 test-adh-ozone2.ru-central1.internal:19879 ssl check inter 1s fall 2 rise 5
    server server3 test-adh-ozone3.ru-central1.internal:19879 ssl check inter 1s fall 2 rise 5

Подробное описание настроек HAProxy доступно в документации HAProxy.

Конфигурация Ozone S3G

Чтобы использовать веб-интерфейс и эндпойнт REST API для получения секретов, настройте один из следующих параметров в конфигурационном файле /etc/ozone/conf/ozone-site.xml для Ozone S3G.

Параметр Описание Значение по умолчанию

ozone.s3g.webadmin.http-address

HTTP-адрес для использования веб-интерфейса S3 Gateway и получения секретов через REST API

0.0.0.0:19878

ozone.s3g.webadmin.https-address

HTTPS-адрес для использования веб-интерфейса S3 Gateway и получения секретов через REST API

0.0.0.0:19879

Чтобы изменить конфигурацию через ADCM:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите Ozone.

  3. Откройте вкладку Components и выберите Ozone S3G.

  4. Выберите нужный параметр и внесите изменения.

  5. Подтвердите изменения, нажав Save.

  6. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

Особенности Kerberos

Веб-интерфейс Ozone S3 Gateway предоставляет эндпойнт REST API для получения S3-секретов (если включен Kerberos/SPNEGO).

Чтобы включить аутентификацию Kerberos:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите Ozone.

  3. Откройте вкладку Components и выберите Ozone S3G.

  4. Установите флаг Advanced и нажмите Add property в разделе Custom ozone-site.xml.

  5. Добавьте параметр ozone.s3g.secret.http.enabled со значением True и подтвердите изменения, нажав Save.

  6. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

Получать секреты через REST API могут только администраторы. Добавить администратора Ozone можно через параметр ozone.administrators в разделе ozone-site.xml в ADCM. В этом случае пользователь автоматически получит административные привилегии для S3-хранилища.

Если необходимо добавить роль администратора только для Ozone S3G, добавьте параметр ozone.s3.administrators в разделе Custom ozone-site.xml в конфигурации компонента Ozone S3G.

Чтобы предоставить административный доступ группе пользователей, используйте параметр ozone.administrators.groups или ozone.s3.administrators.groups соответственно.

В качестве значения для всех параметров укажите список имен пользователей или групп, разделенных запятыми, которым необходимо выдать доступ администратора.

Чтобы добавить администратора или группу администраторов через ADCM:

  • Для Ozone

  • Для Ozone S3G

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите Ozone.

  3. В разделе ozone-site.xml заполните значения параметров ozone.administrators или ozone.administrators.groups.

  4. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите Ozone.

  3. Откройте вкладку Components и выберите Ozone S3G.

  4. Установите флаг Advanced и нажмите Add property в разделе Custom ozone-site.xml.

  5. Добавьте параметр ozone.s3.administrators или ozone.s3.administrators.groups, заполните значения и подтвердите изменения, нажав Save.

  6. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

Пример запроса аутентификации:

$ curl --insecure -X PUT --negotiate -u : https://<haproxy_host>:19879/secret/<username>

где:

  • <haproxy_host> — хост шлюза HAProxy;

  • <username> — имя пользователя для аутентификации.

Пример ответа:

<S3Secret>
  <awsAccessKey>user</awsAccessKey>
  <awsSecret>***</awsSecret>
</S3Secret>

Логирование

По умолчанию логи сохраняются в /var/log/adh-haproxy/ozone-s3g.log. Настройки логирования можно задать в секции global в конфигурационном файле haproxy-ozone-s3g.cfg.

Пример конфигурации Rsyslog:

$AddUnixListenSocket /var/lib/adh-haproxy/ozone-s3g/dev/log

:programname, startswith, "haproxy-ozone-s3g" {
/var/log/adh-haproxy/ozone-s3g.log
stop
}

Чтобы изменить конфигурацию Rsyslog через ADCM:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и нажмите Ozone.

  3. Откройте вкладку Components и выберите HAProxy Ozone S3G.

  4. Выберите параметр /etc/rsyslog.d/haproxy-ozone-s3g.conf и внесите необходимые изменения.

  5. Подтвердите изменения, нажав Save.

  6. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней