Кубернетес, фланелевые и экспозиционные услуги
У меня хорошо работает настройка kubernetes, но я не могу предоставлять внешние сервисы. Я думаю, что моя сеть не настроена правильно:
адреса служб kubernetes:
--service-cluster-ip-range=172.16.0.1/16
Конфигурация фланелевой сети:
etcdctl get /test.lan/network/config {"Network":"172.17.0.0/16"}
настройка подсети докера:
--bip=10.0.0.1/24
IP хост-узла:
192.168.4.57
У меня запущен сервис nginx, и я попытался показать его так:
[root@kubemaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-px6uy 1/1 Running 0 4m
[root@kubemaster ~]# kubectl get services
NAME LABELS SELECTOR IP(S) PORT(S) AGE
kubernetes component=apiserver,provider=kubernetes <none> 172.16.0.1 443/TCP 31m
nginx run=nginx run=nginx 172.16.84.166 9000/TCP 3m
и тогда я выставил сервис так:
kubectl expose rc nginx --port=9000 --target-port=9000 --type=NodePort
NAME LABELS SELECTOR IP(S) PORT(S) AGE
nginx run=nginx run=nginx 9000/TCP 292y
Теперь я ожидаю, что смогу получить доступ к контейнеру nginx по IP-адресу хост-узлов (192.168.4.57
) - я неправильно понял сеть? Если у меня есть, может объяснение будет оценено:(
Примечание: это на физическом оборудовании без балансировщика нагрузки, предоставляемого облачным провайдером, поэтому NodePort - единственный вариант, который у меня есть, я думаю?
3 ответа
Вам не нужно использовать NodePort и не нужно использовать внешний балансировщик нагрузки. Просто выделите некоторые из ваших узлов кластера как узлы балансировки нагрузки. Вы помещаете их в другую группу узлов, присваиваете им некоторые метки: mynodelabel/ingress: nginx
и затем вы размещаете входной демон nginx в этой группе узлов.
Наиболее важные варианты:
spec:
restartPolicy: Always
dnsPolicy: ClusterFirst
hostNetwork: true
nodeSelector:
mynodelabel/ingress: nginx
а также
ports:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
При желании вы можете испортить ваши узлы loadbalancer, чтобы обычные модули не работали на них и замедлили работу nginx.
Служба NodePort является наиболее распространенным решением для небольшого / локального кластера с минимальным набором ресурсов, и один и тот же порт будет доступен на всех узлах, где выполняются ваши задания (т.е., вероятно, не ваш главный, а рабочие узлы), которые работают kube-proxy
,
Существует некоторый код вклада / неочевидный, который действует как LoadBalancer для небольших сетей, так что если вы хотите использовать тип: LoadBalancer как локально, так и в облаке, вы можете получить примерно эквивалентную механику, если это важно.
Входящие контроллеры становятся значительно более полезными по сравнению с NodePort s, когда вы хотите смешивать и сопоставлять сервисы (в частности, HTTP-сервисы), предоставляемые из вашего кластера через порт 80 или 443, и предназначены для конкретной поддержки более чем одной службы через одну конечную точку (и, возможно, одну порт - отображается на отдельные пути URI или тому подобное). Входящие контроллеры не очень помогают, когда требуемый доступ не основан на HTTP (например, служба на основе сокетов, такая как Redis или MongoDB, или, возможно, что-то нестандартное, что вы делаете)
Если вы интегрируете это во внутренний ИТ-проект, то многие коммерческие балансировщики нагрузки рекомендуют использовать конфигурации NodePort с собственной технологией балансировки нагрузки и ссылаться на пул всех рабочих узлов в этой настройке. У F5 есть разумный пример этого в их документации.
Теперь я ожидаю, что смогу получить доступ к контейнеру nginx по IP-адресу узлов (192.168.4.57) - неправильно ли я понял сеть? Если у меня есть, может объяснение будет оценено:(
Ожидайте чтения модуля на hostIP:NodePort, где вы можете найти порт узла службы с помощью:
kubectl get svc echoheaders --template '{{range .spec.ports}}{{.nodePort}}{{end}}'
Примечание: это на физическом оборудовании без балансировщика нагрузки, предоставляемого облачным провайдером, поэтому NodePort - единственный вариант, который у меня есть, я думаю?
Вы можете развернуть входной контроллер, например: https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx или https://github.com/kubernetes/contrib/tree/master/service-loadbalancer