ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

访问kubernetes CRD的几种方式

2021-11-10 11:35:37  阅读:202  来源: 互联网

标签:kubernetes err json rest 几种 restConfig CRD scheme v1beta1


访问kubernetes CRD的几种方式

最近在使用代码操作VictoriaMetrics Operator的CRD资源的过程中,探究了集中访问CRD资源的方式。下面以VictoriaMetrics Operator的CRD为例介绍。

方式1:使用dynamic client

这种方式最原始,使用dynamic client获取到原始的json数据,可以使用json.Unmarshal 将数据解析到结构体重,也可以 runtime.DefaultUnstructuredConverter.FromUnstructured方法进行解析。

这种方式的好处是简单好理解,缺点就是需要在json层面操作数据,使用json作为实际数据结构和unstructured.Unstructured之间的转换媒介,性能上面可能会存在一定问题。

代码如下,更多参见这篇文章

    restConfig := &rest.Config{
       Host:            "https://xxxxx:6443",
       BearerToken:     "xxxx",
       TLSClientConfig: rest.TLSClientConfig{Insecure: true},
    }    

    dynClient, err := dynamic.NewForConfig(restConfig)
    if err != nil {
        return
    }

    var r = schema.GroupVersionResource{Group: "operator.victoriametrics.com", Version: "v1beta1", Resource: "vmrules"}
    list, err := dynClient.Resource(r).Namespace("vm").List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        return
    }

    rlist := v1beta1.VMRuleList{}
    /* 可以直接使用json方式解析到结构体中
    data, _ := list.MarshalJSON()
    if err := json.Unmarshal(data, &rlist); err != nil {
        return
    }
     */
    runtime.DefaultUnstructuredConverter.FromUnstructured(list.UnstructuredContent(), &rlist)
    fmt.Println(rlist)

方式2:使用client-go

一般会采用这种方式。首先需要在restConfig中注册GroupVersionscheme。可以使用kubectl get --raw /apis/operator.victoriametrics.com/v1beta1来验证该资源的APIPath是不"/apis"。scheme用于注册结构体信息,使用scheme生成的parameterCodec来解析数据。

代码如下:

    var SchemeGroupVersion = schema.GroupVersion{Group: "operator.victoriametrics.com", Version: "v1beta1"}
    restConfig := &rest.Config{
       Host:            "https://xxxx:6443",
       BearerToken:     "xxxx",
       TLSClientConfig: rest.TLSClientConfig{Insecure: true},
    }

    restConfig.APIPath = "/apis"
    restConfig.GroupVersion = &SchemeGroupVersion
    restConfig.NegotiatedSerializer = scheme1.Codecs.WithoutConversion()

    scheme := runtime.NewScheme()
    victoriametricsv1beta1.AddToScheme(scheme)
    parameterCodec := runtime.NewParameterCodec(scheme)

    if restConfig.UserAgent == "" {
        restConfig.UserAgent = rest.DefaultKubernetesUserAgent()
    }

    c,err := rest.RESTClientFor(restConfig)
    if nil != err{
       panic(err)
    }
    rl := &v1beta1.VMRuleList{}
    err = c.Get().
        Namespace("vm").
        Resource("vmrules").
        VersionedParams(&metav1.ListOptions{},scheme1.ParameterCodec).
        Do(context.TODO()).
        Into(rl)
    fmt.Println(err,rl)

标签:kubernetes,err,json,rest,几种,restConfig,CRD,scheme,v1beta1
来源: https://www.cnblogs.com/charlieroro/p/15532630.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有