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

i5desfxk  于 2023-01-16  发布在  Kubernetes
关注(0)|答案(3)|浏览(133)

如果我有2个pod,是否有办法让它们在不创建和使用任何其他资源的情况下相互交谈?
这两种情况都有问题--它们是在同一个名称空间还是在不同的名称空间中。

gupuwyp2

gupuwyp21#

不,他们可以!
假设您没有任何网络策略限制调用,它只需要知道它的DNS名称,这是它的工作原理:

  • 群集必须启用DNS
  • 如果pod是在相同的名称空间上手动创建的(不是通过部署),您只需要调用作为主机的podname。
  • 运行在名称空间NS 1上的POD 1公开容器端口31333
  • 在命名空间NS 1上运行的POD 2
  • POD 2通过http://POD1:31333调用POD 1
  • 如果pod位于不同的名称空间上,则需要将名称空间包含到主机中。
  • 运行在名称空间NS 1上的POD 1公开容器端口31333
  • 在命名空间NS 2上运行的POD 2
  • POD 2通过http://POD1.NS1:31333呼叫POD 1
  • 如果pod是由部署创建的,则其名称是动态的,难以预测,在这种情况下,您需要一个服务,通过使用通用名称(服务)将pod公开给其他人
  • 部署到命名空间NS 1的DEPLOYMENT 1将创建一个格式为deploymentname-hash的pod(例如:展开1-f82 hsh)
  • DEPLOYMENT 1-f82 hsh是部署创建的pod,在命名空间NS 1上运行,创建时公开容器端口31333
  • 在命名空间NS 2上运行的POD 2
  • POD 2可以通过http://DEPLOYMENT1-f82hsh.NS1:31333调用DEPLOYMENT 1-f82 hsh,但由于名称是动态的,因此它随时可能更改为其他名称并中断POD 2
  • 解决方案是部署服务SVC 1,它将请求转发到部署1 pod
  • POD 2然后调用http://SVC1:31333http://SVC1:31333将该调用转发到部署1-f82 hsh或部署1中可用的任何pod。

上述场景假设您尚未设置主机名和Pod中的子域,并且正在使用默认配置。
在更高级的场景中,你也可以使用集群dns后缀来调用这些服务。

ojsjcaue

ojsjcaue2#

我会回答是的你的问题...有多个问题说话的服务一样,一个shreeprakash给你,同样可以适用于一个吊舱。
这里是另一个问题的关系:2个Kubernetes pod在不知道暴露地址的情况下进行通信
这回答了您的问题,因为您应该能够对PODNAME.PODNAMESPACE:PORT执行相同的操作,并且它应该工作。
现在为什么不这样做呢?仅仅是因为pod在创建时有一个随机ID添加到它们的名称中(类似于:nginx-ingress-1234456),如果它崩溃了,get重新创建的名称将不一样。这适用于无状态应用程序,您可以在只有一个pod的有状态状态中推导出pod的名称...
这就是为什么要使用服务来使定位pod变得更容易,因为它们的名称是您在创建时声明的名称。
希望这个有用。

w6lpcovy

w6lpcovy3#

调用另一个pod的唯一方法是使用它的IP地址。根据K8s官方文档,只有一个pod DNS解析,它也包括IP地址,例如:
172-17-0-3.default.pod.cluster.local
因此,解决方案是使用Downward API让pod从环境变量中知道其IP:

env:
   - name: POD_IP
     valueFrom:
       fieldRef:
         fieldPath: status.podIP

然后在你的应用程序中(在Pod中运行),你需要以某种方式将这个IP地址传递给其他Pod。

相关问题