Назад | Перейти на главную страницу

Kubernetes, фланель и экспозиционные сервисы

У меня есть установка Kubernetes, которая работает нормально, но я не могу открывать службы извне. Я думаю, что моя сеть настроена неправильно:

У меня запущена служба 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