绑定到Kubernetes中的python套接字的IP是什么?

时间:2019-05-03 21:32:39

标签: python docker sockets kubernetes

我是kubernetes的新手,我正在设置一些测试环境以在minikube中进行一些实验。因此,我有两个运行python的Pod,通过一个服务连接(我确认已通过同一服务选择了它们)。

我想打开两者之间的套接字连接。容器ip等于服务中指定的IP。在Pod1上,我创建套接字并连接到localhost和属于该容器的端口。

我不确定是否应该实际连接到localhost或服务的名称。然后,在另一个Pod(Pod2)上,我连接到服务的名称(如果我理解正确,则该服务应公开IP名称与该服务名称相对应的IP)。

Pod2拒绝以上述配置连接到Pod1。

如果我让Pod1创建一个具有IP地址作为服务名的套接字,那么在创建套接字时会收到“无法分配请求的地址”的信息。

所以我认为我只是错误地选择了IP地址。

预先感谢

3 个答案:

答案 0 :(得分:0)

如果Pod1和Pod2应该是彼此通信的不同应用程序,则应该为它们中的每一个创建不同的服务。创建服务后,您可以轻松地使用Kubernetes Service Discovery将服务的IP和端口获取到Pod中。

答案 1 :(得分:0)

服务以通用名称收集一组Pod(还提供DNS名称,以便从同一群集中的其他部署中轻松查找)。服务的预期用途不是在同一服务的Pod 内部之间创建连接,而是提供一个通用名称,该通用名称将调用方定向到返回的Pod的任何服务。想一想当有更多请求传入时需要扩展的Web服务器,但是您不想一直在任何地方更新IP信息。只需查找DNS,然后选择DNS查找解析为其中一个IP即可实现简单的随机负载平衡。

似乎您尝试通过网络在两个不同的Pod之间进行交谈。在这种情况下,您的Pod应该只是独立的,并且不需要服务即可解析为其各自的IP进行互连。

部署每个提供hostnamesubdomain字段的Pod,以提供适当的集群内DNS条目,如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: alice
spec:
  hostname: alice
  subdomain: talk
  containers:
  - image: your-image:version
    args: ["alice"]
    name: main
---
apiVersion: v1
kind: Pod
metadata:
  name: bob
spec:
  hostname: bob
  subdomain: talk
  containers:
  - image: your-image:version
    args: ["bob"]
    name: main

现在,如果您想像第一个Pod一样使用命令行参数"alice"运行容器,则可以轻松连接到

bob.talks.default.svc.cluster.local

是第二个Pod的FQDN。反之亦然。如果要公开某些端口,请在Pod规范中进行;否则,请转至。在群集中查找端口名称时,请仔细阅读端口的可移植性和实际端口号的独立性。

一些注意事项:

  • 当然,您需要根据实际容器设置调整imageargs
  • FQDN中的default部分是您的命名空间;如果您不部署到默认命名空间,它将有所不同
  • hostnamesubdomain字段是可选的,并且有默认值(请参见源链接),但是比隐式更好的显式

有关Pod的DNS的Kubernetes文档:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods

答案 2 :(得分:0)

在 Kubernetes 中,很难始终拥有给定 POD 的 IP 地址。一个很好的解决方案是让您的应用程序绑定到 0.0.0.0(这意味着您的应用程序将侦听所有本地接口,包括 Pod 主接口)。 然后,您可以使用 Kubernetes 服务公开在该 Pod 中运行的应用程序。