Служба Kubernetes не отображает правильный порт

Я хотел бы предоставить порт по умолчанию (1883) и порт WS (9001) сервера MQTT в кластере Azure Kubernetes.

Во всяком случае, вот развертывание, которое я сейчас написал:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mqtt-server
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: mqtt-server
  template: 
    metadata: 
      labels: 
        app: mqtt-server
        type: backend 
    spec: 
      containers: 
        - name: mqtt-server
          image: eclipse-mosquitto:1.5.4
          resources: 
            requests:
              cpu: 250m
              memory: 256Mi
          ports:
            - name: mqtt-dflt-port
              containerPort: 1883
            - name: mqtt-ws-port
              containerPort: 9001
---
apiVersion: v1
kind: Service
metadata:
  name: mqtt-server-service
spec:
  selector:
    app: mqtt-server
  type: LoadBalancer
  ports:
  - name: mqtt-dflt-port
    protocol: TCP
    port: 1883
    targetPort: 1883
  - name: mqtt-ws-port
    protocol: TCP
    port: 1884
    targetPort: 9001

И когда я его развертываю, все в порядке, но брокер MQTT недоступен, и мой сервис описан так:

mqtt-server-service   LoadBalancer   10.0.163.167   51.143.170.64   1883:32384/TCP,1884:31326/TCP   21m

Почему порт 1883/9001 не перенаправляется, как должно быть?


person NeitoFR    schedule 03.04.2019    source источник


Ответы (2)


Во-первых, убедитесь, что вы подключаетесь к IP-адресу кластера службы изнутри кластера, а не извне. Не утруждайте себя пингованием IP-адреса службы, чтобы выяснить, доступна ли служба (помните, что IP-адрес кластера службы является виртуальным IP-адресом, и его пингование никогда не сработает). Если вы определили проверку готовности, убедитесь, что она прошла успешно; иначе

pod не будет частью сервиса. Чтобы убедиться, что модуль является частью службы, проверьте соответствующий объект Endpoints с помощью kubectl get endpoints. Если вы пытаетесь получить доступ к сервису через его полное доменное имя или его часть (например, myservice.mynamespace.svc.cluster.local или myservice.mynamespace) и это не работает, проверьте, можете ли вы получить к нему доступ. используя свой IP-адрес кластера вместо полного доменного имени. Проверьте, подключаетесь ли вы к порту, предоставляемому службой, а не к целевому порту. Попробуйте подключиться к IP-адресу модуля напрямую, чтобы убедиться, что модуль принимает соединения на правильном порту. Если вы даже не можете получить доступ к своему приложению через IP-адрес модуля, убедитесь, что ваше приложение не привязано только к локальному хосту.

person yasin lachini    schedule 03.04.2019

Я не вижу ничего плохого, запрошенные вами порты перенаправляются. И сервис создал временные порты на узлах для потока трафика (он всегда так делает). Сервис получил конечные точки, все в порядке.

Просто чтобы дать больше контекста, он всегда делает это, потому что ему нужно направить трафик на какой-то порт, но он не может зависеть от этого точного порта, потому что он может быть занят, поэтому он использует случайный порт из диапазона 30 000 (по умолчанию).

https://kubernetes.io/docs/concepts/services-networking/service/#nodeport

Если вам необходимо указать известное и статическое назначение портов, вы можете добавить nodePort: some-number к определению портов в вашей службе. По умолчанию порты узлов назначаются в диапазоне 30000-32767.

person 4c74356b41    schedule 03.04.2019