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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐