在不使用 FOO_SERVICE_PORT 环境变量的情况下发现 Kubernetes 中其他服务的端口

Discover port of other service in Kubernetes, without using the FOO_SERVICE_PORT env variable

根据 Kubernetes 文档,each container gets a set of environment variables that lets it access other services

For example, if a Service named foo exists, all containers will get the following variables in their initial environment:

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

我知道文档也说

If you are writing code that talks to a Service, don’t use these environment variables; use the DNS name of the Service instead.

但这只给我主机名,而不是服务的端口。因此,我想在我的部署模板中设置 SEARCH_HOSTsearch 并依赖 SEARCH_PORT 来获取端口,但是当我从现有环境中将服务 url 放在一起时变量,它变成 http://search:tcp://10.0.110.126:80 这显然不起作用。

如果我不能依赖 FOO_SERVICE_PORT 变量给我端口号,我应该怎么做?

If I can't rely on the FOO_SERVICE_PORT variable to give me the port number, what should I do instead?

我认为最好的方法是使用 SRV 记录来解析有关服务的信息,因为集群的 DNS 正在提供该服务发现功能。

这是一个官方的 documentation 关于它,但简而言之,记录看起来是这样的:

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

因此,对于您的服务,它将是这样的:

foo-port.tcp.foo.my-namespace.svc.cluster.local,其中 my-namespacefoo 服务的命名空间。

您的服务地址可以从foo.my-namespace.svc.cluster.local记录中获取。

根据问题中 kubernetes 文档的一部分:

For example, if a Service named foo exists, all containers will get the following variables in their initial environment:

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,您可以使用 SEARCH_SERVICE_HOST 找到它的 hostport 值] 和 SEARCH_SERVICE_PORT 环境变量:

echo $SEARCH_SERVICE_HOST

echo $SEARCH_SERVICE_PORT