访问kubernetes CRD的几种方式
2023-03-14 22:31:26 时间
访问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中注册GroupVersion
和scheme
。可以使用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)
相关文章
- 不满韩国与北约合作,亲俄黑客称入侵了三星内部服务器
- 丰收之年?去年 GDPR 处罚金额激增至 31 亿美元
- 日产汽车北美数据泄露,系第三方供应商暴露
- 数据库隔离级别及MVCC
- 如何解决Prometheus的存储容量问题?
- 软件测试|pyecharts绘制NBA球星得分能力对比图
- StickyListHeaders的用法说明(带字母索引条)
- 仿IOS 带字母索引的滑轮控件
- 音视频开发之音频基础知识!
- 自定义FlowLayout,android flowLayout实现
- Ffmpeg编码实战!
- 空间转录组2022||空间数据反卷积RCTD分析:full mode on Visium hippocampus
- scMethBank:单细胞全基因组 DNA 甲基化图谱在线数据库
- android Fragment单页面加载,避免重复加载(懒加载)分析
- MySQL使用多因素身份认证
- MySQL全面的在线文档
- MySQL安装、升级篇——RPM
- C语言联合体(共用体)使用方法及大小计算
- 数据分享|R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化|附代码数据
- R语言广义线性模型(GLM)、全子集回归模型选择、检验分析全国风向气候数据|附代码数据