問題
在我們的專案中,我們希望兩個 Pod 作為服務器-客戶端作業,通過 Pythonsocket庫進行通信。兩個容器都是在本地構建的docker build,通過imagePullPolicy: IfNotPresentyaml 檔案在本地拉取并在 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
我懷疑當客戶端腳本部署在集群上時,來自客戶端腳本的傳出請求有問題,但我找不到問題所在。
代碼
服務器.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
uj5u.com熱心網友回復:
在默認設定中 - 不應該有任何東西阻止您在 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 可用。
uj5u.com熱心網友回復:
您決議服務器 IP 地址的方式可能有問題,但是服務器創建的“服務”應該可以通過 DNS 隱式訪問(例如作為服務器:1234),如here所述,所以也許您可以使用它反而?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382098.html
標籤:Python 码头工人 插座 Kubernetes
