Kubernetes Pod с hostNetwork True не может получить доступ к внешним IP-адресам сервисов в том же кластере

Проблема

У меня есть два модуля A и B, работающих в кластере на minikube, оба имеют внешние IP-адреса www.service-a.com и www.service-b.com. Оба внешних IP-адреса доступны извне.

Мне нужно A, чтобы иметь возможность вызывать B с его внешним IP-адресом, а не с его кластерным DNS, то есть A нужно использовать www.service-b.com, а не b.svc.cluster.local (который работает, но я не могу его использовать).

Я установил A на использование hostNetwork: true и dnsPolicy: ClusterFirstWithHostNet. Если я разверну док-контейнер NodeJS вручную, он действительно сможет подключиться и найти его. Однако A по-прежнему не может подключиться к service-b.com. Я неправильно использую hostNetwork? Как я могу настроить свой модуль для такого подключения к b?

Развертывание YAML

...
spec:
  replicas: 1
  selector:
    matchLabels:
      app: a-app
  template:
    metadata:
      labels:
        app: a-app
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
...

Сервис B YAML

...
spec:
  externalTrafficPolicy: Cluster
  type: LoadBalancer
  ports:
  - port: ...
    targetPort: ...
    protocol: TCP
    name: http
...

Фон:

Я использую Minio (локальное решение, подобное S3), и мне нужно назначить URL-адреса для получения и размещения объектов. Модули Minio работают в том же кластере, что и мой модуль аутентификации, который генерирует заранее заданные URL-адреса. Предписанные URL-адреса будут использоваться извне кластера. Следовательно, я не могу подписать URL-адрес с именами DNS кластера, такими как minio.svc.cluster.local, потому что этот URL-адрес не будет доступен извне кластера, и замена хоста на my-minio.com и сохранение подписи не работают, потому что я предполагаю, что minio подписывает весь хост и путь. Следовательно, мне нужно подключить модуль аутентификации к общедоступной my-minio.com Minio, что, похоже, не работает.


person Math is Hard    schedule 11.11.2020    source источник


Ответы (2)


Что касается hostNetwork, похоже, вы это неправильно поняли. Установка значения true означает, что Pod будет иметь доступ к хосту, на котором он работает. В случае minikube это виртуальная машина, а не ваш хост, на котором работают настоящие контейнеры.

Кроме того, я не уверен, как вы предоставляете свои услуги внешнему миру, но я предлагаю вам попробовать Ingress для этого.

person Grigoriy Mikhalkin    schedule 11.11.2020
comment
Я просто использовал LoadBalancer с включенным externalTrafficPolicy. При входящем входе сможет ли модуль подключиться к другому модулю через вход? Я новичок в Кубе. - person Math is Hard; 11.11.2020
comment
Хорошо, сейчас попробую. Будет обновлено здесь, когда я закончу - person Math is Hard; 11.11.2020
comment
Я развернул вход и контроллер nginx NAMESPACE NAME HOSTS ADDRESS PORTS AGE my-namespace my-minio localhost localhost 80 16m на своем локальном компьютере, при нажатии localhost теперь перенаправляется на модуль B, но A не может нажать localhost и перейти к модулю B. - person Math is Hard; 12.11.2020
comment
Метод замены заголовка Host на nginx.ingress.kubernetes.io/upstream-vhost кажется довольно многообещающим, но просто размещение этой аннотации в моем входящем сообщении, похоже, не работает из коробки. Может это потому, что я установил nginx через helm? - person Math is Hard; 12.11.2020
comment
@MathisHard Не могли бы вы задать еще один вопрос, описывая ваши проблемы с контроллером входящего / входящего трафика? Мне кажется, что это проблема для другого вопроса SO. - person acid_fuji; 12.11.2020
comment
@MathisHard Для minikube вы можете просто запустить kubectl get pods -n kube-system для установки контроллера входящего трафика. Вот руководство о том, как установить и использовать вход в minikube - person Grigoriy Mikhalkin; 12.11.2020
comment
@MathisHard Также вы можете обновить свой вопрос и добавить манифест для Ingress? - person Grigoriy Mikhalkin; 12.11.2020
comment
Я разместил еще один вопрос, связанный с решением этой конкретной проблемы: stackoverflow.com/questions/64815229/ - person Math is Hard; 13.11.2020
comment
На самом деле оказалось, что это работает, я не должен объявлять rewrite-target и ssl-redirect. Замена upstream-vhost работает должным образом. Теперь моя проблема решена :) - person Math is Hard; 13.11.2020

Как предложил Григорий, я использовал вход с аннотацией nginx.ingress.kubernetes.io/upstream-vhost, чтобы перенаправить все запросы в кластер с Host: service-b, чтобы решить мою проблему. Раньше у меня был nginx.ingress.kubernetes.io/rewrite-target: /$1, который удалял путь из запроса, который вызывал серьезные проблемы, поэтому я удалил его. Подробности того, как у меня это работает, находятся здесь:

Контроллер NGINX Kubernetes: необходимо изменить заголовок хоста во входящем < / а>

person Math is Hard    schedule 17.11.2020