文章目录

  • 1. 创建pod
  • 2. go执行进入单个pod执行命令
  • 3. go执行进入某个命名空间的多个pod执行命令

1. 创建pod

deploy-pod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: myapplabels:app: nginx
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80
$ kubectl apply -f deploy-pod.yaml$ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
myapp   2/2     2            2           3h45m$ kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
myapp-d46f5678b-m98p2   1/1     Running   0          3h45m
myapp-d46f5678b-x9b6g   1/1     Running   0          3h45m

2. go执行进入单个pod执行命令

go.mod

module clientgo 1.13require (github.com/evanphx/json-patch v4.9.0+incompatible // indirectgithub.com/fsnotify/fsnotify v1.4.9 // indirectgithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirectgithub.com/golang/protobuf v1.4.2 // indirectgithub.com/googleapis/gnostic v0.4.0 // indirectgithub.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirectgithub.com/imdario/mergo v0.3.11 // indirectgithub.com/json-iterator/go v1.1.10 // indirectgithub.com/pkg/errors v0.9.1 // indirectgolang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirectgolang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 // indirectgolang.org/x/text v0.3.3 // indirectgolang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirectgoogle.golang.org/protobuf v1.24.0 // indirectk8s.io/apimachinery v0.17.0k8s.io/client-go v0.17.0k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac // indirectk8s.io/klog/v2 v2.2.0 // indirectk8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirectsigs.k8s.io/structured-merge-diff/v4 v4.0.1 // indirect
)

execpod.go

package mainimport ("flag""fmt""io""os""path/filepath""golang.org/x/crypto/ssh/terminal"corev1 "k8s.io/api/core/v1""k8s.io/client-go/kubernetes""k8s.io/client-go/kubernetes/scheme""k8s.io/client-go/tools/clientcmd""k8s.io/client-go/tools/remotecommand""k8s.io/client-go/util/homedir"
)func main() {var kubeconfig *stringif home := homedir.HomeDir(); home != "" {kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")} else {kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")}flag.Parse()config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)if err != nil {panic(err)}clientset, err := kubernetes.NewForConfig(config)if err != nil {panic(err)}req := clientset.CoreV1().RESTClient().Post().Resource("pods").Name("myapp-d46f5678b-m98p2").Namespace("default").SubResource("exec").VersionedParams(&corev1.PodExecOptions{Command: []string{"echo", "hello world"},Stdin:   true,Stdout:  true,Stderr:  true,TTY:     false,}, scheme.ParameterCodec)exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())if !terminal.IsTerminal(0) || !terminal.IsTerminal(1) {fmt.Errorf("stdin/stdout should be terminal")}oldState, err := terminal.MakeRaw(0)if err != nil {fmt.Println(err)}defer terminal.Restore(0, oldState)screen := struct {io.Readerio.Writer}{os.Stdin, os.Stdout}if err = exec.Stream(remotecommand.StreamOptions{Stdin: screen,Stdout: screen,Stderr: screen,Tty:    false,}); err != nil {fmt.Print(err)}
}

执行测试:

$ go run execpod.go
hello world

3. go执行进入某个命名空间的多个pod执行命令

go.mod

module clientgo 1.13require (github.com/evanphx/json-patch v4.9.0+incompatible // indirectgithub.com/fsnotify/fsnotify v1.4.9 // indirectgithub.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirectgithub.com/golang/protobuf v1.4.2 // indirectgithub.com/googleapis/gnostic v0.4.0 // indirectgithub.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirectgithub.com/imdario/mergo v0.3.11 // indirectgithub.com/json-iterator/go v1.1.10 // indirectgithub.com/pkg/errors v0.9.1 // indirectgolang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirectgolang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 // indirectgolang.org/x/text v0.3.3 // indirectgolang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirectgoogle.golang.org/protobuf v1.24.0 // indirectk8s.io/apimachinery v0.17.0k8s.io/client-go v0.17.0k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac // indirectk8s.io/klog/v2 v2.2.0 // indirectk8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirectsigs.k8s.io/structured-merge-diff/v4 v4.0.1 // indirect
)
package main
import ("bufio""fmt""io""github.com/spf13/pflag"v1 "k8s.io/api/core/v1""k8s.io/client-go/kubernetes""k8s.io/client-go/kubernetes/scheme"restclient "k8s.io/client-go/rest""k8s.io/client-go/tools/clientcmd""k8s.io/client-go/tools/remotecommand"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)type App struct {Config    *restclient.ConfigNamespace stringPodName   string
}func NewApp(namespace string, podName string) *App {config := LoadKubernetesConfig()return &App{Config: config, Namespace: namespace, PodName: podName}
}func LoadKubernetesConfig() *restclient.Config {kubeconfig := pflag.Lookup("kubefile").Value.String()// uses the current context in kubeconfigconfig, err := clientcmd.BuildConfigFromFlags("", kubeconfig)if err != nil {panic(err.Error())}return config
}func ExecCommandInPodContainer(config *restclient.Config, namespace string, podName string, containerName string,command string) (string, error) {client, err := kubernetes.NewForConfig(config)reader, writer := io.Pipe()var cmdOutput stringgo func() {scanner := bufio.NewScanner(reader)for scanner.Scan() {line := scanner.Text()cmdOutput += fmt.Sprintln(line)}}()stdin := readerstdout := writerstderr := writertty := falsecmd := []string{"bash","-c",command,}req := client.CoreV1().RESTClient().Post().Resource("pods").Name(podName).Namespace(namespace).SubResource("exec")option := &v1.PodExecOptions{Command:   cmd,Container: containerName,Stdin:     stdin != nil,Stdout:    stdout != nil,Stderr:    stderr != nil,TTY:       tty,}req.VersionedParams(option,scheme.ParameterCodec,)exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())if err != nil {return "", err}err = exec.Stream(remotecommand.StreamOptions{Stdin:  stdin,Stdout: stdout,Stderr: stderr,Tty:    tty,})if err != nil {return "", err}return cmdOutput, nil
}func (orch *App) GetClusterInfo() (string, error) {// check clusters inforesult, err := ExecCommandInPodContainer(orch.Config, orch.Namespace, orch.PodName, "nginx", "echo `date +%Y%m%d-%H:%M` hello wold")if err != nil {fmt.Println("Error occoured" + err.Error())}return result, nil
}func main() {pflag.String("kubefile", "/root/.kube/config", "Kube file to load")pflag.String("namespace", "default", "App Namespace")pflag.Parse()appNamespace := pflag.Lookup("namespace").Value.String()config := LoadKubernetesConfig()client, err := kubernetes.NewForConfig(config)if err != nil {fmt.Println(err.Error())}appPodList, err := client.CoreV1().Pods(appNamespace).List(metav1.ListOptions{})if err != nil {fmt.Println(err.Error())}for _, pod := range appPodList.Items {app := NewApp(pod.ObjectMeta.Namespace, pod.ObjectMeta.Name)result, err := app.GetClusterInfo()if err != nil {fmt.Println(err.Error())}fmt.Println(result)}
}
$ go run test1.go
20201216-10:13 hello wold20201216-10:13 hello wold

参考链接:
https://godoc.org/k8s.io/client-go/util/homedir
https://godoc.org/k8s.io/client-go/tools/remotecommand

相关阅读:
k8s开发之client-go常用操作使用详解

kubernetes dev client-go 进入pod执行命令相关推荐

  1. kubernetes Service:让客户端发现pod并与之通信

    5.1.Service介绍 5.1.1.Serice简介 5.1.1.1什么是Service service是k8s中的一个重要概念,主要是提供负载均衡和服务自动发现. Service 是由 kube ...

  2. 自动化运维之k8s——Kubernetes集群部署、pod、service微服务、kubernetes网络通信

    目录 一.Kubernetes简介 1.Kubernetes简介 2.kubernetes设计架构 3.Kubernetes核心组件 4.kubernetes设计结构 二.Kubernetes部署 1 ...

  3. Kubernetes网络技术解析之Pod基于路由模式的通信实现

    前言 Kubernetes集群内,Pod之间可以通信,是Kubernetes网络实现的重要场景之一. Kubernetes通过CNI提供统一的接口和协议,使得我们在使用中可以根据需求自行选择不同的网络 ...

  4. 【kubernetes详解08】-Pod控制器

    目录 一.Pod控制器介绍 二.ReplicaSet(RS) 1.介绍 2.创建ReplicaSet 3.扩缩容 4.镜像升级 5.删除ReplicaSet 三.Deployment(Deploy) ...

  5. Kubernetes Python Client

    一.概述 Kubernetes官方维护的Python客户端client-python, 地址:https://github.com/kubernetes-client/python 安装模块 pip3 ...

  6. 【kubernetes详解05】-Pod详解之Pod配置

    本文内容说明:详细介绍Pod资源的各种配置(yaml)和原理 一.Pod介绍之结构和定义 1.Pod结构 如上图(Pod结构图),每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程 ...

  7. k8s使用port-forward访问集群中的应用程序(只能在执行命令的机器上开放端口)

    k8s使用port-forward访问集群中的应用程序 本文描述了如何使用 kubectl port-forward 访问 Kubernetes 集群中的 Redis Server.这种连接方式在实际 ...

  8. 如何优雅地关闭Kubernetes集群中的Pod

    原文标题:Gracefully Shutting Down Pods in a Kubernetes Cluster 发布时间:Jan 26, 2019 原文链接:https://blog.grunt ...

  9. java jsch_java - 使用JSch在远程计算机上执行命令

    SSH是访问远程计算机,传输数据和执行远程命令的一种简单而安全的方法.除了基础的交互模式外,还有许多依赖于ssh Client/Server架构的工具可以实现自动化执行远程任务.我们可以找到ssh客户 ...

最新文章

  1. 【初探HTML本相】道之真谛不过自然,html标签脱俗还真
  2. eScan Internet Security Suite 2006
  3. 存储控制器wwn号_正文-新华三集团-H3C
  4. Dw序号列表如何通过html语言加,html标签属性大全
  5. 住宅区和住宅建筑内光纤到户通信设施工程设计规范_山西开展综合布线系统工程设计 验收规范专题培训...
  6. c语言计算坐标三角形面积公式,c语言计算三角形面积代码
  7. linux软件包管理学习归档-2020-0624
  8. 如何更省钱的在矩池云上使用pycharm
  9. 职称计算机pscs4教程,2017年职称计算机photoshop测验练习(4)
  10. matlab中关闭mexfunction,mex文件的运行时Matlab自动关闭
  11. 洛谷OJ:P3811 【模板】乘法逆元(线性递推求逆元)
  12. Windows10+VS2019+OpenGL安装配置详解
  13. H3CNE实验:Comware基本命令操作
  14. 短视频系统+购物直播APP开发方案
  15. 计算机文化基础(高职高专版 第十一版)第七章 答案
  16. python 倒计时库_python实现倒计时小工具
  17. oracle 通过同义词创建视图
  18. [教程] PSP 5.00M33-6升级图文教程
  19. Mybatis的四种分页方式详解
  20. 2022年数学建模国赛--赛后总结

热门文章

  1. Android 8.0 SystemUI下拉状态栏快捷开关
  2. C# OPC类库 升级版本 OPCAutomation.dll
  3. 不同类型的轴承受力简介
  4. 傲游 android 2.3,傲游浏览器安卓版-傲游浏览器手机版v5.2.3.3256-3454手机软件
  5. U深度U盘启动盘制作教程
  6. Android手机在Windows下一键截屏
  7. 资产证券化(ABS)+ 特殊目的信托(SPV)
  8. 记一次触发器定义者不同导致的sql异常TRIGGER command denied to user 'XXX' @'%' for table '...
  9. MySQL - 设计游戏用户信息表
  10. linux用mkefs不能进行格式化,磁盘格式化命令 mkfs