Как получить доступ к модулю Kubernetes в локальном кластере?

Я установил экспериментальный локальный кластер Kubernetes с одним главным и тремя подчиненными узлами. Я создал развертывание для настраиваемой службы, которая прослушивает порт 10001. Цель состоит в том, чтобы получить доступ к примерной конечной точке /hello со стабильным IP-адресом / именем хоста, например http://<master>:10001/hello.

После развертывания развертывания модули создаются нормально и доступны через их IP-адреса кластера.

Я понимаю, что решение для облачных провайдеров - создать службу балансировки нагрузки для развертывания, чтобы вы могли просто expose службу. Однако, по-видимому, это не поддерживается для локального кластера. Настройка Ingress для этой цели кажется излишней. Это не?

Похоже, что kube proxy - лучший способ. Однако, когда я запускаю kube proxy --port <port> на главном узле, я могу получить доступ к http://<master>:<port>/api/..., но не к собственному модулю.

Есть много связанных вопросов (например, Как получить доступ к службам через IP-адрес кластера kubernetes?), но нет (принятых) ответов. документация Kubernetes на topic также довольно скуден, поэтому я даже не уверен в правильности концептуального подхода.

Поэтому я ищу простое решение и / или хорошее руководство. Кажется, это очень типичный вариант использования, которому не хватает четкого пути.


person Carsten    schedule 12.06.2017    source источник


Ответы (2)


Ingress, вероятно, ваша самая простая ставка.

Вы можете довольно просто запланировать создание Nginx IngressController; вот руководство для что. Обратите внимание, что в этой настройке используется DaemonSet, поэтому на каждом узле есть IngressController. Он также использует параметр конфигурации hostPort, поэтому IngressController будет прослушивать IP-адрес узла, а не IP-адрес виртуальной службы, который не будет стабильным.

Теперь вам просто нужно направить HTTP-трафик на любой из ваших узлов. Вероятно, вы захотите определить внешнюю запись DNS для каждой службы, каждая из которых будет указывать на IP-адреса ваших узлов (то есть несколько записей A / AAAA). Вход будет устранять неоднозначность и маршрутизироваться внутри кластера на основе имени хоста HTTP с использованием виртуальный хостинг на основе имени.

Если вам нужно предоставить не-HTTP-сервисы, это будет немного сложнее, но вы можете посмотреть дополнительные примеры в документации nginx ingress (например, UDP).

person Symmetric    schedule 12.06.2017

Если Ingress Controller не подходит для вашего сценария, вы можете попробовать использовать службу типа NodePort. Вы можете указать порт или позволить системе автоматически назначить его для вас.

Служба NodePort предоставляет вашу службу через один и тот же порт на всех узлах в вашем кластере. Если у вас есть сетевой доступ к вашим узлам, вы можете получить доступ к своей службе по IP-адресу узла и порту, указанным в конфигурации.

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

person Kekoa    schedule 13.06.2017
comment
У меня уже есть внешний HAProxy для балансировки нагрузки, и это кажется самым плавным решением в моем сценарии. Однако узлы остаются заблокированными от внешних запросов даже после добавления правила iptables (хотя я могу получить к ним доступ через их внешний IP-адрес изнутри машины): iptables -A INPUT -p tcp --dport <port> -j ACCEPT Есть какие-нибудь подсказки по этому поводу? - person Carsten; 13.06.2017