0

Kubernetes 为 dotnet 提供了一个库,它公开了我理解的整个 Kubernetes API,即kubectl可以做的所有事情。

我希望能够kubectl port-forward使用 Kubernetes dotnet 库来实现,他们在存储库中有一个如何做到这一点的示例。不幸的是,该示例只能处理单个并发连接。

k8s库公开了一个返回 a 的方法 ``,WebSocket显然可以通过包含的StreamDemuxer类将其分为输入和输出组件。所以用他们的例子......

            // Note this is single-threaded, it won't handle concurrent requests well...
            var webSocket = await client.WebSocketNamespacedPodPortForwardAsync(pod.Metadata.Name, "default", new int[] {80}, "v4.channel.k8s.io");
            var demux = new StreamDemuxer(webSocket, StreamType.PortForward);
            demux.Start();

            var stream = demux.GetStream((byte?)0, (byte?)0);

            IPAddress ipAddress = IPAddress.Loopback;
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 1212);  
            Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
            listener.Bind(localEndPoint);  
            listener.Listen(100);

            Socket handler = null;

            // Note this will only accept a single connection
            var accept = Task.Run(() => {
                while (true) {
                    handler = listener.Accept();
                    var bytes = new byte[4096];
                    while (true) {  
                        int bytesRec = handler.Receive(bytes);
                        stream.Write(bytes, 0, bytesRec);
                        if (bytesRec == 0 || Encoding.ASCII.GetString(bytes,0,bytesRec).IndexOf("<EOF>") > -1) {  
                            break;  
                        }
                    }
                }
            });

            var copy = Task.Run(() => {
                var buff = new byte[4096];
                while (true) {
                    var read = stream.Read(buff, 0, 4096);
                    handler.Send(buff, read, 0);
                }
            });

            await accept;
            await copy;
            if (handler != null) {
                handler.Close();
            }
            listener.Close();

现在,这对于一次连接一个连接非常有效。但我想让它处理多个连接。

我知道在一天结束时,我只有一个Stream可以读写,所以我认为我能做的最好的事情就是Stream与所有连接的客户分时共享,每个客户可以一次与Stream一个客户交互. 如果可能的话,我可以接受。

所以我的问题是……这可能吗?我可以让多个连接共享一个Stream而不引起各种连接问题吗?如果是这样,最简单的方法是什么?

4

0 回答 0