在不使用 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_HOST
到 search
并依赖 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-namespace
是 foo
服务的命名空间。
您的服务地址可以从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
找到它的 host
和 port
值] 和 SEARCH_SERVICE_PORT
环境变量:
echo $SEARCH_SERVICE_HOST
echo $SEARCH_SERVICE_PORT
根据 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_HOST
到 search
并依赖 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-namespace
是 foo
服务的命名空间。
您的服务地址可以从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
找到它的 host
和 port
值] 和 SEARCH_SERVICE_PORT
环境变量:
echo $SEARCH_SERVICE_HOST
echo $SEARCH_SERVICE_PORT