how to exec a pod via WebSocket written in csharp

Viewed 103

I want use a websocket client to exec commands in a Kubernetes pod,Develop a web terminal using xterm.js, i wrote websocket for the backend via asp.net core 3.1,

         websocket                          websocket
xterm.js -----------------> websocketServer ----------------> k8s
          cmd:ls                               cmd:ls

here is my websocketServer code:(asp.net core 3.1)

[HttpGet("/ws"), AllowAnonymous]
public async Task Terminal()
{
   var config = KubernetesClientConfiguration.BuildConfigFromConfigFile(Environment.GetEnvironmentVariable("KUBECONFIG"));

   var client = new Kubernetes(config);
   var namespaces = client.ListNamespace();

   if (!HttpContext.WebSockets.IsWebSocketRequest)
   {
      HttpContext.Response.StatusCode = 400;
   }

   //web websocketServer
   using var websocketServer = await 
   HttpContext.WebSockets.AcceptWebSocketAsync();
   await Echo(websocketServer);

   //k8s websocket
   var k8sWebSocket = await client.WebSocketNamespacedPodExecAsync(pod.Metadata.Name, "winter", "ls",pod.Spec.Containers[0].Name).ConfigureAwait(false);


   //receive user input
   async Task Echo(WebSocket webSocket)
   {
     var buffer = new byte[1024 * 4];
     var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);


     while (!result.CloseStatus.HasValue)
     {
        var serverMsg = Encoding.UTF8.GetBytes($"{Encoding.UTF8.GetString(buffer)}");
        await webSocket.SendAsync(new ArraySegment<byte>(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
        //todo:
        //how to transfer user input to k8sWebsocket...
        //...


        result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        //todo:
        //how to transfer k8sWebsocket stdout to websocket...
        //...

      }
      await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
   }

when run the project, execute the command as blow:

let webSocket = new WebSocket('ws://localhost:29126/ws');

an error occured: WebSocket connection to 'ws://localhost:29126/ws' failed:
and the error detail is Unable to read data from the transport connection: Software in your host aborted an established connection. .

0 Answers
Related