繁体   English   中英

如何在 Kubernetes 的 Pod 中分别连接 Python 服务器和 Python 客户端?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM