Вопрос или проблема
0
Я хочу создать высокодоступный шлюз по умолчанию с помощью Squid (перехват с SSL) и Redsocks. Squid выполняет балансировку нагрузки на основе доменов, перенаправляя определенные домены на Redsocks, а остальные на стандартный шлюз. Я использую microk8s в своей сети, развернутый на 3 узлах. Для распределения IP-адресов в сети я использую MetalLB. Проблема в том, что я не знаю, как перенаправить ВСЕ порты svc на поды. Это можно сделать только по одному порту за раз, как в этом примере:
ports: protocol: TCP port: 80 targetPort: 80
Я также могу использовать NodePort с iptables на каждом узле. Однако в этом случае мне нужен внешний балансировщик нагрузки, который в данный момент у меня нет.
Нет диапазонов. Я думаю, если я укажу около 65 000 портов, мой балансировщик нагрузки MetalLB станет крайне медленным. Как лучше всего справиться с этой ситуацией?
Ответ или решение
Вопрос, с которым вы столкнулись, касается создания высокодоступного шлюза по умолчанию с использованием Squid и Redsocks в окружении MicroK8s. Давайте подробно разберем вашу задачу и способы её решения.
1. Понимание архитектуры
Вы стремитесь создать решение для балансировки нагрузки, где Squid будет выполнять доменно-ориентированную маршрутизацию. Это значит, что Squid должен перенаправлять трафик для определённых доменов в Redsocks, а для остальных доменов – на стандартный шлюз. Данное решение требует грамотной обработки входящего и исходящего трафика через ворота Kubernetes, что может быть непростой задачей.
2. Использование MetalLB
Вы уже используете MetalLB для распределения IP-адресов. Это хороший выбор для Kubernetes в средах, где отсутствует встроенная поддержка внешних Load Balancer. Существует несколько подходов к тому, как настроить MetalLB для работы с вашими Squid и Redsocks сервисами.
3. Проблема с портами
Как вы заметили, Kubernetes не позволяет просто так прокидывать все порты одного сервиса в поды. Порты необходимо указывать явно, что может стать серьезной проблемой, учитывая, что количество портов может достигать 65,000. Столь массовое перечисление портов, безусловно, снизит производительность вашего MetalLB и усложнит обслуживание.
4. Рекомендации по настройке
4.1 NodePort
Вы упомянули возможность использования NodePort, что может быть одним из решений. Этот метод подразумевает открытие порта на каждом узле кластера Kubernetes и назначение порта для доступа к сервису из внешней сети. Общая схема выглядит следующим образом:
- Настройте сервис Squid как NodePort:
apiVersion: v1 kind: Service metadata: name: squid spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080 selector: app: squid
Таким образом, маршрут будет находиться у вас на дашборде NodePort, где вы сможете получать доступ к Squid через любой из узлов по порту 30080.
4.2 Ингресс-контроллер
Второй подход заключается в использовании ингресс-контроллера. Это даст вам больший контроль над спецификацией маршрутов. Вы сможете настроить маршрутизацию с учетом доменов. Пример настройки ингресс-контроллера NGINX выглядит следующим образом:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: squid-ingress
spec:
rules:
- host: your-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: squid
port:
number: 80
- host: redsocks-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: redsocks
port:
number: 80
5. Заключение
Таким образом, вы имеете два основных подхода: использование NodePort для непосредственного доступа и создание ингресс-контроллера для доменно-ориентированной маршрутизации. Оба метода позволят эффективно обрабатывать трафик в вашем окружении Kubernetes.
Рекомендуется протестировать оба подхода в вашем окружении и выбрать тот, который будет более подходящим по различных причинам, включая производительность и удобство обслуживания. Таким образом, вы сможете создать надежное и высокодоступное решение для вашей сети, полностью соответствующее вашим требованиям.