美文网首页
未知yaml中gvk时候client go创建资源

未知yaml中gvk时候client go创建资源

作者: wwq2020 | 来源:发表于2022-07-25 21:29 被阅读0次
    package main
    
    import (
        "context"
        "io/ioutil"
    
        "k8s.io/client-go/rest"
    
        "k8s.io/apimachinery/pkg/api/meta"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
        "k8s.io/apimachinery/pkg/runtime"
        yamlCodec "k8s.io/apimachinery/pkg/runtime/serializer/yaml"
        "k8s.io/client-go/discovery"
        memory "k8s.io/client-go/discovery/cached"
        "k8s.io/client-go/dynamic"
        "k8s.io/client-go/restmapper"
    )
    
    func dynamicCreate(ctx context.Context, cfg *rest.Config, codec runtime.Serializer, data []byte) error {
        discoveryClient, err := discovery.NewDiscoveryClientForConfig(cfg)
        if err != nil {
            return err
        }
    
        mapper := restmapper.NewDeferredDiscoveryRESTMapper(memory.NewMemCacheClient(discoveryClient))
        dynamicClient, err := dynamic.NewForConfig(cfg)
        if err != nil {
            return err
        }
    
        obj := &unstructured.Unstructured{}
        _, gvk, err := codec.Decode(data, nil, obj)
        if err != nil {
            return err
        }
    
        mapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version)
        if err != nil {
            return err
        }
    
        var dynamicResource dynamic.ResourceInterface = dynamicClient.Resource(mapping.Resource)
        if mapping.Scope.Name() == meta.RESTScopeNameNamespace {
            namesapce := obj.GetNamespace()
            if namesapce == "" {
                namesapce = "default"
            }
            dynamicResource = dynamicClient.Resource(mapping.Resource).Namespace(namesapce)
        }
    
        if _, err := dynamicResource.Create(ctx, obj, metav1.CreateOptions{}); err != nil {
            return err
        }
    
        return nil
    }
    
    func main() {
        data, err := ioutil.ReadFile("./demo.yaml")
        if err != nil {
            panic(err)
        }
        restConfig := &rest.Config{
            Host:        "yourk8shost",
            BearerToken: "yourtoken",
            TLSClientConfig: rest.TLSClientConfig{
                Insecure: true,
            },
        }
        ctx := context.TODO()
        codec := yamlCodec.NewDecodingSerializer(unstructured.UnstructuredJSONScheme)
        if err := dynamicCreate(ctx, restConfig, codec, data); err != nil {
            panic(err)
        }
    }
    

    相关文章

      网友评论

          本文标题:未知yaml中gvk时候client go创建资源

          本文链接:https://www.haomeiwen.com/subject/cbwgirtx.html