k8s web terminal的实现

使用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流中即可,还是很简单的

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值