Go 如何在运行时使用应用程序主机和端口

Go 如何在运行时使用应用程序主机和端口,go,kubernetes,Go,Kubernetes,我在k8s中有两个不同的应用程序需要读取数据,例如AppAfromAppB,它们都部署在同一集群上 这里的技巧部分是,我需要两个应用程序都部署到任何集群,并且知道要连接的主机和端口,我不想使用硬编码值 e、 g 应用程序A从应用程序B读取数据 AppB是带有RESTAPI的web应用程序 因此appA需要像这样调用 appa知道服务路径:比如AppB的api/App/getconfig,但是它如何知道appB的主机和端口呢 我不能使用硬编码,如果我使用type:LoadBalacer这可以工作,

我在k8s中有两个不同的应用程序需要读取数据,例如
AppA
from
AppB
,它们都部署在同一集群上

这里的
技巧部分是,我需要两个应用程序都部署到任何集群,并且知道要连接的主机和端口,我不想使用硬编码值

e、 g

应用程序A从应用程序B读取数据

App
B
是带有RESTAPI的web应用程序 因此app
A
需要像这样调用

appa知道服务路径:比如App
B的
api/App/getconfig
,但是它如何知道appB的主机和端口呢


我不能使用硬编码,如果我使用
type:LoadBalacer
这可以工作,但这是硬编码的主机和端口,我需要在运行时用serviceName确定它,etc?

为你的应用程序B定义一个服务。然后你可以通过以下url从其他POD访问它:你的服务名称:port/api/app/getconfig

为你的应用程序B定义一个服务。然后你可以通过以下url从其他POD访问它:你的服务名称:port/api/app/getconfig

如果你在同一台上有两个应用程序然后,他们可以通过kubernetes的内置DNS相互引用

如果AppA需要引用AppB,那么只要您为AppB定义了服务,就可以使用
引用它。在您的情况下,如果AppB在默认名称空间中运行,则可以调用
AppB.default/api/app/getconfig

端口部分可以由您的服务定义管理。下面我使用端口80,因此不必在请求中手动指定端口

apiVersion: v1
kind: Service
metadata:
  name: AppB
spec:
  ports:
  - name: "80"
    port: 80
    targetPort: 9090
  selector:
    select: AppB

更多信息:

如果同一集群上有两个应用程序,那么它们可以通过kubernetes的内置DNS相互引用

如果AppA需要引用AppB,那么只要您为AppB定义了服务,就可以使用
引用它。在您的情况下,如果AppB在默认名称空间中运行,则可以调用
AppB.default/api/app/getconfig

端口部分可以由您的服务定义管理。下面我使用端口80,因此不必在请求中手动指定端口

apiVersion: v1
kind: Service
metadata:
  name: AppB
spec:
  ports:
  - name: "80"
    port: 80
    targetPort: 9090
  selector:
    select: AppB

更多信息:

注意:Kube DNS命名约定为
service.namespace.svc.cluster domain.tld
,默认群集域为
cluster.local

因此,只要服务在同一集群中,您就可以将应用称为..svc。然后,您需要通过发出以下命令来检查应用正在侦听的端口:

kubectl -n <namespace> get svc
kubectl-n获取svc
注意服务标识符和问题:

kubectl -n <namespace> get svc <identifier> -o yaml
kubectl-n获取svc-o yaml

这将列出服务清单,您可以在其中查看应用程序正在侦听的端口

注意:Kube DNS命名约定是
service.namespace.svc.cluster domain.tld
,默认的群集域是
cluster.local

因此,只要服务在同一集群中,您就可以将应用称为..svc。然后,您需要通过发出以下命令来检查应用正在侦听的端口:

kubectl -n <namespace> get svc
kubectl-n获取svc
注意服务标识符和问题:

kubectl -n <namespace> get svc <identifier> -o yaml
kubectl-n获取svc-o yaml

这将列出服务清单,您可以在其中查看应用程序正在侦听的端口

如果你想让它如此宽容(从任何集群到任何集群),那么你需要一个DNS,在
应用程序B
前面有一个外部IP地址


我会考虑在某些地方进行硬编码。通过在一个
ConfigMap
中对其进行硬编码,您可以获得一些漂亮的实现。

如果您想让它如此宽容(从任何集群到任何集群),那么您需要一个DNS,在
应用程序B
前面有一个外部IP地址


我会考虑在某些地方进行硬编码。通过在一个
ConfigMap
中对其进行硬编码,您可以获得一些漂亮的实现。

为appB创建ClusterIP服务。 对端口进行硬编码,此端口仅用于该特定服务,在不同集群中不会有任何冲突。 执行
kubectl get svc
获取服务的ip,然后使用
nslookup
可以在结果中看到fqdn。 通常,fqdn是
.svc.cluster.local

参考:

为appB创建群集服务。 对端口进行硬编码,此端口仅用于该特定服务,在不同集群中不会有任何冲突。 执行
kubectl get svc
获取服务的ip,然后使用
nslookup
可以在结果中看到fqdn。 通常,fqdn是
.svc.cluster.local

Ref:

对不起,我没弄明白,它怎么知道应该访问哪个IP?@NinaS看一下选择器的概念@MartinPaucot-谢谢,我已经研究过了,但没有发现如何从restApi调用同一集群内的服务。。。如何定义服务等,如果你有这样的例子,很抱歉,格式错误。我已经编辑好了它应该是什么样子。IP应该不重要,因为它将在组成应用程序的各个吊舱之间实现负载平衡。对不起,我没有得到它,它如何知道应该访问哪个IP?@NinaS看看选择器的概念@MartinPaucot-谢谢,我已经研究过了,但没有发现如何从restApi调用同一集群内的服务。。。如何定义服务等,如果你有这样的例子,很抱歉,格式错误。我已经编辑好了它应该是什么样子。IP应该无关紧要,因为它将在构成应用程序的各个POD之间实现负载平衡。您可以根据其名称和命名空间调用服务,例如,如果我们在命名空间dev下有一个名为proxy的服务,则可以将主机称为:
host=proxy.dev.svc
@julian-好的,谢谢,我应该将其定义为type
NodePort
吗?t是什么