【发布时间】:2022-01-18 20:21:26
【问题描述】:
问题
在我们的项目中,我们希望两个 pod 作为服务器-客户端,通过 Python socket 库进行通信。这两个容器都是使用docker build 在本地构建的,通过yaml 文件上的imagePullPolicy: IfNotPresent 在本地拉取并在k8s 集群的同一节点上运行(如果这很重要,我正在运行kubernetes vanilla)。
当我们沟通良好时
- 在命令行中运行两个 python 脚本
- 使用
docker build和docker 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
【问题讨论】:
-
您好@waldowe,提供的任何解决方案对您有帮助吗?
-
@kkopczak 不,但我确实在这里找到了适合我的解决方案:github.com/kubernetes/kubernetes/issues/…
标签: python docker sockets kubernetes