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