RESTClient 是什么
RESTClient 是最基础的客户端,提供与APIServer通信的最基本封装,可以向APIServer发送 Restful 风格请求。
之所以称 RESTClient 是 最基础的客户端,是因为其他三种Client,其实都是 RESTClient 的再封装,内部都使用了 RESTClient。
RESTClient结构体 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 type RESTClient struct { // base is the root URL for all invocations of the client base *url.URL // versionedAPIPath is a path segment connecting the base URL to the resource root versionedAPIPath string // content describes how a RESTClient encodes and decodes responses. content ClientContentConfig // creates BackoffManager that is passed to requests. createBackoffMgr func() BackoffManager // rateLimiter is shared among all requests created by this client unless specifically // overridden. rateLimiter flowcontrol.RateLimiter // warningHandler is shared among all requests created by this client. // If not set, defaultWarningHandler is used. warningHandler WarningHandler // Set specific behavior of the client. If not set http.DefaultClient will be used. Client *http.Client }
RESTClient常用方法
RESTClientFor()
位置:rest/config.go 文件
函数签名:func RESTClientFor(config *Config) (*RESTClient, error),直接 rest点 调用
该方法是用于 创建一个 RESTClient 实例
接收一个 rest.Config 类型参数,Config中包含了 限速器、编解码器 等
RESTClientFor 方法内部会从 Config 中取出这些配置,设置给RESTClient 实例
这样RESTClient 实例就具有了 限速、编解码 等多种功能
因此,我们创建Config的时候,可以手动设置这些功能,下面的示例中会展示。
RESTClient实例的常用方法
/rest/client.go 中有一个接口 Interface
1 2 3 4 5 6 7 8 9 10 11 // Interface captures the set of operations for generically interacting with Kubernetes REST apis. type Interface interface { GetRateLimiter() flowcontrol.RateLimiter Verb(verb string) *Request Post() *Request Put() *Request Patch(pt types.PatchType) *Request Get() *Request Delete() *Request APIVersion() schema.GroupVersion }
RESTClient 实现了这个接口,因此具有所有的方法,用于发送各种类型的请求
另外,Interface 每个方法的返回值都是 Request 类型,Request 类型的各种方法,很多的返回值也是 Request,这样就可以实现 链式编程 了
RESTClient的一些其他知识点
Request 和 Result 常用方法
func (r *Request) Namespace(namespace string) *Request:设置 当前Resquest 访问的 namespace
func (r *Request) Resource(resource string) *Request:设置 当前Resquest 想要访问的资源类型
func (r *Request) Name(resourceName string) *Request:设置 当前Resquest 想要访问的资源的名称
func (r *Request) Do(ctx context.Context) Result:格式化并执行请求。返回一个 Result 对象,以便于处理响应。
rest.Config 结构体
位于 rest/config.go 中,用于描述 kubernetes客户端的通用属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 type Config struct { // API 服务器的主机地址,格式为 https://<hostname>:<port>。默认情况下,它为空字符串,表示使用当前上下文中的集群配置。 Host string // 指定 API 服务器的路径,目前只有两种取值:/api、/apis // - /api:访问core API 组资源时,其实group值为空 // - /apis:访问其他 API 组资源时,都是apis,他们都有group值 APIPath string // 对请求内容的配置,会影响对象在发送到服务器时的转换方式 // - ContentConfig中有两个重要属性: // - NegotiatedSerializer:用于序列化和反序列化请求和响应的接口 // - GroupVersion:请求资源的 API 组和版本 ContentConfig // 用于进行基本身份验证的用户名的字符串 Username string // 用于进行基本身份验证的密码的字符串 Password string `datapolicy:"password"` // 用于进行身份验证的令牌的字符串 BearerToken string `datapolicy:"token"` // 包含身份验证令牌的文件的路径 BearerTokenFile string // TLS 客户端配置,包括证书和密钥 TLSClientConfig // 每秒允许的请求数(Queries Per Second)。默认为 5.0。 QPS float32 // 突发请求数。默认为 10 Burst int // 速率限制器,用于控制向 API 服务器发送请求的速率 RateLimiter flowcontrol.RateLimiter // 与 API 服务器建立连接的超时时间 Timeout time.Duration // 用于创建网络连接的 Dial 函数 Dial func(ctx context.Context, network, address string) (net.Conn, error) // ...... }
tools/clientcmd 工具
源码位于 client-go/tools/clientcmd 包下
clientcmd 是 Kubernetes Go 客户端库(client-go)中的一个包,用于加载和解析 Kubernetes 配置文件,并辅助创建与 Kubernetes API 服务器进行通信的客户端。
clientcmd 提供了一些功能,使得在客户端应用程序中处理 Kubernetes 配置变得更加方便。主要包含以下几个方面的功能:
加载配置文件:clientcmd 可以根据指定的路径加载 Kubernetes 配置文件,例如 kubeconfig 文件。
解析配置文件:一旦加载了配置文件,clientcmd 提供了解析配置文件的功能,可以获取各种配置信息,如集群信息、认证信息、上下文信息等。
辅助创建客户端:clientcmd 可以使用配置文件中的信息,辅助创建与 Kubernetes API 服务器进行通信的客户端对象。这些客户端对象可以用来执行对 Kubernetes 资源的增删改查操作。
切换上下文:clientcmd 还支持在多个上下文之间进行切换。上下文表示一组命名空间、集群和用户的组合,用于确定客户端与哪个Kubernetes 环境进行通信。
RESTClient使用示例 需求:获取default命名空间下的所有pod,并打印所有pod的name
代码编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 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() { // 在你机器的homeDir下,放入集群的config文件,用于连接集群(可以直接从集群master的~/.kube/config拷贝过来) // clientcmd是位于client-go/tools/clientcmd目录下的工具 config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile) if err != nil { panic(err) } // 设置默认 GroupVersion(我要操作的是pod,不属于任何的group,所以使用了SchemeGroupVersion。你要操作什么,就写什么GroupVersion即可) config.GroupVersion = &v1.SchemeGroupVersion // 设置序列化/反序列化器(后面的 Into方法 就是使用它完成 反序列化 的) config.NegotiatedSerializer = scheme.Codecs // 设置 API 根的子路径(我们操作的是pod,属于core资源,所以设置为/api) config.APIPath = "/api" // 创建一个 RESTClient restClient, err := rest.RESTClientFor(config) if err != nil { panic(err) } // 创建一个Pod,用于接收请求结果 pods := v1.PodList{} // 链式编程 发送请求,并反序列化结果到pod中 err = restClient.Get().Namespace(v1.NamespaceDefault).Resource("pods").Do(context.TODO()).Into(&pods) if err != nil { panic(err) } // 打印pod名称 for _, pod := range pods.Items { println(pod.Name) } }
输出结果
1 2 3 4 5 6 cassandra-5hbf7 liveness-exec mysql-87pgn myweb-7f8rh myweb-rjblc nginx-pod-node1