访问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)

最新文章

  1. 用户故事驱动的敏捷开发 – 2. 创建backlog
  2. java攻城狮之路(Android篇)--MP3 MP4、拍照、国际化、样式主题、图片移动和缩放
  3. [QualityCenter]设置工作流脚本-新建缺陷时描述字段模板设置
  4. .NET 分页
  5. XUtils解析
  6. Spring声明式事务配置管理方法(转)
  7. HTML第三天学习笔记
  8. 禁用谷歌字体解决WordPress访问速度过慢问题
  9. 【老鸟学算法】包含 min函数的栈设计——java实现
  10. require.js实践
  11. input元素之间的融合
  12. java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)
  13. 201521123080《Java程序设计》第12周学习总结
  14. Asp.net 在刷新或提交页面后保持滚动条的位置
  15. 总结C语言字符检测函数:isalnum、isalpha...
  16. DNS 协议
  17. Java代码安全
  18. shell(1)-磁盘shell
  19. 【C++ Primer 第10章】 10.4.1 插入迭代器
  20. Andrew Ng机器学习课程笔记(一)之线性回归

热门文章

  1. nginx负载轮询
  2. Windows命令行在任意位置启动和退出nginx
  3. 鸿蒙内核源码分析(定时器篇) | 哪个任务的优先级最高 | 百篇博客分析OpenHarmony源码 | v31.02
  4. bzoj4589-Hard Nim【FWT】
  5. jQuery实现购物车功能
  6. 踩坑系列《十一》完美解决阿里云vod视频点播无法播放音频和视频点播控制台里的媒资库里面的视频无法播放
  7. WebMagic 爬虫技术
  8. bzoj1972 SDOI2010-----猪国杀(模拟)
  9. 试题 算法训练 最大最小公倍数 java题解
  10. Dapr + .NET Core实战(十四)虚拟机集群部署 mDNS + Consul