吊舱可以直接呼叫另一个吊舱吗?

时间:2019-10-09 07:15:11

标签: kubernetes pod

如果我有2个吊舱,有没有一种方法让他们彼此交谈,而无需创建和使用任何其他资源?

对于这两种情况,问题都存在-无论它们是在相同的名称空间还是在不同的名称空间。

2 个答案:

答案 0 :(得分:2)

是的,他们可以!

假设您没有任何限制通话的网络策略,只需知道其DNS名称即可,这是它的工作原理:

  • 群集必须启用DNS
  • 如果吊舱是在同一名称空间上手动创建的(而不是通过部署),则只需调用充当主机的吊舱名称。
    • 在命名空间NS1上运行的POD1暴露了容器端口31333
    • 在命名空间NS1上运行的POD2
    • POD2通过http://POD1:31333呼叫POD1
  • 如果吊舱位于不同的名称空间,则需要将名称空间包括在主机中。
    • 在命名空间NS1上运行的POD1暴露了容器端口31333
    • 在命名空间NS2上运行的POD2
    • POD2通过http://POD1.NS1:31333呼叫POD1
  • 如果吊舱是由部署创建的,则其名称是动态的,很难断言,在这种情况下,您需要一个服务来使用通用名称将吊舱向其他人公开(该服务)
    • 部署到名称空间NS1的DEPLOYMENT1将创建具有以下格式的Pod,即deploymentname-hash(例如:DEPLOYMENT1-f82hsh)
    • DEPLOYMENT1-f82hsh是由部署创建的Pod,并在命名空间NS1上运行,创建后暴露了容器端口31333
    • 在命名空间NS2上运行的POD2
    • POD2可以通过http://DEPLOYMENT1-f82hsh.NS1:31333调用DEPLOYMENT1-f82hsh,但是由于名称是动态的,因此随时可以更改为其他名称并破坏POD2
    • 解决方案是部署服务SVC1,该服务将请求转发到DEPLOYMENT1吊舱
    • POD2然后呼叫http://SVC1:31333,它将把呼叫转发到DEPLOYMENT1-f82hsh或DEPLOYMENT1中可用的任何吊舱。

上述情况假设您没有在Pod中既未设置主机名又未设置子域,并且正在使用默认配置。

在更高级的方案中,您还将使用群集dns后缀来调用这些服务。以下文档详细介绍了所有内容 https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

答案 1 :(得分:1)

对于您的问题,我会回答……与ShreePrakash给您提供的服务类似,有多个问题要讲,同样的问题也可以应用于吊舱。

以下是有关的另一个问题:2 Kubernetes pod communicating without knowing the exposed address

这回答了您的问题,因为您应该可以对PODNAME.PODNAMESPACE:PORT进行同样的操作,并且应该可以使用。

现在为什么不做呢?仅仅是因为pod在创建时在名称中添加了一个随机ID(类似:nginx-ingress-1234456),如果崩溃并重新创建,其名称就不会相同。这适用于无状态应用程序,您可以仅使用一个Pod来推断处于有状态状态的Pod的名称...

这就是为什么使用服务使Pod定位更容易的原因,因为它们的名称就是您在创建时声明的名称。

希望这会有所帮助。