我在同一节点内有2个pod(服务器,客户端)和一个服务(TCP, ClusterIP和端口)。我希望使用服务提供的端口连接2个pod(现在我硬编码了它)。
服务器至少可以使用0.0.0.0
作为IP,但客户端似乎不能使用任何东西。我做错了什么?我曾尝试使用os.getenv('SERVER_ADDRESS')
和int(os.getenv('SERVER_PORT'))
之类的东西,但它们都返回None
。
import socket
def start_server():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("0.0.0.0", 6666))
s.listen(1)
c, a = s.accept()
filetodown = open("output_received.txt", "wb")
while True:
print("Receiving....")
data = c.recv(1024)
if not data:
print("Done Receiving.")
break
filetodown.write(data)
filetodown.flush()
print(type(filetodown))
filetodown.close()
s.close()
#...
客户:
import socket
def send_transaction_file():
file_to_send = open('output.txt', 'rb')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("0.0.0.0", 6666))
data = file_to_send.read(1024)
while data:
print("Sending...")
print(str(data))
s.send(data)
data = file_to_send.read(1024)
file_to_send.close()
print("Done")
s.shutdown(2)
s.close()
编辑:pod的定义:
import time
from kubernetes import config, client
from kubernetes.client import Configuration
from kubernetes.client.api import core_v1_api
from kubernetes.client.rest import ApiException
from kubernetes.stream import stream
def exec_commands(api_instance, podName, app_name, python_script):
name = podName
resp = None
try:
resp = api_instance.read_namespaced_pod(name=name,
namespace='default')
except ApiException as e:
if e.status != 404:
print("Unknown error: %s" % e)
exit(1)
if not resp:
print("Pod %s does not exist. Creating it..." % name)
pod_manifest = {
'apiVersion': 'v1',
'kind': 'Pod',
'metadata': {
'name': name,
'labels': {
'app': app_name}
},
'spec': {
'hostname': podName,
'subdomain': app_name,
'containers': [{
'image': 'python',
'name': name,
"args": [
"/bin/sh",
"-c",
"pip install kubernetes google-api-python-client google-cloud-container python-hosts && while true;do date;sleep 5; done"
#"python3 " + python_script
]
}]
}
}
resp = api_instance.create_namespaced_pod(body=pod_manifest,
namespace='default')
while True:
resp = api_instance.read_namespaced_pod(name=name,
namespace='default')
if resp.status.phase != 'Pending':
break
time.sleep(1)
print("Done.")
EDIT2:服务的定义:
def create_service(core_v1_api):
body = kube_setup.client.V1Service(
api_version="v1",
kind="Service",
metadata=kube_setup.client.V1ObjectMeta(
name="banking-svc"
),
spec=kube_setup.client.V1ServiceSpec(
selector={"app": "banking"},
type="ClusterIP",
ports=[kube_setup.client.V1ServicePort(
port=6666,
target_port=6666,
protocol="TCP"
)]
)
)
core_v1_api.create_namespaced_service(namespace="default", body =body)
这在您的本地工作很好,因为0.0.0.0正在指导您的环路地址,当您的服务器和客户端在同一台机器上工作时,这是可以的。
但是,如果您将客户机部署为不同的pod,则需要将服务器pod公开为服务,并配置客户机以使用该服务。最好的方法就是阅读ips.connect(0.0.0.0, 6666)
行环境变量的一部分。
之后,您需要将服务器地址作为环境变量发送到客户机pod中。int(os.getenv('SERVER_ADDRESS'))
返回None的原因是您需要通过pods的yaml文件发送SERVER_ADDRESS变量。