Как использовать имена портов Kubernetes?

В развертывании кубернетов я указываю порт так:

 containers:
 - name: nginx
   image: nginx:latest
   ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

Теперь в службе я могу ссылаться на этот порт следующим образом (позволяет мне указывать только внешний порт в службе):

spec:
  type: ClusterIP
  ports:
  - name: nginx-port
    port: 80
    targetPort: nginx-port
    protocol: TCP

Теперь вопрос, могу ли я ссылаться на службу и порт в другом месте, используя следующий синтаксис nginx-service.default.svc.cluster.local:nginx-port? Вы знаете, что я могу ссылаться на службы, использующие эти особые имена, но я обнаружил, что жестко кодирую номер порта так nginx-service.default.svc.cluster.local:80.


person soosap    schedule 20.02.2018    source источник
comment
Хорошо, поэтому сразу после того, как я опубликовал это, я понял, что могу использовать переменные среды, которые вводятся в контейнеры, то есть $(NGINX_SERVICE_PORT). По-прежнему любопытно узнать, существует ли что-то вроде имен DNS, таких как nginx-service.default.svc.cluster.local, для портов.   -  person soosap    schedule 20.02.2018


Ответы (4)


kube-dns - это служба DNS, которая использует тот же протокол, что и все обычные DNS-серверы. В этом смысле DNS был разработан не для разрешения «имен портов», а для имен доменов (которые сопоставляются с IP-адресом).

Некоторые люди используют обратный прокси-сервер, который будет передавать трафик ProxyPass с одного порта на другой (при условии, что мы говорим о трафике HTTP / HTTPS) https://serverfault.com/questions/85078/how-to-forward-dns-alias-to-hostnameport или используйте правила iptables https://www.digitalocean.com/community/tutorials/how-to-forward-ports-through-a-linux-gateway-with-iptables. Однако они предполагают, что вы в первую очередь перенаправляете трафик на определенный порт (например, 80).

Как вы написали в комментарии, использование переменных среды будет вариантом, который подходит для вашего случая.

person Javier Salmeron    schedule 20.02.2018

Нет. Вы не можете использовать имя порта вместо номера порта. Поле имени в ServicePort имеет другое назначение.

Все порты в ServiceSpec должны иметь уникальные имена. Это имя отображается в поле «Имя» в объектах EndpointPort.

Для каждой службы создается один объект конечной точки. Каждый порт этой конечной точки соответствует служебному порту. Для этого соответствия используется поле имени как в ServicePort, так и в EndpointPort.

person Shahriar    schedule 20.02.2018
comment
это где-нибудь задокументировано? не могли бы вы дать ссылку? Благодарность :) - person maslick; 04.04.2019
comment
ServicePorts и EndpointPorts. Как они вписываются в общую схему вещей - понятия не имею. - person Watercycle; 25.07.2019

Обычно вы ссылаетесь на целевой порт по его номеру. Но вы можете дать конкретное имя для каждого порта модуля и указать это имя в своей спецификации службы.

Это сделает ваш сервис более понятным. Вот небольшой пример:

apiVersion: v1
kind: Pod
metadata:
  name: named-port-pod
  labels:
    app: named-port-pod
spec:
  containers:
    - name: echoserver
      image: gcr.io/google_containers/echoserver:1.4
      ports:
      - name: pod-custom-port
        containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: named-port-svc
spec:
  ports:
    - port: 80
      targetPort: pod-custom-port
  selector:
    app: named-port-pod
person Maxim Suslov    schedule 12.12.2020

Служба Kubernetes DNS предоставляет записи SRV для все названные порты сервисов в формате ниже

_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example

В вашем случае вы сможете получить к нему доступ, запросив ниже домен

_nginx-port._tcp.nginx-service.default.svc.cluster.local

Пример

nslookup -type=SRV _nginx-port._tcp.nginx-service.default.svc.cluster.local

И результат:

_nginx-port._tcp.nginx-service.default.svc.cluster.local   service = 0 100 80 nginx-service.default.svc.cluster.local.

В приведенных выше выходных данных nginx-service.default.svc.cluster.local - целевой домен, а 80 - целевой порт, к которому вы должны подключиться, т.е. nginx-service.default.svc.cluster.local:80

person Mr.Dinh    schedule 22.04.2021