紫色飞猪的研发之旅--07client-go实现进入pod模拟终端登录
时间:2021-09-07
本文章向大家介绍紫色飞猪的研发之旅--07client-go实现进入pod模拟终端登录,主要包括紫色飞猪的研发之旅--07client-go实现进入pod模拟终端登录使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实验目的:使用client-go进入任一pod执行命令,模拟终端.
比较简单 直接上代码
/*
模拟 ``ctl exec -it pods -n namespace -- /bin/sh `` 命令
# ctl get po -n a | grep client
elasticsearch-client-7bf748d697-bfd9p 1/1 Running 1 36d
*/
func ExecPodCom() {
config := config.KubeConfig()
clientSet,err := kubernetes.NewForConfig(config); if err != nil {
logrus.Println(err.Error())
}
// 初始化pod所在的corev1资源组,发送请求
// PodExecOptions struct 包括Container stdout stdout Command 等结构
// scheme.ParameterCodec 应该是pod 的GVK (GroupVersion & Kind)之类的
req := clientSet.CoreV1().RESTClient().Post().
Resource("pods").Name("elasticsearch-client-7bf748d697-bfd9p").
Namespace("a").
SubResource("exec").
VersionedParams(&coreV1.PodExecOptions{
Command: []string{"bash","-c","/bin/sh"},
Stdin: true,
Stdout: true,
Stderr: true,
TTY: true, // 打开linux终端
},scheme.ParameterCodec)
// remotecommand 主要实现了http 转 SPDY 添加X-Stream-Protocol-Version相关header 并发送请求
exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
// 检查是不是终端
if !terminal.IsTerminal(0) || !terminal.IsTerminal(1) {
fmt.Errorf("stdin/stdout should be terminal")
}
// 这个应该是处理Ctrl + C 这种特殊键位
oldState, err := terminal.MakeRaw(0); if err != nil {
fmt.Println(err.Error())
}
// 读取当前状态
fd := int(os.Stdin.Fd())
oldState, err = terminal.MakeRaw(fd); if err != nil {
fmt.Println(err.Error())
}
defer terminal.Restore(fd, oldState)
// 用IO读写替换 os stdout
screen := struct {
io.Reader
io.Writer
}{os.Stdin, os.Stdout}
// 建立链接之后从请求的sream中发送、读取数据
if err = exec.Stream(remotecommand.StreamOptions{
Stdin: screen,
Stdout: screen,
Stderr: screen,
Tty: true,
}); err != nil {
fmt.Print(err)
}
}
结果
zisefeizhu@zisefeizhudeMacBook-Pro ~/linkun/goproject/operator go run main.go
INFO[0000] init root.go...
/Users/zisefeizhu/linkun/goproject/operator/config/config.yaml
kubeConfig /Users/zisefeizhu/.kube/config
sh-4.2# ls
LICENSE.txt README.asciidoc config jdk logs plugins
NOTICE.txt bin data lib modules repository-s3-7.8.0.zip
sh-4.2# cd logs/
sh-4.2# ls
gc.log gc.log.00
过手如登山,一步一重天
原文地址:https://www.cnblogs.com/zisefeizhu/p/15238099.html
- 洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)
- 学习使用Jieba1.Jieba2. 特点3.功能4.安装5.使用6.其他中文分词工具
- 如何使用sklearn加载和下载机器学习数据集
- 洛谷P3224 [HNOI2012]永无乡
- 手把手教你使用sklearn快速入门机器学习
- 【 关关的刷题日记48】Leetcode 58. Length of Last Word
- RESTful API 设计指南
- 洛谷P1043 数字游戏
- 使用“空”对象替代引用是否为空判断
- 真是绝了!史上最详细的Jupyter Notebook入门教程
- 10.socket网络编程
- BZOJ1269: [AHOI2006]文本编辑器editor
- 开发人员为何需要企业服务总线?
- 搭建Visual Studio Code+Python开发环境1.对象简介2. 搭建步骤3.小结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Oracle数据误删恢复
- 用斗地主的实例学会使用java Collections工具类
- Command PhaseScriptExecution failed with a nonzero exit code问题解决
- Effective Java中构建器Builder的理解
- Java的位运算符详解实例。
- 用一个测试类简化排序算法时间复杂度的研究
- R语言之可视化(33)绘制差异基因分析统计图
- Java transient不被持久化的原因
- 举一个有趣的例子,让你轻松搞懂JVM内存管理
- gulp的使用
- SpringBoot中 使用[info]日志级别打印mybatis sql语句
- Spring Boot 使用策略模式指定Service实现类
- 55. Vue webpack的基本使用
- ajax无刷新页面切换,历史记录后退前进解决方案
- 一起来学演化计算-SBX模拟二进制交叉算子和DE差分进化算子