Кубернетес, фланелевые и экспозиционные услуги

У меня хорошо работает настройка 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

Другие вопросы по тегам