四种客户端

在 client-go 中,有四种可以与 Kubernetes 资源进行交互的客户端,分别是 ClientSet、DynamicClient、DiscoveryClient 以及 RestClient,它们各自适用于不同的场景。下面结合代码来体会一下。

ClientSet

ClientSet 是最常用的客户端,用于与 Kubernetes 核心资源(如 Pod、Service、Deployment 等)进行交互。它封装了对各类资源的操作,提供了类型安全的接口。我们用一个列出 default 命名空间下的 pod 列表的例子,看一下代码如何实现。

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
package main


import (
"context"
"fmt"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)


func main() {
config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
if err != nil {
panic(err)
}


clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}


pods, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err)
}


for _, pod := range pods.Items {
fmt.Printf("Pod Name: %s\n", pod.Name)
}
}

GVK 与 ClientSet 的关系

在示例代码中,clientset.CoreV1().Pods().List() 是用于获取 Pod 列表的方法。

为什么是 CoreV1()?这与 Kubernetes 资源的 GVK 密切相关。

GVK 是 Group、Version 和 Kind 的缩写。

  • Group:表示资源所属的 API 组,比如 apps、batch 等。
  • Version:表示资源的版本,比如 v1、v1beta1 等。
  • Kind:表示资源的类型,比如 Pod、Service 等,注意是大写字母开头的单数形式。

GVK 用于标识 Kubernetes 中的每种资源,也就是描述“身份”。
例如,特朗普的 Group 是人类,Version 比如就是出生日期,Kind 是特朗普。在资源的 YAML 中,我们也会用到 GVK。以下是一个 pod 的 YAML:

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
  • apiVersion:是由 Group/Version 组合而成,由于 Pod 的 Group 为 Core(核心 API 组,Group 名为空),Version 为 v1,因此只写了 v1。
  • kind:即为 Kind。因此,在 ClientSet 中,Pod 的方法位于 CoreV1() 下,这是因为 Core API Group 的名称为空,直接使用 Version 表示。

我们再来看一下 deployment 的 YAML:

1
2
3
4
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment

因此,若需要操作 Deployment 资源,可以通过 clientset.AppsV1().Deployments().List() 方法来获取 Deployment 列表。

总结:只要知道目标资源的 GVK,就可以快速定位到对应的 ClientSet 方法。例如:

  • Pod 的 GVK 为 v1、Pod,对应 clientset.CoreV1().Pods()。
  • Deployment 的 GVK 为 apps/v1、Deployment,对应 clientset.AppsV1().Deployments()。

这种基于 GVK 的设计,使得 ClientSet 在操作 Kubernetes 核心资源时直观、简洁且高效。