Как осуществляется шифрование данных между узлами кластера Kubernetes?

Всем привет! 

У меня возникла задача, которая, возможно, кажется не самой простой, но из-за недостатка опыта я изо всех сил пытаюсь её решить уже целый день. Вот в чем суть:

У нас имеется географически распределенный кластер k3s с почти 50 нодами. Некоторые сервисы взаимодействуют друг с другом через plain http, а множество самописных администрирующих сервисов открыто доступны наружу через NodePort, что, мягко говоря, не лучший вариант.

Мне нужно организовать следующее:

- На мастер-ноде развернуть Pod с VPN-сервером (я опишу, что уже пробовал и какие проблемы возникли).
- Перед запуском k3s-agent на воркер-нодах запускать VPN-клиент, которому будет передан IP адрес мастера внутри VPN.
- Соответственно, на мастер-ноде будет открыт только порт VPN-сервера для внешней сети, а доступ к сервисам внутри виртуальной сети будет возможен (естественно, с помощью iptables я все ограничу).
- Я хотел бы избежать зависимости от коммерческих решений (в противном случае я бы давно воспользовался zerotier).

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

- Zerotier: я дошёл до конфигурации сервера moon (условный self-hosted сервер в их понимании), но столкнулся с проблемами, описанными в GitHub issue, которые говорят о том, что поддержка и работа Moon маловероятны. В итоге я так и не смог достичь результата с Moon, только с Leaf, при этом все конфигурации казались корректными. В целом, ожидать полноценного self-hosted решения от него, видимо, бесполезно.
- Headscale + Tailscale: эта комбинация оказалась очень капризной в настройке, и клиент не реагирует, похоже, даже не дает таймаутов на неуспешное подключение.
- Nebula: это решение звучит многообещающе, и мне удалось его хоть как-то настроить, но документация оставляет желать лучшего — всего лишь один конфигурационный файл.

Поделитесь, пожалуйста, своим мнением или опытом по этой теме!
  • 30 января 2025 г. 20:24
Ответы на вопрос 2
Привет!

Задача, которую ты ставишь, действительно интересная и имеет много аспектов, связанных с безопасностью и надежностью. Давай рассмотрим возможные подходы и решения для шифрования данных между узлами кластера Kubernetes, а также дополнительные варианты для организации VPN.

### Шифрование данных в Kubernetes

Прежде всего, стоит отметить, что в Kubernetes есть несколько подходов к шифрованию:

1. **Шифрование etcd**: etсd является центральным хранилищем конфигурации и состояния кластера. Следует включить шифрование данных в etcd для защиты конфиденциальной информации. Это можно сделать, задействовав конфигурацию шифрования в kube-apiserver.

2. **SSL/TLS для коммуникаций**: Используйте TLS для шифрования всех межконтейнерных и межузловых коммуникаций. Kubernetes по умолчанию использует TLS для безопасного доступа к API, но вам также нужно удостовериться, что сервисы внутри кластера используют HTTPS вместо HTTP.

3. **Service Mesh**: Если у вас сложная архитектура сервисов, стоит рассмотреть внедрение service mesh, например, Istio или Linkerd. Эти решения предоставляют встроенные механизмы для шифрования трафика между сервисами (мутуальное TLS).

### VPN-решения

Ваш подход с VPN для межузловой связи вполне приемлем, и давайте обсудим имеющиеся у вас варианты:

1. **OpenVPN**: Это классическое решение для создания VPN. Вы можете развернуть OpenVPN на мастер-ноде и настроить его для взаимодействия с воркер-нодами. Это будет довольно надежное, но может потребовать больше времени на настройку.

2. **WireGuard**: Это современное решение для создания VPN, которое легче в настройке и более производительно по сравнению с OpenVPN. WireGuard имеет поддержку в Linux и может быть контейнеризован, что делает его удобным для использования в кластере.

3. **Nebula**: Поскольку вы уже начали с Nebula, я бы рекомендовал продолжить с этим решением. Хотя документация может быть недостаточной, Nebula обеспечивает безопасное соединение между узлами и может быть настроен для работы в Kubernetes. Попробуйте искать видеоуроки или примеры в GitHub, это может помочь прояснить некоторые детали настройки.

4. **Tailscale**: Несмотря на сложности с настройкой, Tailscale на базе WireGuard может быть хорошим выбором для легкой настройки соединений между вашими узлами. Обратите внимание, что для использования self-hosted решения вам всё равно потребуется оставить доступ к Интернету для некоторых функций. 

### Рекомендации

1. **Проверка документации**: Найдите хорошие учебные пособия или примеры проектов на GitHub для настроек того, что вам нужно. Комьюнити часто делится полезной информацией и наработками.

2. **Тестирование в локальной среде**: Разверните все решения в локальной среде или на тестовом кластере перед внедрением в продакшен. Это поможет избежать ошибок и настроить системы так, как вам нужно.

3. **Аудит безопасности**: После внедрения обязательно проведите аудит безопасности. Это поможет выявить уязвимости и убедиться, что все данные передаются безопасно.

Удачи в вашей работе над кластером!
Может посмотреть в сторону istio  
притом mTLS - это будет только одной маленькой изюминкой помимо остальных

на хабре есть кучка иллюстрированного, например вот с множеством картинок
Похожие вопросы