Не удается получить доступ к сервису Express.js через сервис Kubernetes NodePort в кластере MicroK8s - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть простой сервер Express.js Dockerized, и когда я запускаю его, как:

docker run -p 3000:3000 mytag:my-build-id

http://localhost:3000/ отвечает просто отлично, а также если я использую IP-адрес локальной сети моей рабочей станции, как http://10.44.103.60:3000/

Теперь, если я разверну это на MicroK8 с декларацией развертывания службы, например:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: my-service
spec:
  type: NodePort
  ports:
  - name: "3000"
    port: 3000
    targetPort: 3000
status:
  loadBalancer: {}

и спецификацией модуля, как это (обновление 2019-11-05):

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  name: my-service
spec:
  replicas: 1
  selector:
    matchLabels:
      name: my-service
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        name: my-service
    spec:
      containers:
      - image: mytag:my-build-id
        name: my-service
        ports:
        - containerPort: 3000
        resources: {}
      restartPolicy: Always
status: {}

и получите незащищенный NodePort через kubectl get services равным 32750 и попробуйте посетить его на хост-компьютере MicroK8s следующим образом:

curl http://127.0.0.1:32750

тогда запрос просто зависнети если я пытаюсь посетить IP-адрес локальной сети хоста MicroK8s с моей рабочей станции по адресу http://192.168.191.248:32750/, то запрос немедленно отклоняется.

Но, если я пытаюсь перенести порт в модуль с

kubectl port-forward my-service-5db955f57f-q869q 3000:3000

затем http://localhost:3000/ работает просто отлично.

Таким образом, развертывание модуля, кажется, работает нормально, и примеры служб, таких как служба microbot-службы, прекрасно работают в этом кластере.

Я убедился, что сервер Express.js прослушивает все IP с

app.listen(port, '0.0.0.0', () =>  ...

Так в чем же проблема?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Вам необходимо добавить селектор к вашим услугам. Это скажет Kubernetes, как найти ваше развертывание. Кроме того, вы можете использовать nodePort, чтобы указать номер порта вашего сервиса. После этого вы сможете свернуть свой IP-адрес MicroK8.

Ваш сервис YAML должен выглядеть следующим образом:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: my-service
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30001
  selector: 
    name: my-service      
status:
  loadBalancer: {}
1 голос
/ 05 ноября 2019

IP-адрес локальной сети хоста MicroK8 с моей рабочей станции

Это главный источник вашего недопонимания;localhost, 127.0.0.1, и IP-адрес локальной сети вашей машины не имеет ничего общего с виртуальной машиной, работающей под управлением microk8s (что было бы бесконечно полезным, чтобы включить эту информацию в ваш вопрос, а не в нас. необходимо вывести его из одного скрытого предложения)

Я убедился, что сервер Express.js прослушивает все IP-адреса с

Основываясь на том, что вы сообщили позже:

на http://192.168.191.248:32750/, тогда запрос немедленно отклоняется.

, тогда получается, что ваш экспресс-сервер фактически не прослушивает все интерфейсы. Это объясняет, почему вы можете успешно перенести порт в Pod (что приводит к появлению трафика на локальном хосте Pod), но не достичь его «извне» Pod

Вы также можете проверить эту теорию, используя другой Pod внутрикластера на curl его IP-адрес на порте 3000 (чтобы обойти сервис и, следовательно, части NodePort)

Существует небольшая вероятность того, что вы неправильно настроили свои отношения Pod и Service, но поскольку вы не опубликовали свой PodSpec, а поведение, которое вы описываете, во многом напоминает явную неверную конфигурацию, мы будем продолжать это до тех пор, пока у нас не будет доказательств обратного

...