侧边栏壁纸
博主头像
张种恩博主等级

一个能运维的 JPG 搬运工

  • 累计撰写 709 篇文章
  • 累计创建 62 个标签
  • 累计收到 27 条评论

目 录CONTENT

文章目录
Go

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

张种恩
2022-09-07 / 0 评论 / 0 点赞 / 19 阅读 / 318 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

示例代码如下:

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

评论区