Откройте порт другой службы в Kubernetes, не используя переменную env FOO_SERVICE_PORT

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

Например, если существует служба с именем foo, все контейнеры получат следующие переменные в своей исходной среде:

FOO_SERVICE_HOST=<the host the Service is running on>
FOO_SERVICE_PORT=<the port the Service is running on>

Тем не менее, кажется, что в моем кластере я не получаю ожидаемые значения в этих переменных:

tlycken@local: k exec -ti <my-pod> ash
/app # echo $SEARCH_HOST

/app # echo $SEARCH_PORT
tcp://10.0.110.126:80

Я бы предпочел увидеть что-то вроде

tlycken@local: k exec -ti <my-pod> ash
/app # echo $SEARCH_HOST
10.0.110.126
/app # echo $SEARCH_PORT
80

Я знаю, что документы также говорят

Если вы пишете код, который обращается к Сервису, не используйте эти переменные среды; вместо этого используйте DNS-имя Сервиса.

но это только дает мне имя хоста, а не порт службы. Поэтому я хотел установить SEARCH_HOST в search в моем шаблоне развертывания и полагаться на SEARCH_PORT чтобы получить порт, но когда я соединяю URL службы из существующих переменных среды, он становится http://search:tcp://10.0.110.126:80 который, очевидно, не работает.

Если я не могу положиться на FOO_SERVICE_PORT переменная, чтобы дать мне номер порта, что я должен делать вместо этого?

2 ответа

Решение

Согласно части из kubernetes Документация размещена в вопросе:

Например, если существует служба с именем foo, все контейнеры получат следующие переменные в своей исходной среде:

FOO_SERVICE_HOST=<the host the Service is running on>
FOO_SERVICE_PORT=<the port the Service is running on>

Имя переменной <your_service_name>_SERVICE_PORT, так что если ваш сервер имеет имя SEARCHВы можете найти его host а также port значения с использованием SEARCH_SERVICE_HOST а также SEARCH_SERVICE_PORT переменные среды:

echo $SEARCH_SERVICE_HOST

echo $SEARCH_SERVICE_PORT

Если я не могу полагаться на переменную FOO_SERVICE_PORT, чтобы дать мне номер порта, что мне делать вместо этого?

Я думаю, что лучше всего использовать SRV записи для разрешения информации об услуге, потому что DNS кластера предоставляет эту функцию обнаружения службы.

Вот официальная документация об этом, но в двух словах запись выглядит так:

<my-port-name>.<my-port-protocol>.<my-svc>.<my-namespace>.svc.cluster.local

Итак, к вашим услугам это будет как:

foo-port.tcp.foo.my-namespace.svc.cluster.local, где my-namespace пространство имен foo оказание услуг.

Адрес вашего сервиса можно получить у foo.my-namespace.svc.cluster.local запись.

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