使用beego+sockjs写的实例: https://github.com/du2016/web-terminal-in-go

web terminal可以让我们更方便的访问container,执行shell命令,提高工作效率

k8s本身实际上已经封装了docker的terminal api只需要很简单的操作就可以实现一个terminal,获取输入返回输出

 

req := restclient.Post().
		Resource("pods").
		Name(podname).
		Namespace(namespace).
		SubResource("exec").
		Param("container", container).
		Param("stdin", "true").
		Param("stdout", "true").
		Param("stderr", "true").
		Param("command", "/bin/sh").Param("tty", "true")

	req.VersionedParams(
		&api.PodExecOptions{
			Container: container,
			Command:   []string{"sh"},
			Stdin:     true,
			Stdout:    true,
			Stderr:    true,
			TTY:       true,
		},
		api.ParameterCodec,
	)
	executor, err := remotecommand.NewExecutor(
		config, http.MethodPost, req.URL(),
	)
	
	err = executor.Stream(remotecommand.StreamOptions{
		SupportedProtocols: remotecommandconsts.SupportedStreamingProtocols,
		Stdin:              r,
		Stdout:             w,
		Stderr:             os.Stderr,
		Tty:                true,
		TerminalSizeQueue:  t,
	})


1.首先我们需要获取一个restclient restclient的具体概念请参照我之前的文章

 

2.通过restclient提交信息指定我们想要执行命令的container,实际上就是一个HTTP request

3.设置request的参数。

4.NewExecutor函数将一个普通的request升级为流输出,使用了Google的spdy协议,在返回时使用了chunk头保证长连接

5.发起请求,进行交互

6.在实际使用为了和实际使用界面的大小相匹配,需要监听窗口大小变化,每当变化时由queue的next方法返回。

7.如果为了实现一个简单的命令将输入输出设置为系统的输入输出即可,如果需要实现web terminal,可以使用xterm.js 与ws,将输入输出写入到websocket流中即可,还是很简单的

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐