我在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等?
答案 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/