访问kubernetes CRD的几种方式

本文涉及的产品
云解析 DNS,旗舰版 1个月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 访问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)

CRD下的watchList

同样由于scheme的问题,当创建watchList的时候不能直接使用原生的cache.NewListWatchFromClient来创建watch和list方法:

func RunRuleInformer(operatorClit *rest.RESTClient, im *SyncMap){
    jobInformer := cache.NewSharedIndexInformer(
        cache.NewListWatchFromClient(operatorClit, vmRuleResource, metav1.NamespaceAll, fields.Everything()),
        &v1beta1.VMRule{},
0,
        cache.Indexers{})
    stopCh := make(chan struct{})
    jobInformer.AddEventHandler(im)
go jobInformer.Run(stopCh)
}

可以通过code-generator来生成informer,如

func RunRuleInformer(host,token string, im *SyncMap){
    cs := versioned.NewForConfigOrDie(NewRestCfg(host,token))
    informer := vmRuleInformer.NewVMRuleInformer(cs,vmRuleNamespace,0, cache.Indexers{})
    informer.AddEventHandler(im)
    stopCh := make(chan struct{})
go informer.Run(stopCh)
}
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
11月前
|
Kubernetes 数据安全/隐私保护 Docker
k8s使用私有镜像仓库的访问凭据配置
k8s使用私有镜像仓库的访问凭据配置
294 1
|
20天前
|
消息中间件 Kubernetes 容器
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
|
20天前
|
Kubernetes 网络安全 容器
在K8S中,有个服务使用service的nodeport进行暴露,发现访问不到如何排查?
在K8S中,有个服务使用service的nodeport进行暴露,发现访问不到如何排查?
|
20天前
|
存储 Kubernetes 调度
在K8S中,突然之间无法访问到Pod,正确的排查思路是什么?
在K8S中,突然之间无法访问到Pod,正确的排查思路是什么?
|
20天前
|
Kubernetes 负载均衡 调度
在K8S中,K8S外部节点访问Pod有哪些方式?
在K8S中,K8S外部节点访问Pod有哪些方式?
|
29天前
|
Kubernetes Serverless API
Kubernetes 的架构问题之利用不可变性来最小化对API Server的访问如何解决
Kubernetes 的架构问题之利用不可变性来最小化对API Server的访问如何解决
67 7
|
24天前
|
Kubernetes 网络协议 应用服务中间件
在K8S中,SVC资源是否支持在K8S集群外部访问?
在K8S中,SVC资源是否支持在K8S集群外部访问?
|
20天前
|
域名解析 Kubernetes 负载均衡
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
|
20天前
|
Kubernetes 网络协议 网络安全
在K8S中,k8s中service访问有问题,该如何排查?
在K8S中,k8s中service访问有问题,该如何排查?
|
24天前
|
Kubernetes 网络架构 容器
在k8S中,外部如何访问集群内的服务?
在k8S中,外部如何访问集群内的服务?