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

时间:2019-12-09 14:20:35

标签: go kubernetes

我在k8s中有两个与众不同的应用,它们需要读取数据,例如AppA中的AppB,都部署在相同集群

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

例如

应用A从应用B中读取数据

应用B是带有Rest API的Web应用 因此应用A需要像http://10.26.131.136:9090/api/app/getconfig

那样调用

App A知道服务路径:就像App api/app/getconfig的{​​{1}}一样,但是它如何知道appB的主机和端口

我无法对其进行硬编码,如果我使用B则可以使用,但是这是硬编码的主机和端口,我需要某种方式在运行时确定它,也许使用serviceName等?

5 个答案:

答案 0 :(得分:3)

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

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

kubectl -n <namespace> get svc

记录服务标识符并发出:

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

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

答案 1 :(得分:1)

为应用程序B定义服务。然后,您可以使用以下URL从其他容器中访问它:您的服务名称端口 / api / app / getconfig

答案 2 :(得分:1)

如果您在同一集群上有2个应用,则它们可以通过kubernetes内置的DNS相互引用。

如果AppA需要引用AppB,则只要您为AppB定义了服务,就可以使用<service>.<namespace>进行引用。就您而言,如果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

更多信息:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

答案 3 :(得分:1)

如果要使其容忍(从任何群集到任何群集),则需要一个DNS,其外部IP地址位于App B前面。

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

答案 4 :(得分:1)

为appB创建ClusterIP服务。 对端口进行硬编码,此端口仅用于该特定服务,并且在不同群集中不会有任何冲突。 执行kubectl get svc <your service>来获取服务的IP,然后使用nslookup <ip>您可以在结果中看到一个fqdn。 通常,fqdn为<your-service>.<namespace>.svc.cluster.local 参考:https://kubernetes.io/docs/concepts/services-networking/service/