【问题标题】:Pod-to-pod communication doens't work with Python socket in k8sPod 到 pod 通信不适用于 k8s 中的 Python 套接字
【发布时间】:2022-01-18 20:21:26
【问题描述】:

问题

在我们的项目中,我们希望两个 pod 作为服务器-客户端,通过 Python socket 库进行通信。这两个容器都是使用docker build 在本地构建的,通过yaml 文件上的imagePullPolicy: IfNotPresent 在本地拉取并在k8s 集群的同一节点上运行(如果这很重要,我正在运行kubernetes vanilla)。

当我们沟通良好时

  • 在命令行中运行两个 python 脚本
  • 使用docker builddocker run 将两个脚本作为容器运行
  • 服务器应用容器部署在 K8s 集群中,客户端应用在命令行上或作为 docker 容器运行。

服务端和客户端都部署在K8s中时通信失败。 kubectl logs client -f 返回:

Traceback (most recent call last):
  File "client.py", line 7, in <module>
    client_socket.connect((IP_Server,PORT_Server))
TimeoutError: [Errno 110] Connection timed out

我怀疑客户端脚本在集群上部署时发出的请求有问题,但我找不到问题所在。

代码

server.py

import socket

IP = "0.0.0.0"
PORT = 1234

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((IP, PORT))
server_socket.listen()

...

server.yaml

apiVersion: v1
kind: Service
metadata:
  name: server
  labels:
    app: server
spec:
  ports:
    - port: 1234
      targetPort: 1234
      protocol: TCP
  selector:
    app: server
---
apiVersion: v1
kind: Pod
metadata:
  name: server
  labels:
    app: server
spec:
  containers:
  - name: server
    image: server:latest
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 1234

client.py

import socket

IP_Server = # the IP of the server service, obtained from "kubectl get svc" 
PORT_Server = 1234

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((IP_Server,PORT_Server)) # fails here

...

client.yaml

apiVersion: v1
kind: Pod
metadata:
  name: client
  labels:
    app: client
spec:
  containers:
  - name: client
    image: client:latest
    imagePullPolicy: IfNotPresent

【问题讨论】:

标签: python docker sockets kubernetes


【解决方案1】:

万一将来有人来这里,我通过执行找到了一个对我有用的解决方案

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F

然后删除所有 coredns pod。

参考:https://github.com/kubernetes/kubernetes/issues/86762#issuecomment-836338017

【讨论】:

    【解决方案2】:

    默认 设置中 - 不应该有任何东西阻止您在 2 个 pod 之间进行连接。但是,您不应该依赖 IP 地址在集群内部进行通信。尝试使用服务名称:

    $ kubectl get svc
    NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   10m
    server       ClusterIP   10.98.48.92   <none>        80/TCP    9m39s
    

    server 通常应该对在同一命名空间内运行的所有 pod 可用。

    【讨论】:

      【解决方案3】:

      您解析服务器 IP 地址的方式可能有问题,但服务器创建的“服务”应该可以通过 DNS 隐式访问(例如 server:1234),正如 here 所解释的那样,所以也许你可以改用它?

      【讨论】:

      • 即使使用 DNS,一切都保持不变。不过还是感谢您的提示,这比手动获取服务 IP 更容易;
      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2022-01-08
      相关资源
      最近更新 更多