
Введение
Управление сотнями Redis инстансов в разных окружениях может стать сложной задачей. В нашем случае, все это добро крутилось в кубернетес кластерах, которые являлись платформой для развертывание редисов внутренними командами. При поддержке такой платформы часто возникает необходимость подключиться к Redis, чтобы проверить данные, выполнить команды, просмотреть сообщения в очереди и убедиться в работоспособности подключения. Использование redis-cli каждый раз не является самым удобным решением. Локальные GUI-клиенты также не всегда подходили, так как доступ был не ко всем окружениям и инстансам. Разные системы на рабочих машинах также создавали дополнительные трудности. Поэтому возникла идея создать веб-интерфейс для администрирования Redis, аналогичный тому, который существует, например, для Kafka.
После обзора существующих решений мы остановились на официальном Redis Insight, который обладает широким функционалом и приятным интерфейсом. Но внедрение его потребовало некоторых доработок, чтобы полностью удовлетворить наши требования.
Авторизация и аутентификация
Достаточно быстро выяснилось, что в Redis Insight, как и в других UI для Redis, отсутствует поддержка RBAC (Role-Based Access Control). Это представляло серьезную проблему, так как интерфейс, доступный всем пользователям с доступом к базе данных, был неприемлем. Однако при более детальном изучении исходников Redis Insight мы обнаружили, что он поддерживает аутентификацию через различные Identity Providers (IdP). Это дало нам возможность интеграции с нашим корпоративным IdP — Okta, с помощью oauth2-proxy.
Сам UI можно установить из чарта практически без модификаций. Я лишь добавляю персистентность для локальной базы
volume: enabled: true className: "" size: 1Gi annotations: helm.sh/resource-policy: "keep"
Устанавливаем наш релиз
helm repo add redisinsight https://spy86.github.io/redisinsight helm install my-redisinsight redisinsight/redisinsight --version 0.1.0 -f values.yaml
Для аутентификации необходимо создать application в Okta. Указать там callback_url: https:///oauth2/callback (путь имеет значение), а также группу пользователей кому будет разрешен доступ. В результате вы получите clientID, clientSecret. Также необходимо будет сгенерировать cookieSecret:
openssl rand -base64 24
После этого создаем такой values.yml
httpScheme: https config: clientID: <your_client_id> clientSecret: <your_client_secret> cookieSecret: <your_cookie_secret> configFile: "" extraArgs: upstream: http://redisinsight:5540/ code-challenge-method: S256 extraEnv: - name: OAUTH2_PROXY_PROVIDER_DISPLAY_NAME value: Okta - name: OAUTH2_PROXY_PROVIDER value: oidc - name: OAUTH2_PROXY_OIDC_ISSUER_URL value: https://<your_okta_domain> - name: OAUTH2_PROXY_PASS_ACCESS_TOKEN value: "true" - name: OAUTH2_PROXY_EMAIL_DOMAINS value: "*" - name: OAUTH2_PROXY_REDIRECT_URL value: https://<your_domain>/oauth2/callback - name: OAUTH2_PROXY_TLS_CERT_FILE value: /etc/oauth2-proxy/certs/tls.crt - name: OAUTH2_PROXY_TLS_KEY_FILE value: /etc/oauth2-proxy/certs/tls.key - name: OAUTH2_PROXY_TLS_MIN_VERSION value: "TLS1.3" service: type: LoadBalancer portNumber: 443 extraVolumes: - name: certs secret: secretName: tls extraVolumeMounts: - mountPath: /etc/oauth2-proxy/certs name: certs
Некоторые параметры почему то не передаются через переменные окружения, хотя должны. Поэтому пришлось их перенести в аргументы запуска. Установка релиза:
helm repo add oauth2-proxy https://oauth2-proxy.github.io/manifests helm install oauth2-proxy oauth2-proxy/oauth2-proxy -f values.yml
oauth2-proxy должен быть доступен снаружи кластера, я сделал это через Loadbalancer и примонтировал сертификаты для домена. Можно сделать это через ingress-controller. Для redis-insight доступ извне не требуется, запросы будут проходить через proxy.
При входе появляется форма аутентификации

И если, все настроено верно мы попадаем в наш UI

Использование oauth2-proxy позволило нам настроить аутентификацию через Okta и обеспечить безопасный доступ к интерфейсу только авторизованным ��ользователям. Проблемы с ограничен доступа решены, теперь у нас есть все, чтобы внедрять ui, ведь правда?
Автоматизация добавления инстансов
Если у вас несколько Redis инстансов и их состав меняется редко, управлять подключениями вручную через UI не представляет сложности. Однако в нашем случае количество инстансов превышало сотню, и изменения происходили примерно раз в неделю. Добавление нового подключения требовало ввод логина, пароля и набора сертификатов, что становилось трудоемкой задачей.
Документация по Redis Insight не упоминала возможности автоматизации через API или конфигурацию в виде кода. Однако, после детального изучения исходного кода и вопросов на форумах, мы обнаружили, что API все же существует.
Для добавление нового подключения необходимо сформировать тело запроса в формате json:
{ "host": "$host", "port": $port, "name": "your_instance_name", "username": "$username", "password": "$password", "tls":true, "verifyServerCert":false, "caCert": { "certificate": "$ca_cert", "name": "your_ca_name" }, "clientCert":{ "certificate": "$client_cert", "key": "$client_key", "name": "your_certificate_name" } }
А затем выполнить запрос к API
curl -s -X POST "http://redisinsight:5540/api/databases/" -H "Content-Type: application/json" -d @database.json
Это позволило нам автоматизировать процесс создания нового подключения, добавлением в CI/CD пайплайн создания инстанса.
Заключение
Внедрение веб-интерфейса для администрирования сотен Redis инстансов значительно упростило нашу работу. Использование Redis Insight, дополненное oauth2-proxy для аутентификации и автоматизация процесса добавления инстансов через API, позволили нам создать удобный и безопасный инструмент для работы с Redis. Эти изменения значительно сократили время и усилия, необходимые для управления нашей платформой.
