Kubernetes:无论使用servicename的协议如何,如何允许在相同/不同名称空间中运行的两个Pod通信?

时间:2019-09-19 11:01:31

标签: kubernetes kubernetes-service kubernetes-networkpolicy

允许在相同/不同名称空间中运行的两个Pod(例如Pod A和B)进行通信,而与协议(例如http,https,akka.tcp)无关,并且应用了有效的网络策略。

尝试过的解决方案:

  1. 尝试将网络策略同时应用于两个Pod,并且还使用服务名称:“ my-svc.my-namespace.svc.cluster.local”来创建Pod B 与运行服务“ my-svc”的pod A通信,但两者 无法沟通。

  2. 还尝试在部署时将Pod A的IP地址和主机映射添加到Pod B中,然后Pod B能够与Pod A通信 但是反向通信失败。

请给我建议一种解决方法。

2 个答案:

答案 0 :(得分:1)

您可以将Pod放在Services后面,并使用Service DNS进行交流。调用service-name允许同一名称空间中的Pod进行通信。调用service-name.namespace允许不同名称空间中的Pod进行通信。

答案 1 :(得分:1)

默认情况下,pod可以通过其IP地址相互通信,而与它们所在的命名空间无关。

您可以通过以下方式查看每个吊舱的IP地址:

kubectl get pods -o wide --all-namespaces

但是,在群集内进行通信的常规方法是通过服务资源。

服务还具有IP地址和DNS名称。服务由一组Pod提供支持。该服务将请求转发给自己到一个支持容器。

服务的完全限定DNS名称为:

<service-name>.<service-namespace>.svc.cluster.local

这可以从群集中的任何位置(无论名称空间如何)解析为服务的IP地址。

例如,如果您拥有:

  • 命名空间ns-a:服务svc-a→一组Pod A
  • 命名空间ns-b:服务svc-b→Pod集B

然后,通过请求以下内容,集合A的广告连播可以到达集合B的广告连播:

svc-b.ns-b.svc.cluster.local