Переменная среды Kubernetes SERVICE_PORT отображается в зависимости от порядка

Я добавил второй TCP-порт в свою службу Kubernetes и заметил, что порт, который kubelet назначает {SVCNAME}_SERVICE_PORTпеременная среды, зависит от порядка.

Например, если я объявлю свои порты в своем сервисе следующим образом:

ports:
- name: example
  port: 9000
  protocol: TCP
- name: http
  port: 8080
  protocol: TCP

Тогда FOO_SERVICE_PORT будет присвоено значение 9000. Но если я переверну заказ...

ports:
- name: http
  port: 8080
  protocol: TCP
- name: example
  port: 9000
  protocol: TCP

... тогда FOO_SERVICE_PORT теперь 8080.

Есть ли способ заставить kubelet выбрать конкретный порт для установки в эту переменную, чтобы он не зависел от порядка, в котором я определил свои порты? То есть, есть ли конфигурация, которую я могу установить, чтобы она всегда использовала порт «http» (8080) в качестве значения, которое она присваивает этой переменной, независимо от того, где в списке объявлен этот конкретный порт?

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

Chin Huang 08.04.2022 23:55

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

Roddy of the Frozen Peas 09.04.2022 00:41

Я не рекомендую полагаться на переменные env, потому что когда их значение изменяется, оно не подхватывается контейнером до тех пор, пока модуль не перезапустится. В том же смысле, когда вы сначала создаете модуль, а затем службу, модуль вообще не знает о службах из переменных env, пока не перезапустится.

The Fool 09.04.2022 01:13

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

Roddy of the Frozen Peas 09.04.2022 09:28
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
4
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В старых версиях Kubernetes служба может определять только один порт. Когда они добавили поддержку нескольких портов, они решили поставить первый порт в обратной совместимой переменной окружения. Нет конфигурации, которая меняет это поведение.

Однако Kubernetes также устанавливает {serviceName}_SERVICE_PORT_{portName} переменные среды для именованных портов, поэтому вы можете получить номер порта по имени порта. Например:

FOO_SERVICE_PORT_EXAMPLE=9000
FOO_SERVICE_PORT_HTTP=8080

Другие вопросы по теме