如何在 Python 中使用 Kubernetes 端口转发中的套接字

pet*_*tea 5 python sockets portforwarding kubernetes

提供端口转发对象

from kubernetes.stream import stream, portforward


    pf = portforward(
         k8s_client_v1.connect_get_namespaced_pod_portforward,
         pod_name,
         name_space,
         ports=port
    )
    
    pf.socket(port)
Run Code Online (Sandbox Code Playgroud)

pf是来自 family 的套接字对象AF_UNIX

我需要更好地了解是否AF_INET必须实例化另一个系列套接字才能实现与kubectl客户端相同的功能,例如:kubectl port-forward $pod_name $port

如果有人可以分享此类实现的任何片段,我预先表示感谢。

此时创建端口转发对象的灵感来自于这里

jns*_*jns 3

我不是套接字方面的专家,但我设法用http.client.HTTPConnection. 我想修补requests,但无法使其工作。

无论如何,这样可以更方便地以高级方式实现 http 请求。不确定你是否在寻找那个,但我是。要查询 pod 名称、端口等,您可以检查kubernetes 的api 参考,并在 python 包中查找相应的方法。

from http.client import HTTPConnection
from kubernetes import client, config
from kubernetes.stream import portforward
from kubernetes.stream.ws_client import PortForward

class ForwardedKubernetesHTTPConnection(HTTPConnection):

    def __init__(self, forwarding: PortForward, port: int):
        super().__init__("127.0.0.1", port)
        self.sock = forwarding.socket(port)

    def connect(self) -> None:
        pass

    def close(self) -> None:
        pass

if __name__ == "__main__":
    config.load_kube_config()
    client_v1 = client.CoreV1Api()
    name_space = "my-namespace"  # or get from api somehow
    pod_name = "my-pod"  # or get from api somehow
    port = 80
    
    pf = portforward(
        client_v1.connect_get_namespaced_pod_portforward,
        pod_name,
        name_space,
        ports=str(port)
    )

    conn = ForwardedKubernetesHTTPConnection(pf, port)
    conn.request("GET", "/my/url")  # will fail for other methods
    resp = conn.getresponse()
    print(resp.status)
    print(resp.headers)
    print(resp.read())

    conn.request("GET", "/my/other/url")
    # ...
Run Code Online (Sandbox Code Playgroud)