Как выставить tcp-сервис в Kubernetes только для определенных ip-адресов?

Nignx ingress предоставляет способ раскрыть Служба tcp или udp: все, что вам нужно, - это общедоступный NLB.

Однако таким образом служба tcp будет открыта для всех: NLB не поддерживает группы безопасности или acl, а также nginx-ingress не имеет возможности фильтровать трафик при проксировании tcp или udp.

Единственное решение, которое приходит мне в голову, - это внутренний балансировщик нагрузки и отдельный экземпляр не-k8s с haproxy или iptables, где у меня фактически будут ограничения на основе исходного IP-адреса, а затем перенаправить / прокси-запросы на внутренний NLB.

Может есть другие способы решить это?


person Ilia Kondrashov    schedule 06.10.2020    source источник


Ответы (2)


  • Не используйте для этого nginx-ingress. Чтобы получить реальный IP-адрес внутри nginx-ingress, вы должны установить controller.service.externalTrafficPolicy: Local, что, в свою очередь, изменяет способ предоставления сервиса nginx-ingress, делая его локальным для узлов. См. https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip. Это, в свою очередь, приводит к тому, что ваш nginx-ingress LoadBalancer будет иметь нездоровые хосты, которые создадут шум в вашем мониторинге (в отличие от NodePort, где каждый узел предоставляет один и тот же порт и исправен). Если вы не запускаете nginx-ingress как DaemonSet или не используете другие хаки, например ограничить, какие узлы добавляются в качестве бэкэндов (планирование мыслей, масштабирование), или переместить nginx-ingress в отдельный набор узлов / подсети - ИМО, каждый из них является большой головной болью для такой простой проблемы. Подробнее об этой проблеме: https://elsesiy.com/blog/kubernetes-client-source-ip-dilemma

  • Используйте простой сервис type: LoadBalancer (классический ELB), который поддерживает:

    В этом случае ваш трафик идет как World -> ELB -> NodePort -> Service -> Pod, без Ingress.

person Max Lobur    schedule 06.10.2020

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

РЕДАКТИРОВАТЬ: Я говорил слишком рано. Повторное прочтение вашего вопроса и понимание вашего конкретного варианта использования привели меня к этой проблеме, в котором четко указано, что эти службы нельзя включить в белый список, и предлагается решить эту проблему на уровне брандмауэра.

person Yaron Idan    schedule 06.10.2020