k8s系列 – client-go详细用法

网上基本没有k8s client-go的使用资料,我实现了6个demo,项目地址:https://github.com/owenliang/k8s-client-go

一共6个demo:

  • demo1: 连接k8s
  • demo2: 解析yaml为json, 反序列化到deployment对象, 修改deployment.spec.replicas, 提交到k8s生效
  • demo3: 更新deployment.Spec.Template.Spec.Containers, 升级镜像版本, 提交到k8s生效
  • demo4: 更新deployment, 循环获取部署状态, 判定部署完成, 并获取最新pod列表与失败原因
  • demo5: xterm.js的基本用法, 为后续web ssh访问k8s container做铺垫
  • demo6: xterm.js+client-go remotecommand实现完美web ssh登录container

最后一个完美实现了web ssh登录container调试的效果。

demo6值得记录一下,免得时间久了容易忘记思路。

前端用xterm.js库,它只是模拟一个terminal在浏览器中,并没有通讯能力。

需要在前端建立websocket,连到自己开发的golang websocket服务端。

服务端会基于k8s的remotecommand包,建立与container的ssh长连接,所以服务端开发并不麻烦。

remotecommand包只需要我们提供3个回调,其中read是来获取terminal的输入,我们要做的就是读取websocket发来的数据,然后返回给read回调;write则是用来向terminal发送数据,我们要做的就是调用websocket把数据写到前端,然后前端把数据写给xterm即可;next是用来获取terminal的实际大小的,sshd服务端需要知道终端的大小,这样决定了它一行输出多少个字符就要输出一次换行符。所以,当浏览器窗口改变影响了terminal大小的时候,前端应该把最新的terminal大小发给服务端,然后在next回调中返回其大小。

xterm.js特别需要注意的就是需要apply一个addon,叫做fit。这个插件提供一个fit方法,调用它就可以让terminal的输出填满整个黑色视口,否则你可能会看到字符只输出了1/2的屏幕就换行了。

下面是真实的效果,和secureCrt等终端没什么区别,就是不带颜色而已。

具体大家看代码吧。

参考:

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~