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

Kubernetes - доступ к Nodeport на всех узлах

Я запускаю установку Kubernetes с нуля и пытаюсь создать свое тестовое приложение nginx (просто созданное с помощью kubectl create deployment nginx --image=nginx) виден удаленно со всех узлов. Идея в том, что я могу затем использовать установку HAProxy на «голом железе» для правильной маршрутизации трафика.

Из всего, что я читал, эта конфигурация должна работать и разрешать доступ через порт между узлами. Кроме того, выполнение netstat, похоже, показывает, что nodeport прослушивает все узлы -

user@kube2:~$ netstat -an | grep :30196
tcp6       0      0 :::30196                :::*                    LISTEN

Мой файл service.yaml -

apiVersion: v1
kind: Service
metadata:
  name: test-svc
  namespace: default
spec:
  type: NodePort
  externalTrafficPolicy: Cluster
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  - port: 443
    targetPort: 443
    protocol: TCP
    name: https
  selector:
    app: nginx

Конфигурация сети моего узла -

kube1 - 192.168.1.130 (master)
kube2 - 192.168.1.131
kube3 - 192.168.1.132

Моя служба работает -

user@kube1:~$ kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE   SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP                      18m   <none>
test-svc     NodePort    10.103.126.143   <none>        80:30196/TCP,443:32580/TCP   14m   app=nginx

Однако, несмотря на все вышесказанное, моя служба доступна только на узле, на котором она запущена (kube3 / 192.168.1.132). Есть идеи, почему это так, или я просто понимаю Kubernetes?

Я бы посмотрел на балансировщики нагрузки и входящие данные, но что не имеет смысла, так это то, что если я перенаправляю весь трафик своему мастеру для распределения (kube1), что, если kube1 выйдет из строя? Конечно, мне нужен балансировщик нагрузки, чтобы настроить мой балансировщик нагрузки ?!

Надеюсь, кто-то может помочь!

Спасибо, Крис.

Если вы хотите предоставить службу внешнему кластеру, используйте тип службы LoadBalancer или ingree. Однако использование LoadBalancer имеет свои ограничения. Вы не можете настроить LoadBalancer для прерывания трафика HTTPS, виртуальных хостов или маршрутизации на основе пути. В Kubernetes 1.2 для этой цели введен отдельный ресурс под названием Ingress. Вот пример LoadBalancer.

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-app
  name: nginx-svc
  namespace: default
spec:
  type: LoadBalancer  # use LoadBalancer as type here
  ports:
    - port: 80
  selector:
    app: nginx-app

$ kubectl get services -l app=nginx-app -o wide
NAME        TYPE           CLUSTER-IP       EXTERNAL-IP                                                                  PORT(S)        AGE       SELECTOR
nginx-svc   LoadBalancer   <ip>   a54a62300696611e88ba00af02406931-1787163476.myserver.com   80:31196/TCP   9m        app=nginx-app

Опубликуйте этот тестовый URL

$curl a54a62300696611e88ba00af02406931-1787163476.myserver.com

Чтобы получить доступ к локальным POD кластера Kubernetes а NodePort нужно создать. В NodePort опубликует вашу услугу в каждый узел используя публичный IP-адрес и порт. Затем вы можете получить доступ к службе, используя любой из IP-адресов кластера и назначенный порт.

Определение NodePort в Kubernetes:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service-np
  labels:
    name: nginx-service-np
spec:
  type: NodePort
  ports:
    - port: 8082        # Cluster IP, i.e. http://10.103.75.9:8082
      targetPort: 8080  # Application port
      nodePort: 30000   # (EXTERNAL-IP VirtualBox IPs) i.e. http://192.168.50.11:30000/ http://192.168.50.12:30000/ http://192.168.50.13:30000/
      protocol: TCP
      name: http
  selector:
    app: nginx 

См. Полный пример с исходным кодом на Построение кластера Kubernetes с Vagrant и Ansible (без Minikube).

Контроллер входящего трафика nginx также можно заменить на Istio если вы хотите воспользоваться преимуществами архитектуры служебной сети для:

  • Трафик с балансировкой нагрузки, внешний или внутренний
  • Сбои в управлении, повторные попытки, маршрутизация
  • Применяйте ограничения и отслеживайте сетевой трафик между сервисами
  • Безопасное общение

Видеть Установка Istio в Kubernetes под VirtualBox (без Minikube).

Еще один вариант - открыть доступ к контроллеру Nginx Ingress через NodePort (хотя не рекомендуется для производственных кластеров). Тип NodePort по-прежнему дает вам возможности LoadBalancing, и на какой конкретный под (поддерживающий конечные точки службы) должен быть отправлен трафик, вы управляете с помощью 'service.spec.sessionAffinity' и Контейнерные зонды.

Если у вас будет более 1 реплики модуля nginx в спецификации развертывания (пример Вот), вы можете управлять назначением стручка узлу через функция сродства и анти-сродства стручка.