Я добавил второй 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) в качестве значения, которое она присваивает этой переменной, независимо от того, где в списке объявлен этот конкретный порт?
Это полезно знать (жаль, что это не задокументировано вне кода). Есть ли способ «принудительно» выбрать порт, или это тот случай, когда всегда выберет первый, и вам просто нужно обеспечить порядок, в котором ваши порты перечислены?
Я не рекомендую полагаться на переменные env, потому что когда их значение изменяется, оно не подхватывается контейнером до тех пор, пока модуль не перезапустится. В том же смысле, когда вы сначала создаете модуль, а затем службу, модуль вообще не знает о службах из переменных env, пока не перезапустится.
Да и я на них не полагаюсь. К сожалению, есть еще одна служба, которой я не владею и которая взаимодействует с моей через переменную окружения.
В старых версиях Kubernetes служба может определять только один порт. Когда они добавили поддержку нескольких портов, они решили поставить первый порт в обратной совместимой переменной окружения. Нет конфигурации, которая меняет это поведение.
Однако Kubernetes также устанавливает {serviceName}_SERVICE_PORT_{portName}
переменные среды для именованных портов, поэтому вы можете получить номер порта по имени порта. Например:
FOO_SERVICE_PORT_EXAMPLE=9000
FOO_SERVICE_PORT_HTTP=8080
В старых версиях Kubernetes служба может определять только один порт. Когда они добавили поддержку нескольких портов, по задумке они решили поставить первый порт в обратной совместимой переменной окружения.