Обработка запроса на основе источника ip с traefik в k8s

У меня есть кластер k8s (три vms на моем собственном оборудовании, не aws, облако Google, ...), который использует traefik ( https://traefik.io/ ) в качестве обратного прокси для адресации служб/развертываний в фоновом режиме.

For this I use the deployment-variant from this part of the documentation: https://docs.traefik.io/user-guide/kubernetes/#deploy-trfik-using-a-deployment-or-daemonset

Теперь у меня есть несколько приложений, развернутых в кластере, все из которых имеют некоторые входящие ссылки, которые считываются с помощью traefik-ingress-controller . Некоторые из этих приложений являются внутренними, например kibana или traefik-web-ui , а некоторые другие являются внешними, как сами приложения. Я различаю эти два, имея разные записи dns (например, https://dashboard.internal.mycoolapp.com и https://app1.external.mycoolapp.com ) и внутренние DNS не разрешены из внешнего мира (= интернет), тогда как внешний (например, из Google dns).

Это для настройки. Теперь давайте рассмотрим проблему:

Пару дней назад я подумал: «Что произойдет, если я создам запись dns подстановочного знака для *. Internal.mycoolapp.com на машине, которая находится за пределами моей сети, и просто разрешаю ее тот же ip (s), что и внешняя запись dns. Et voila, мои внутренние услуги доступны снаружи!

Таким образом, это, конечно, состояние, которое неприемлемо. Поэтому я ищу решения по этому вопросу.

Первое, что приходило на ум, заключалось в том, чтобы заблокировать все входящие запросы о правилах для внутренних служб, если IP-адрес хоста запрашивающей стороны находится вне нашей сети:

...
kind: Ingress
metadata:
  name: app1
  namespace: default
  annotations:
    traefik.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8"
    ingress.kubernetes.io/whitelist-x-forwarded-for: "true"
...

Теоретически это должно работать. Но, как я узнал позже, до достижения traefik-ingress-controller , все запросы обрабатываются kube-proxy , а их адреса хоста переводятся на локальные адреса (< em> (S) NAT ), поэтому каждый запрос имеет внутренний адрес узла.

Так вот в этот момент я ищу решение.

Одним из решений, предположительно, является развертывание traefik-ingress-controller не как развертывание, а как набор демонов и привязка его к портам на хосте напрямую (как сказано здесь https://docs.traefik.io/user-guide/ kubernetes/# развернуть-trfik-помощь-а-развертывание или-daemonset ). Я попробовал это вчера, просто изменив конфигурацию traefik на набор демона и добавив к нему возможность NET_BIND_SERVICE , но на самом деле ничего там не изменилось. Так есть кто-нибудь, кто-то знает, что я мог сделать неправильно? Или у кого-то есть хороший способ// учебник/... о том, как передать фактический хост-запрос через входной контроллер?

Вот мой текущий файл конфигурации для traefik:

---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik:v1.6.4
        name: traefik-ingress-lb
        volumeMounts:
        - mountPath: /ssl/external
          name: ssl-external
        - mountPath: /ssl/internal
          name: ssl-internal
        - name: traefik-toml
          subPath: traefik.toml
          mountPath: /config/traefik.toml
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        - name: admin
          containerPort: 8080
        args:
        - --configfile=/config/traefik.toml
        - --api
        - --kubernetes
        - --logLevel=INFO
      volumes:
      - name: ssl-external
        secret:
          secretName: external.mycoolapp.com.cert
      - name: ssl-internal
        secret:
          secretName: internal.mycoolapp.com.cert
      - name: traefik-toml
        configMap:
          name: traefik-toml
---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - protocol: TCP
    port: 80
    name: web
  - protocol: TCP
    port: 443
    name: sweb
  externalIPs:
  - 10.2.3.1
  - 10.2.3.2
  - 10.2.3.3

XML-файл просто содержит перенаправление HTTP-https и пути к файлам сертификатов.

У меня есть некоторые другие решения, но все они имеют недостаток, что им требуется больше вещей , развернутых и поддерживаемых, как второй входной контроллер на другом порту, который обрабатывает только определенные объекты входа или новый точка входа для внешних запросов перед всем кластером, которая удаляет заголовки хостов из запросов, когда это не мой внешний адрес (это даже работает с ssl?).

Поэтому мне действительно нужна помощь. Заранее спасибо!

2
Docker — русскоговорящее сообщество
Docker — русскоговорящее сообщество
2 932 участник(ов)

Обсуждаем вопросы, посвященные Docker, Docker Swarm и всей экосистеме. Обмениваем идеями, новостями и решаем пробемы.

Kubernetes — русскоговорящее сообщество
Kubernetes — русскоговорящее сообщество
2 426 участник(ов)

Общаемся на темы, посвященные Kubernetes, конфигурации и возможностям. Новости, вопросы, идеи и т.д. См. также: @coreos_ru, @docker_ru, @devops_ru, @ceph_ru, @openstack_ru Вакансии и поиск работы: @devops_jobs Рекомендуем сразу отключить уведомления.

RU.Docker — Официальное Русское Сообщество
RU.Docker — Официальное Русское Сообщество
1 074 участник(ов)

#docker контейнеры и изоляция Официальное Русское Сообщество. Используйте теги, это удобно. Для поиска: #book - книги #link - ссылки Список интересных групп и каналов: https://github.com/goq/telegram-list

Брутальный Docker ( #`⌂´)/┌┛
Брутальный Docker ( #`⌂´)/┌┛
129 участник(ов)

Истинная суровость Чат для тех, кому есть что сказать про докер. Обязательно смотрим http://www.boycottdocker.org Можно: * материться * переходить на личности * обсирать докер * обсирать тех, кто не любит докер