示例代码如下:
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
评论区