конфигурация nodeport, но кубернеты по-прежнему предоставляют диапазон портов

Я объявил службу в режиме nodePort. но есть кое-что, чего я не понимаю. может я запуталась. nodePort, перенаправленный на порт службы и полученный модулем на targetPort.

apiVersion: v1
    kind: Service
    metadata:
      name: frontend
      labels:
        app: {{ .Release.Name }}
        product: {{ .Values.product }}
        environment: {{ .Values.environment }}
        version: {{ .Values.version }}
        component: frontend
    spec:
      type: NodePort
      ports:
      - port: 6001
        targetPort: 6001
        protocol: TCP
      selector:
        app: countly-frontend

когда я перечисляю услуги на кубернетах, я вижу следующее:

service/countly-frontend        NodePort       10.xx.xx.12    <none>        6001:31145/TCP    110s

обычно я должен видеть 6001: 6001, а не 6001: 31145? Как вы уже догадались, приложение прослушивает порт 6001.


person morla    schedule 08.04.2020    source источник


Ответы (3)


Не уверен, что это может сработать:

ports:
    - protocol: TCP
      port: 6001
      targetPort: 6001

Или, если бы вы могли попробовать изменить targetPort на nodePort в исходном

person user1394    schedule 08.04.2020

Позвольте мне прояснить некоторые заблуждения:


Вы не можете изменить диапазон портов nodePort для управляемого кластера Kubernetes, например GKE.


Несколько слов о nodePort из официальной документации Kubernetes:

NodePort: предоставляет услугу на каждом IP-адресе узла на статическом порте. (NodePort). ClusterIP Служба, к которой NodePort Служба маршрутизирует, создается автоматически. Вы сможете связаться со службой NodePort извне кластера, запросив <NodeIP>:<NodePort>.

- Kubernetes.io: службы

nodePort порт находится в диапазоне от 30000 до 32767.

Что вы здесь видите:

когда я перечисляю услуги на кубернетах, я вижу следующее:

service/countly-frontend        NodePort       10.xx.xx.12    ><none>        6001:31145/TCP    110s

В частности: 6001:31145/TCP правильно.

Пример:

Предположим, что есть модуль с приложением, работающим на порту 50001.

Это service.yaml из вышеуказанного приложения:

apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  selector:
    app: hello
  ports:
    - name: hello-port
      port: 5678 # CLUSTER-IP PORT
      targetPort: 50001 # PORT WHICH YOUR APPLICATION IS RUNNING ON
      nodePort: 30051 # NODEPORT PORT 
  type: NodePort

Вывод $ kubectl get services:

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP                                           PORT(S)           AGE
hello-service      NodePort       10.86.1.195   <none>                                                5678:30051/TCP   25h

У вас будет доступ к вашему приложению:

  • NodeIP:NodePort(30051) (внешний доступ)
  • ClusterIP:port(5678) (внутренний доступ)
  • PodIP:targetPort(50001) (внутренний доступ)

Если вы хотите предоставить свое приложение на порту 6001 для внешнего использования, вы можете попробовать тип службы LoadBalancer.

На StackOverflow есть ответы, которые углубляются в эту тему:

Ознакомьтесь с официальной документацией по раскрытию приложений в GKE кластере: Cloud.google.com: движок Kubernetes: демонстрация приложений

Пожалуйста, дайте мне знать, если у вас возникнут вопросы.

person Dawid Kruk    schedule 09.04.2020

Так работает nodeport службы Kubernetes. Служба NodePort привязывается к случайному порту в диапазоне 30000-32767. Если вы хотите указать порт привязки, добавьте атрибут nodePort, чтобы установить его (docs), но он должен быть в требуемом диапазоне. Для примера я выбрал 30007:

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: {{ .Release.Name }}
    product: {{ .Values.product }}
    environment: {{ .Values.environment }}
    version: {{ .Values.version }}
    component: frontend
spec:
  type: NodePort
  ports:
  - port: 6001
    targetPort: 6001
    protocol: TCP
    nodePort: 30007
  selector:
    app: countly-frontend
person freemanpolys    schedule 08.04.2020