【问题标题】:What IP to bind to python socket in Kubernetes?什么 IP 绑定到 Kubernetes 中的 python 套接字?
【发布时间】:2019-05-03 21:32:39
【问题描述】:

我是 kubernetes 的新手,我正在设置一些测试环境以在 minikube 中进行一些实验。所以我有两个运行 python 的 pod,通过一个服务连接(我验证它们是通过相同的服务选择的)。

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

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

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

如果我让 Pod1 创建一个使用 IP 地址作为服务名称的套接字,我会在创建套接字时得到“无法分配请求的地址”。

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

提前致谢

【问题讨论】:

    标签: python docker sockets kubernetes


    【解决方案1】:

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

    您似乎只是试图通过网络在两个不同的 Pod 之间进行对话。在这种情况下,您的 Pod 应该是独立的,您不需要 Service 来解析它们各自的 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】:

      如果 Pod1 和 Pod2 应该是相互通信的不同应用程序,那么您应该为它们中的每一个创建不同的服务。创建服务后,您可以轻松地使用 Kubernetes Service Discovery 在 pod 中获取服务的 IP 和端口。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2011-12-23
          • 2012-05-26
          • 1970-01-01
          • 2023-02-12
          • 1970-01-01
          • 2016-07-05
          • 1970-01-01
          • 2012-06-15
          • 2011-11-25
          相关资源
          最近更新 更多