У меня есть установка 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
Hostnode 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-адресе hostnodes (192.168.4.57
) - я неправильно понял сеть? Если у меня есть, можно будет оценить объяснение :(
Примечание: это на физическом оборудовании без балансировщика нагрузки, предоставляемого облачным провайдером, поэтому, я думаю, NodePort - единственный вариант, который у меня есть?
Вам не нужно использовать 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
При желании вы можете испортить свои узлы балансировки нагрузки, чтобы обычные модули не работали с ними и замедляли работу nginx.
Служба NodePort является наиболее распространенным решением для небольшого / локального кластера без операционной системы, и один и тот же порт будет доступен на всех узлах, на которых выполняются ваши задания (то есть, вероятно, не на вашем главном, а на рабочих узлах), которые работают. kube-proxy
.
Есть некоторые contrib / неочевидный код который действует как LoadBalancer для небольших сетей, так что, если вы хотите использовать type: LoadBalancer как локально, так и в облаке, вы можете получить примерно эквивалентную механику, если это важно.
Контроллеры Ingress становятся значительно более полезными по сравнению с NodePorts, когда вы хотите смешивать и сопоставлять сервисы (в частности, HTTP-сервисы), предоставляемые из вашего кластера на порте 80 или 443, и созданы для поддержки более чем одной службы через одну конечную точку (и, возможно, одну порт - сопоставлен с отдельными путями URI и т.п.). Контроллеры Ingress не так сильно помогают, когда доступ, который вам нужен, не основан на HTTP (например, служба на основе сокетов, такая как Redis или MongoDB, или, может быть, что-то особенное, что вы делаете)
Если вы интегрируете это во внутренний ИТ-проект, многие коммерческие балансировщики нагрузки рекомендуют использовать конфигурации NodePort с их собственной технологией балансировки нагрузки и ссылаться на пул всех рабочих узлов в этой настройке. F5 имеет разумный пример этого в их документации.
Я ожидаю, что теперь смогу добраться до контейнера nginx на IP-адресе hostnodes (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