client-go
是Kubernetes项目的官方Go语言客户端库,它为开发者提供了一组强大的工具和接口来与Kubernetes集群进行交互。这个库使得开发者能够编写Go应用程序来管理Kubernetes上的各种资源,比如Deployments、Services、Ingresses、Pods、Namespaces、Nodes等,执行创建、读取、更新和删除(CRUD)操作。
client-go
主要提供了以下几种客户端对象:
-
RESTClient:这是最基础的客户端类型,它封装了HTTP请求,支持JSON和Protocol Buffers格式的数据交换。你可以直接使用它来发送RESTful风格的请求到Kubernetes API服务器。
-
DiscoveryClient:这个客户端用于发现Kubernetes API中的资源和API版本。当你需要动态地获取集群支持的API资源时,会用到它。
-
ClientSet:这是最常用的客户端类型,它为Kubernetes API中的每个资源类型都提供了对应的客户端对象,方便进行高度类型化的操作。通过ClientSet,你可以直接与特定资源进行交互,如
clientset.CoreV1().Pods("namespace").Get(name, metav1.GetOptions{})
来获取Pod。 -
DynamicClient:当需要处理未知或动态类型的资源时,DynamicClient就非常有用。它允许你以一种不关心具体资源类型的方式与API交互,适用于那些运行时才知道具体资源类型的场景。
使用client-go
通常遵循以下步骤:
-
设置Kubernetes配置:首先,你需要设置一个
rest.Config
对象,它通常来源于kubeconfig文件(如~/.kube/config
),用于配置如何连接到Kubernetes集群。config, err := rest.InClusterConfig() if err != nil { // 如果是在集群内运行(如作为Pod的一部分),使用InClusterConfig // 否则,可能需要使用rest.LoadFromConfig来从kubeconfig文件加载配置 }
-
创建ClientSet:使用配置好的
rest.Config
实例化一个clientset.Clientset
。clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err) }
-
执行操作:现在你可以使用
clientset
来进行各种资源操作了,比如列出所有Pods: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, Status: %s\n", pod.Name, pod.Status.Phase) }
ClientSet
是一个结构体,它封装了一系列的客户端对象,每个客户端对象对应Kubernetes API的一个特定资源或一组资源。比如,你可以通过ClientSet.CoreV1().Pods(namespace).List(...)
来列出指定命名空间中的所有Pod,或者使用ClientSet.AppsV1().Deployments(namespace).Create(...)
来创建一个新的Deployment。
- 资源操作:提供了创建、读取、更新和删除(CRUD)Kubernetes资源的方法,涵盖了Pods、Services、Deployments、ConfigMaps等各种资源类型。
- 命名空间操作:支持跨命名空间的操作,允许你针对特定命名空间执行API调用。
- 发现与列举:可以用来发现API服务器上的资源类型,并列举资源实例。
- 配置与认证:
ClientSet
的创建通常需要一个配置对象(rest.Config
),该配置包含了访问API服务器所需的认证信息、服务器地址、TLS设置等。
通常,你会使用kubernetes.NewForConfig()
函数来从一个rest.Config
实例创建一个ClientSet
。下面是一个简单的示例:
参考 client-go/examples/out-of-cluster-client-configuration/main.go
package main
import (
"context"
"flag"
"fmt"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
"path/filepath"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"log"
)
func main() {
// 创建字符串指针变量存储kubeconfig的文件地址
var kubeconfigPath *string
// 获取家目录
home := homedir.HomeDir()
if home != "" {
// 有家目录时,设置默认的kubeconfig路径,并允许用户通过命令行参数 --kubeconfig=*** ip覆盖
kubeconfigPath = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
// 没有检测到家目录,仍然定义kubeconfig参数,但提示用户必须提供(此时应避免暗示使用命令行传入家目录)
kubeconfigPath = flag.String("kubeconfig", "", "Please provide the absolute path to the kubeconfig file")
}
// 确保在使用kubeconfigPath之前调用flag.Parse()解析命令行参数
flag.Parse()
fmt.Println("kubeconfig为:",*kubeconfigPath)
config,err := clientcmd.BuildConfigFromFlags("",*kubeconfigPath)
if err != nil {
// 使用Fatal,打印日志后程序会退出
log.Fatal(err)
}
//创建 clientset
clientset,err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatal(err)
}
//获取所有的Pods
list, err := clientset.CoreV1().Pods("").List(context.Background(),metav1.ListOptions{})
if err != nil {
log.Fatal(err)
}
for _, pod := range list.Items {
//打印pod的名字
fmt.Println(pod.Name)
}
}
参考 client-go/examples/in-cluster-client-configuration/main.go
package main
import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"log"
)
func main() {
//创建集群内的配置
config,err := rest.InClusterConfig()
if err != nil {
log.Fatal("rest.InClusterConfig err:",err)
}
clientset,err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatal("kubernetes.NewForConfig err:",err)
}
//获取所有的Pods
list, err := clientset.CoreV1().Pods("").List(context.Background(),metav1.ListOptions{})
if err != nil {
log.Fatal(err)
}
for _, pod := range list.Items {
//打印pod的名字
fmt.Println(pod.Name)
}
}
// go build -o app
ClientSet
包含了针对不同组的客户端。在Kubernetes的Go客户端(client-go
)中,ClientSet
是一个综合性的结构,它整合了多个API组的客户端接口。API组是用来对Kubernetes API中的资源进行分类和版本管理的一种方式,支持扩展性和版本控制。
创建一个ClientSet
时,它会为多个核心及扩展组预初始化客户端,让你能够与诸如以下资源进行互动:
- 核心组 (
core/v1
):Pod、服务、配置映射、密钥、节点等。 - 应用组 (
apps/v1
):部署、有状态集、守护进程集、副本集、任务、定时任务等。 - 批处理组 (
batch/v1
,batch/v1beta1
):任务、定时任务等。 - 网络组 (
networking.k8s.io/v1
):入口、网络策略等。 - 以及其他更多,依据Kubernetes版本和可用的扩展而定。
每个组的客户端都提供了特定于该组资源的方法,让你能够执行创建、读取、更新、删除等操作以及其他与那些资源相关的活动。
简化的来说,ClientSet
内部结构是这样的组织,展示它如何聚合不同组的客户端:
type ClientSet struct {
coreV1 *corev1.CoreV1Client
appsV1 *appsv1.AppsV1Client
batchV1 *batchv1.BatchV1Client
// ... 其他组的接口
}
你可以通过如ClientSet.CoreV1()
、ClientSet.AppsV1()
等方法访问这些接口,进而与相应的Kubernetes资源进行互动。
例如,若要创建一个部署,你会使用AppsV1Interface
:
deploymentClient := clientset.AppsV1().Deployments(namespace)
deployment, err := deploymentClient.Create(context.TODO(), deploymentSpec, metav1.CreateOptions{})
这种ClientSet
的模块化设计确保了你的代码能够轻松地与广泛的Kubernetes资源互动,同时保持清晰和结构化的API调用方式。
k8s有不同类型的资源,不同类型的资源要调用client-go不同子包的方法,下面是子包的列表。
➜ typed git:(master) ✗ pwd
/home/yantao/go/src/github.com/gaara1994/client-go/kubernetes/typed
➜ typed git:(master) ✗ ll
总用量 88K
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 admissionregistration
drwxrwxr-x 3 yantao yantao 4.0K 5月 10 11:13 apiserverinternal
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 apps
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 authentication
drwxrwxr-x 4 yantao yantao 4.0K 5月 10 11:13 authorization
drwxrwxr-x 6 yantao yantao 4.0K 5月 10 11:13 autoscaling
drwxrwxr-x 4 yantao yantao 4.0K 5月 10 11:13 batch
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 certificates
drwxrwxr-x 4 yantao yantao 4.0K 5月 10 11:13 coordination
drwxrwxr-x 3 yantao yantao 4.0K 5月 10 11:13 core
drwxrwxr-x 4 yantao yantao 4.0K 5月 10 11:13 discovery
drwxrwxr-x 4 yantao yantao 4.0K 5月 10 11:13 events
drwxrwxr-x 3 yantao yantao 4.0K 5月 10 11:13 extensions
drwxrwxr-x 6 yantao yantao 4.0K 5月 10 11:13 flowcontrol
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 networking
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 node
drwxrwxr-x 4 yantao yantao 4.0K 5月 10 11:13 policy
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 rbac
drwxrwxr-x 3 yantao yantao 4.0K 5月 10 11:13 resource
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 scheduling
drwxrwxr-x 5 yantao yantao 4.0K 5月 10 11:13 storage
drwxrwxr-x 3 yantao yantao 4.0K 5月 10 11:13 storagemigration
- 核心资源(Core Resources): 调用
clientset.CoreV1()
- Pods
- Services
- ConfigMaps
- Secrets
- PersistentVolumes 和 PersistentVolumeClaims
- Nodes
- Namespaces
- Apps 资源(Apps Resources): 调用
clientset.AppsV1()
- Deployments
- ReplicaSets
- StatefulSets
- DaemonSets
- Jobs
- CronJobs
- 网络资源(Networking Resources): 调用
clientset.NetworkingV1()
- Ingresses
- NetworkPolicies
- 存储资源(Storage Resources): 调用
clientset.StorageV1()
- StorageClasses
- 扩展资源(Extensions/CustomResources): 调用
clientset.ExtensionsV1beta1()
- CustomResourceDefinitions (CRDs) —— 虽然直接通过标准
ClientSet
创建CRDs比较复杂,通常需要使用apiextensions.k8s.io/v1
API组的客户端,但可以通过扩展ClientSet
或使用DynamicClient
来操作。 - 各种自定义资源对象(由CRDs定义)
- CustomResourceDefinitions (CRDs) —— 虽然直接通过标准
- 安全与认证资源(Security and Authentication): 调用
clientset.AuthorizationV1()
- Roles 和 ClusterRoles
- RoleBindings 和 ClusterRoleBindings
- ServiceAccounts
- API 资源(API Resources): 调用
clientset.OpenAPIV3()
- APIServices
- CustomResourceDefinitions
- 其他资源:
- Events 调用
clientset.EventsV1()
- Endpoints
- HorizontalPodAutoscalers
- PodDisruptionBudgets
- LimitRanges
- ResourceQuotas ResourceV1alpha2
- Events 调用
下面是整理的列表
资源类型 | Clientset类型 | 具体的资源 |
---|---|---|
核心资源(Core Resources) | clientset.CoreV1() | Pods Services ConfigMaps Secrets PersistentVolumes PersistentVolumeClaims Nodes Namespaces |
Apps 资源(Apps Resources) | clientset.AppsV1() | Deployments ReplicaSets StatefulSets DaemonSets Jobs CronJobs |
网络资源(Networking Resources) | clientset.NetworkingV1() | Ingresses NetworkPolicies |
存储资源(Storage Resources) | clientset.StorageV1() | StorageClasses |
扩展资源(Extensions/CustomResources) | clientset.ExtensionsV1beta1() | CustomResourceDefinitions (CRDs) |
RBAC资源 | clientset.RbacV1() | Roles |
认证与授权策略 | clientset.AuthenticationV1() | |
API 资源(API Resources) | clientset.OpenAPIV3() | APIServices CustomResourceDefinitions |
创建 监听 删除 demo3/main.go
Pod资源在Kubernetes中被认为是基本上不可变的,这意味着一旦Pod被创建,你不应该直接修改其定义,包括更换镜像。Pod的设计原则是围绕着它的 immutability(不变性)和 declarative configuration(声明式配置)理念构建的。当需要改变Pod的属性,比如镜像版本,推荐的做法是通过操作更高层次的抽象资源来间接实现,比如:
Deployments: 用于无状态应用,支持滚动更新、回滚等特性。
StatefulSets: 针对有状态应用,同样支持更新策略,同时保持Pod的唯一标识和稳定的存储。
创建 更新 删除
demo4/main.go
其他
获取节点资源使用情况
demo5
这部分代码主要用于获取Kubernetes集群中所有节点的基本信息列表,并打印每个节点的名称以及是否处于内存压力状态(MemoryPressure)。这里的内存压力状态是一个布尔型指示器,告诉用户节点是否正面临内存资源分配的压力。但是,它不能提供关于节点实际内存使用量的详细信息。
demo6
这一部分则专注于获取节点的实时资源使用度量数据,特别是CPU和内存的使用情况。它通过创建一个专用于与metrics API交互的clientset (metricsClient
),并利用这个clientset来请求NodeMetricses
资源列表。这提供了每个节点的CPU和内存的实际使用量(Usage.Cpu() 和 Usage.Memory()),