簡體   English   中英

Pod 到 pod 通信不適用於 k8s 中的 Python 套接字

[英]Pod-to-pod communication doens't work with Python socket in k8s

問題

在我們的項目中,我們希望兩個 pod 作為服務器-客戶端,通過 Python socket庫進行通信。 兩個容器都是使用docker build本地構建的,通過imagePullPolicy: IfNotPresent在 yaml 文件上本地拉取,並在 k8s 集群的同一節點上運行(我正在運行 ZB76E98,AF9AAA680979BFA5 重要的)

當我們溝通良好時

  • 在命令行中運行兩個 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

我懷疑客戶端腳本在集群上部署時發出的請求存在問題,但我找不到問題所在。

代碼

服務器.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()

...

服務器.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

客戶端.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

...

客戶端.yaml

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

默認設置中 - 不應該有任何東西阻止您在 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 可用。

您解析服務器的 IP 地址的方式可能有問題,但是服務器創建的“服務”應該可以通過 DNS 隱式訪問(例如服務器:1234),如此所述,所以也許您可以使用它反而?

萬一將來有人來到這里,我在這里找到了對我有用的答案: https://github.com/kubernetes/kubernetes/issues/86762#issuecomment-836338017

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM