Kubernetes + Socket.io: Pod-клиент -> проблемы SSL службы LoadBalancer - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть развертывание node.js на основе socket.io в моем кластере Kubernetes с сервисом типа LoadBalancer через Digital Ocean. Служба использует завершение SSL с использованием сертификата, загруженного в DO.

Я написал модуль, который служит проверкой работоспособности, чтобы гарантировать, что клиенты все еще могут подключаться. Этот модуль node.js использует пакет socket.io-client и подключается через доменное имя publi c для службы. Когда я запускаю контейнер локально, он просто подключается, но когда я запускаю контейнер как модуль в том же кластере, что и служба, проверка работоспособности не может подключиться. Когда я выполняю оболочку в модуле или в любом другом модуле и пытаюсь wget my-socket.domain.com, я получаю ошибку рукопожатия SSL «неправильный номер версии».

Любая идея, почему работает клиентское соединение извне кластера, клиент подключение вне кластера к обычному серверу работает, но не работает подключение клиента от модуля в кластере к публичному c доменному имени службы?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Оказывается, проблема в том, как kube-proxy обрабатывает службы типа LoadBalancer и запрашивает их изнутри кластера. Оказывается, когда служба создается, она добавляет записи iptables, которые вызывают запросы внутри кластера, полностью пропускают балансировщик нагрузки, что становится проблемой, когда балансировщик нагрузки также обрабатывает завершение SSL. Существует обходной путь, который заключается в добавлении аннотации loadbalancer-hostname, которая заставляет все соединения использовать балансировщик нагрузки. AWS имеет тенденцию не иметь этой проблемы, потому что они автоматически применяют обходной путь к своим сервисным конфигурациям, а Digital Ocean - нет.

Вот еще несколько деталей:

https://github.com/digitalocean/digitalocean-cloud-controller-manager/blob/master/docs/controllers/services/annotations.md

0 голосов
/ 13 февраля 2020

Необходимо настроить Ingress Controller для маршрутизации трафика c от балансировщика нагрузки к Сервису.

Поток трафика c выглядит следующим образом:

INTERNET -> LoadBalancer -> [ Ingress Controller -> Service]

Если вы хотите использовать SSL:

Вы можете предоставить свой собственный сертификат SSL и создать Секрет для его хранения. Затем вы можете обратиться к секрету в спецификации Ingress, чтобы создать балансировщик нагрузки HTTP (S), который использует сертификат.

Вы можете развернуть входной контроллер, например nginx, используя следующую инструкцию: ingress-controller .

...