侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录
Go

在 go 代码中以命令行风格直接调用 kubectl 库提供的 api

zze
zze
2022-09-07 / 0 评论 / 0 点赞 / 470 阅读 / 2252 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

示例代码如下:

package main

import (
	"k8s.io/cli-runtime/pkg/genericclioptions"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/component-base/cli"
	"k8s.io/kubectl/pkg/cmd"
	"k8s.io/kubectl/pkg/cmd/plugin"
	"log"
	"os"
)

func main() {
	if err := ExecKubectlCommandWithKubeConfig(kubeConfig, []string{"get", "pod", "-n", "bberp-dev-service"}); err != nil {
		log.Fatal(err)
	}
}

var defaultConfigFlags = genericclioptions.NewConfigFlags(true).WithDeprecatedPasswordFlag().WithDiscoveryBurst(300).WithDiscoveryQPS(50.0)

func ExecKubectlCommandWithKubeConfig(kubeConfig string, command []string) error {
	kubectlOptions := cmd.KubectlOptions{
		PluginHandler: cmd.NewDefaultPluginHandler(plugin.ValidPluginFilenamePrefixes),
		ConfigFlags:   defaultConfigFlags,
		IOStreams:     genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr},
	}
	kubeClientConfig, err := clientcmd.NewClientConfigFromBytes([]byte(kubeConfig))
	if err != nil {
		return err
	}

	kubectlOptions.ConfigFlags.SetClientConfig(&kubeClientConfig)
	if err != nil {
		return err
	}

	kubectlCmd := cmd.NewDefaultKubectlCommandWithArgs(kubectlOptions)
	kubectlCmd.SetArgs(command)

	if err := cli.RunNoErrOutput(kubectlCmd); err != nil {
		return err
	}
	return nil
}

var kubeConfig = `xxx`

要注意的是 kubectl 库本身只暴露了从文件路径读取 kubeconfig 配置的 function,如果需要像如下代码直接从字符串加载 kubeconfig 配置:

kubeConfigInfo, err := clientcmd.NewClientConfigFromBytes([]byte(kubeConfig))
if err != nil {
	log.Fatal(err)
}
kubectlOptions.ConfigFlags.SetClientConfig(&kubeConfigInfo)

则需要修改 ConfigFlags 所在包 cri-runtime 的源码给其增加一个 SetClientConfig 实例方法,允许从外部注入 kubeconfig 配置信息。

我这里已经有 fork 过来修改好的 commit:

在 go mod 中要 repalce 一下引用:

replace k8s.io/cli-runtime => github.com/zze326/cli-runtime v0.25.1-0.20220907015128-74b1acfcfd09
0

评论区