![](/img/trans.png)
[英]How to connect to Google Kubernetes engine with Kubernetes Python client
[英]How to connect a Python server and Python client each in their pod on Kubernetes?
我在同一个节点中有 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()
编辑:豆荚的定义:
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 公开为服务,并将客户端配置为使用该服务。 最好的方法是读取s.connect(0.0.0.0, 6666)
行的 ip 部分作为环境变量。
之后,您需要将服务器地址作为环境变量发送到客户端 pod。 int(os.getenv('SERVER_ADDRESS'))
返回 None 的原因是您需要通过 pods yaml 文件发送 SERVER_ADDRESS 变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.