Выставить несколько сервисов через Ingress в кластере кубернетов - PullRequest
1 голос
/ 26 мая 2020

Я запускаю одноузловой кластер разработки Kubernetes с несколькими независимыми службами - Nginx прокси с портом 80 и elasticsearch с портами 9200. Есть ли способ открыть эти службы с входом, чтобы иметь точку входа с одним IP-адресом LoadBalancer? (xxxx: 80 и xxxx: 9200)

Я читал об ограничении входящего трафика, доступ к которому возможен только с портами 80 и 443. Но, может быть, существуют обходные пути?

Спасибо за любой совет

ОБНОВЛЕНИЕ

Я решаю свою проблему с созданием нескольких входов и использую один и тот же балансировщик нагрузки. Но столкнулся с проблемой с входящим потоком Nginx, что стоило мне много времени. Самый простой способ использовать мой подход - установить контроллер входящего трафика с помощью helm и параметризовать его с помощью открытых служб и портов

helm install ingress stable/nginx-ingress --set tcp.4445="default/nginx-proxy:4445" --set tcp.8888="default/demo:8888" --set tcp.19200="default/elasticsearch:19200"

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

Но если позже вы захотите открыть некоторые дополнительные службы и добавить все вручную (создать конфигурационную карту, обновить входящую службу, создать входящую, даже воссоздать nginx pod), i не могу подключиться к сервису: (

Так что любые изменения (для меня) приводят к переустановке всего контроллера

Ответы [ 3 ]

3 голосов
/ 26 мая 2020

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

** ограничение скорости, доступ к которому возможен только с портами 80 и 443?

Да, но вы можете его перезаписать, я не предлагаю, так как это много ручной работы каждый раз, когда вам нужно добавить / удалить порт

** Есть ли способ открыть эти службы с помощью входа

Существует гораздо лучшее решение ... почему бы вам не использовать собственное доменное имя, например, elasticsearch.Dehimb.host / grafana.Dehimb.host et c ...?

  1. Используйте nginx входной контроллер (можно использовать другой, но конфигурация ниже предназначена для nginx в качестве примера)

  2. Разверните его, используя справку как набор демонов вместо развертывания, и используйте изменения файла значений ниже https://github.com/helm/charts/blob/master/stable/nginx-ingress/values.yaml#L52

reportNodeInternalIp: true

useHostPort: true

Теперь настройте ваш DNS с помощью dnsmasq, может быть где-то небольшой узел или даже контейнер на вашем хосте, используя этот образ: https://github.com/jpillora/docker-dnsmasq

Здесь вы можете установить * .Dehimb.com на IP-адрес узла k8s. (получение узлов kubectl -owide)

Используйте свой ноутбук, чтобы использовать IP-адрес dns masq в качестве первого сервера имен над сервером имен интернет-провайдера по умолчанию

Теперь просто создайте входящий трафик с любым количеством доменов, и при просмотре со своего ноутбука:

-> сначала используется dnsmasq для разрешения IP-адресов узлов k8s,

-> порт 80 открыт на каждом узел из-за набора демона

-> Эти порты передают трафик c на nginx, который имеет входную конфигурацию

-> nginx знает, какую службу передать traffic c to

Это может показаться немного сложным, но это весело, когда все работает и его одноразовая настройка.

В качестве альтернативы вы можете использовать Metallb (но не так легко понять, перерывы)

2 голосов
/ 26 мая 2020

Вам просто нужно настроить правила входа, которые направляют трафик c на нужную службу.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx
spec:
  rules:
  - host: nginx.example.com
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort: 80

---

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: elasticsearch
spec:
  rules:
  - host: elasticsearch.example.com
    http:
      paths:
      - backend:
          serviceName: elasticsearch
          servicePort: 9200
2 голосов
/ 26 мая 2020

Вы можете создать столько входных ресурсов, сколько захотите, но все они будут использовать тот же LoadBalancer, который используется для доступа к входному контроллеру.

Вам нужны службы типа IP кластера kubernetes. В сервисах вы можете указать port как 80 и targetPort как 9200. После этого при входе вы можете произносить servicePort как 80.

В качестве альтернативы укажите port и targetPort как 9200 в службе типа clusterIP и укажите 9200 в servicePort входящего трафика.

Вы правы в том, что вход, такой как nginx, может принимать только трафик c на порте 80 и 443, но nginx является обратным прокси-сервером, что означает, что он завершит это клиентское соединение и создаст новое соединение с servicePort и этим servicePort не обязательно должно быть 80 или 443, т.е. может быть 9200.

...