Откройте порт другой службы в 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
запись.