我是kubernetes的新手,我正在设置一些测试环境以在minikube中进行一些实验。因此,我有两个运行python的Pod,通过一个服务连接(我确认已通过同一服务选择了它们)。
我想打开两者之间的套接字连接。容器ip等于服务中指定的IP。在Pod1上,我创建套接字并连接到localhost和属于该容器的端口。
我不确定是否应该实际连接到localhost或服务的名称。然后,在另一个Pod(Pod2)上,我连接到服务的名称(如果我理解正确,则该服务应公开IP名称与该服务名称相对应的IP)。
Pod2拒绝以上述配置连接到Pod1。
如果我让Pod1创建一个具有IP地址作为服务名的套接字,那么在创建套接字时会收到“无法分配请求的地址”的信息。
所以我认为我只是错误地选择了IP地址。
预先感谢
答案 0 :(得分:0)
如果Pod1和Pod2应该是彼此通信的不同应用程序,则应该为它们中的每一个创建不同的服务。创建服务后,您可以轻松地使用Kubernetes Service Discovery将服务的IP和端口获取到Pod中。
答案 1 :(得分:0)
服务以通用名称收集一组Pod(还提供DNS名称,以便从同一群集中的其他部署中轻松查找)。服务的预期用途不是在同一服务的Pod 内部之间创建连接,而是提供一个通用名称,该通用名称将调用方定向到返回的Pod的任何服务。想一想当有更多请求传入时需要扩展的Web服务器,但是您不想一直在任何地方更新IP信息。只需查找DNS,然后选择DNS查找解析为其中一个IP即可实现简单的随机负载平衡。
似乎您尝试通过网络在两个不同的Pod之间进行交谈。在这种情况下,您的Pod应该只是独立的,并且不需要服务即可解析为其各自的IP进行互连。
部署每个提供hostname
和subdomain
字段的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规范中进行;否则,请转至。在群集中查找端口名称时,请仔细阅读端口的可移植性和实际端口号的独立性。
一些注意事项:
image
和args
default
部分是您的命名空间;如果您不部署到默认命名空间,它将有所不同hostname
和subdomain
字段是可选的,并且有默认值(请参见源链接),但是比隐式更好的显式有关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 中运行的应用程序。