英文:
client-go for Kubernetes run apply commands
问题
你可以使用client-go库在Go语言中运行kubectl apply命令。以下是一个示例代码:
package main
import (
	"flag"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/serializer"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
)
func main() {
	// 设置kubeconfig文件路径,如果未设置则使用默认路径
	var kubeconfig *string
	if 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()
	// 使用kubeconfig文件创建一个rest.Config对象
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}
	// 创建一个新的Kubernetes客户端
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	// 读取crds.yaml文件内容
	filePath := "path/to/crds.yaml"
	data, err := ioutil.ReadFile(filePath)
	if err != nil {
		panic(err.Error())
	}
	// 将文件内容解析为Unstructured对象
	decode := serializer.NewCodecFactory(runtime.NewScheme()).UniversalDeserializer().Decode
	obj, _, err := decode(data, nil, nil)
	if err != nil {
		panic(err.Error())
	}
	unstructuredObj := obj.(*unstructured.Unstructured)
	// 使用client-go的Apply方法将Unstructured对象应用到集群中
	_, err = clientset.
		Dynamic().
		Resource(unstructuredObj.GetKind()).
		Namespace(unstructuredObj.GetNamespace()).
		Create(unstructuredObj, metav1.CreateOptions{})
	if err != nil {
		panic(err.Error())
	}
	fmt.Println("CRD applied successfully!")
}
请将代码中的path/to/crds.yaml替换为你的crds.yaml文件的实际路径。这段代码将读取crds.yaml文件的内容,并使用client-go的Apply方法将其应用到Kubernetes集群中。
英文:
How can I run kubectl apply commands from go via client-go?
e.g.:
I'm having a file called crds.yaml and I want to run it via client-go
I can't find any examples about how to do so can someone please help?
答案1
得分: 2
你需要解码你的 .yaml 文件。这里是完整的答案(包含代码示例)。
答案2
得分: 1
根据您提供的链接,我对这种类型的调用进行了翻译:
yamlFile, err := ioutil.ReadFile("custom.yaml")
if err != nil {
    log.Printf("yamlFile.Get err #%v ", err)
}
var ctx context.Context
var c client.Client
var actionFn ForEachObjectInYAMLActionFunc
err = ForEachObjectInYAML(ctx, c, yamlFile, "default", actionFn)
if err != nil {
    fmt.Println(err)
}
但是它失败了,显示以下错误信息:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x10ac5cc]
goroutine 1 [running]:
main.ForEachObjectInYAML({0x0, 0x0}, {0x0, 0x0}, {0xc000880000?, 0xc0000021a0?, 0x200000003?}, {0x12bf20f, 0x7}, 0x0)
       apply.go:125 +0x12c
main.main()
       apply.go:34 +0xc5
exit status 2
还有以下代码片段:
if err := actionFn(ctx, c, obj); err != nil {
    return err
}
请问我做错了什么?
英文:
I ended up having this type of call based on what is on the link you provided
	yamlFile, err := ioutil.ReadFile("custom.yaml")
if err != nil {
log.Printf("yamlFile.Get err   #%v ", err)
}
var ctx context.Context
var c client.Client
var actionFn ForEachObjectInYAMLActionFunc
err = ForEachObjectInYAML(ctx, c, yamlFile, "default", actionFn)
if err != nil {
fmt.Println(err)
}
But it is failing with
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x10ac5cc]
goroutine 1 [running]:
main.ForEachObjectInYAML({0x0, 0x0}, {0x0, 0x0}, {0xc000880000?, 0xc0000021a0?, 0x200000003?}, {0x12bf20f, 0x7}, 0x0)
apply.go:125 +0x12c
main.main()
apply.go:34 +0xc5
exit status 2
And there is:
if err := actionFn(ctx, c, obj); err != nil {
return err
}
Any idea what I'm doing wrong?
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论