K8s Operator学习
operator学习
·
Client-go学习
架构
控制器逻辑
控制器逻辑:
1.观察:通过监控k8s资源对象变化的事件来获取当前对象状态,只需要关注注入EventHandler让client-go将变化的事件对象信息放入WorkQueue中
2.分析:确定当前状态和期望状态的不同,由Worker来完成
3.执行:执行能够驱动对象当前状态变化的操作,由Worker来完成
更新对象的当前状态,由Worker来完成
RESTClient原理
Client类型
RESTClient: 最基础的客户端,提供最基本的封装
Clientset: Client的合集,在Clientset中包含了所有的k8s内置资源的client,通过clientset便可以很方便的操作如Pod、Service等资源
DynamicClient: 动态客户端,可以操作任意k8s资源包括CRD定义的资源
DiscoveryClient: 用于发现k8s提供的资源组、资源版本和资源信息,比如: kubectl api-resources
RESTclient demo
package main
import (
"context"
v1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// 创建config
config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
if err != nil {
panic(err)
}
// 使用RESTClientFor时需要指定config.GroupVersion否则会报错
// 也可以使用UnversionedRESTClientFor来创建我们的restClient
config.GroupVersion = &v1.SchemeGroupVersion
config.NegotiatedSerializer = scheme.Codecs
config.APIPath = "/api"
restClient, err := rest.RESTClientFor(config)
if err != nil {
panic(err)
}
pod := v1.Pod{}
err :=
// Do是用来执行命令的
// 通过result = r.transformResponse(resp, req) 来返回执行结果
restClient.Get().Namespace("default").Resource("pods").Name("test").Do(context.TODO()).Into(&pod)
if err != nil {
panic(err)
} else{
println(pod.Name)
}
}
RESTClient的使用
RESTClientFor为创建RESTClient准备config,当使用UnversionedRESTClientFor时可以允许config.GroupVersion为空
注:本文为b站白丁云原生学习视频内容,详见参考链接
参考链接:
https://www.bilibili.com/video/BV1uS4y1V7iZ/?spm_id_from=333.788&vd_source=eb1d1d51eca4b462dc3b6817afeeb3e2
更多推荐
已为社区贡献1条内容
所有评论(0)