Kubernetes client-go 客户端类型与初始化指南

Kubernetes client-go 客户端类型与初始化指南

在 Kubernetes 的 client-go 库中,存在多种客户端用于与 API 服务器交互。以下介绍主要客户端类型,包括用途、初始化方式及 Demo。

1. RESTClient

用途

RESTClient 是底层 REST 客户端,直接与 Kubernetes API 服务器的 HTTP 端点交互,适合需要自定义请求的场景。

初始化方式

通过 rest.Config 配置初始化,依赖 k8s.io/client-go/rest 包。

Demo

获取 default 命名空间中的 Pod 列表。

package mainimport ("context""fmt""k8s.io/client-go/rest""k8s.io/client-go/tools/clientcmd"
)func main() {// 加载 kubeconfig 文件kubeconfig := "/path/to/kubeconfig"config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)if err != nil {panic(err)}// 创建 RESTClientrestClient, err := rest.RESTClientFor(config)if err != nil {panic(err)}// 获取 Pod 列表result := restClient.Get().AbsPath("/api/v1/namespaces/default/pods").Do(context.TODO())if result.Error() != nil {panic(result.Error())}// 输出原始响应data, err := result.Raw()if err != nil {panic(err)}fmt.Printf("Raw Pod list: %s\n", string(data))
}

说明

  • RESTClient 直接操作 HTTP 端点,返回原始 JSON 数据。
  • 适合需要低级控制的场景,但解析响应需自行处理。

2. Clientset

用途

Clientset 是一个高级客户端,包含所有 Kubernetes 核心资源(如 Pod、Service、Deployment 等)的类型化方法,适合大多数 CRUD 操作。

初始化方式

通过 rest.Config 初始化,依赖 k8s.io/client-go/kubernetes 包。

Demo

列出 default 命名空间中的所有 Pod。

package mainimport ("context""fmt"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/clientcmd"
)func main() {// 加载 kubeconfig 文件kubeconfig := "/path/to/kubeconfig"config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)if err != nil {panic(err)}// 创建 Clientsetclientset, err := kubernetes.NewForConfig(config)if err != nil {panic(err)}// 获取 Pod 列表pods, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})if err != nil {panic(err)}// 输出 Pod 名称for _, pod := range pods.Items {fmt.Printf("Pod: %s\n", pod.Name)}
}

说明

  • Clientset 提供类型化的方法,操作直观,适合核心资源管理。
  • 自动解析响应为 Go 结构体,无需手动处理 JSON。

3. Dynamic Client

用途

DynamicClient 用于处理任意 Kubernetes 资源(包括自定义资源 CRD),不依赖类型化的 Go 结构体,适合动态或未知类型的资源。

初始化方式

通过 rest.Config 初始化,依赖 k8s.io/client-go/dynamic 包。

Demo

列出 default 命名空间中的自定义资源 myresources.example.com

package mainimport ("context""fmt"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/apimachinery/pkg/runtime/schema""k8s.io/client-go/dynamic""k8s.io/client-go/tools/clientcmd"
)func main() {// 加载 kubeconfig 文件kubeconfig := "/path/to/kubeconfig"config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)if err != nil {panic(err)}// 创建 DynamicClientdynamicClient, err := dynamic.NewForConfig(config)if err != nil {panic(err)}// 定义自定义资源的 GVRgvr := schema.GroupVersionResource{Group: "example.com", Version: "v1", Resource: "myresources"}// 获取自定义资源列表list, err := dynamicClient.Resource(gvr).Namespace("default").List(context.TODO(), metav1.ListOptions{})if err != nil {panic(err)}// 输出资源名称for _, item := range list.Items {fmt.Printf("Custom Resource: %s\n", item.GetName())}
}

说明

  • DynamicClient 使用 unstructured.Unstructured 处理资源,适合 CRD 或动态场景。
  • 需要明确指定 GroupVersionResource (GVR)。

4. Discovery Client

用途

DiscoveryClient 用于查询 Kubernetes API 服务器支持的资源和版本(如 API 组、资源类型),适合动态发现集群的 API 能力。

初始化方式

通过 rest.Config 初始化,依赖 k8s.io/client-go/discovery 包。

Demo

列出集群支持的所有 API 资源。

package mainimport ("fmt""k8s.io/client-go/discovery""k8s.io/client-go/tools/clientcmd"
)func main() {// 加载 kubeconfig 文件kubeconfig := "/path/to/kubeconfig"config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)if err != nil {panic(err)}// 创建 DiscoveryClientdiscoveryClient, err := discovery.NewDiscoveryClientForConfig(config)if err != nil {panic(err)}// 获取所有 API 资源apiResources, err := discoveryClient.ServerPreferredResources()if err != nil {panic(err)}// 输出资源信息for _, apiGroup := range apiResources {for _, resource := range apiGroup.APIResources {fmt.Printf("Resource: %s, Group: %s, Version: %s\n", resource.Name, apiGroup.GroupVersion, resource.Kind)}}
}

说明

  • DiscoveryClient 不直接操作资源,仅查询元信息。
  • 常用于版本兼容性检查或 CRD 发现。

5. Informer 和 Controller

用途

InformerController 用于监听和处理 Kubernetes 资源变化,基于缓存机制,适合控制器或 Operator 开发。

初始化方式

通过 k8s.io/client-go/informersk8s.io/client-go/tools/cache 包初始化。

Demo

监听 default 命名空间中 Pod 的变化事件。

package mainimport ("fmt""time""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/cache""k8s.io/client-go/tools/clientcmd"
)func main() {// 加载 kubeconfig 文件kubeconfig := "/path/to/kubeconfig"config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)if err != nil {panic(err)}// 创建 Clientsetclientset, err := kubernetes.NewForConfig(config)if err != nil {panic(err)}// 创建 InformerFactoryinformerFactory := informers.NewSharedInformerFactoryWithOptions(clientset, time.Second*30, informers.WithNamespace("default"))// 获取 Pod InformerpodInformer := informerFactory.Core().V1().Pods().Informer()// 添加事件处理podInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: func(obj interface{}) {fmt.Println("Pod added")},UpdateFunc: func(oldObj, newObj interface{}) {fmt.Println("Pod updated")},DeleteFunc: func(obj interface{}) {fmt.Println("Pod deleted")},})// 启动 InformerstopCh := make(chan struct{})defer close(stopCh)informerFactory.Start(stopCh)informerFactory.WaitForCacheSync(stopCh)// 保持运行<-stopCh
}

说明

  • Informer 提供高效的资源缓存和事件通知。
  • 适合控制器开发,需结合工作队列处理事件。

配置来源

所有客户端的初始化依赖 rest.Config,可通过以下方式生成:

  1. Kubeconfig 文件:通过 clientcmd.BuildConfigFromFlags 加载(集群外)。
  2. In-Cluster 配置:通过 rest.InClusterConfig() 获取(集群内)。
  3. 手动配置:直接构造 rest.Config

In-Cluster 示例

config, err := rest.InClusterConfig()
if err != nil {panic(err)
}

总结

客户端类型用途初始化包Demo 示例
RESTClient低级 REST API 访问k8s.io/client-go/rest获取 Pod 列表(原始 JSON)
Clientset类型化核心资源操作k8s.io/client-go/kubernetes列出 Pod 名称
Dynamic Client动态资源操作(包括 CRD)k8s.io/client-go/dynamic列出自定义资源
Discovery Client查询 API 资源和版本k8s.io/client-go/discovery列出所有 API 资源
Informer资源监听和控制器开发k8s.io/client-go/informers监听 Pod 变化事件

选择建议

  • 简单 CRUDClientset
  • 自定义资源或动态操作DynamicClient
  • 控制器开发Informer
  • API 发现DiscoveryClient
  • 低级访问RESTClient

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java加强 -泛型

概念 定义类、接口、方法时&#xff0c;同时声明了一个或多个类型变量&#xff08;如<E>&#xff09;&#xff0c;称为泛型类、泛型接口、泛型方法、它们统称为泛型。 语法 public class ArrayList<E>{} E可以接收不同类型的数据&#xff0c;可以是字符串&…

C++ 项目 -- 高并发内存池

目录 项目介绍 内存池概念 池化技术 内存池 内存池主要解决的问题 malloc 定长内存池 申请内存 释放内存 整体框架设计 thread cache 申请内存 释放内存 central cache 申请内存 释放内存 page cache 申请内存 释放内存 大块内存申请实现 定长内存…

高效C/C++之九:Coverity修复问题:关于数组操作 和 内存操作

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 高效C/C之九&#xff1a;Coverity修复问题&#xff1a;关于数组操作 和 内存操作 目录 【关注我&#xff0c;后…

vfrom表单设计器使用事件机制控制字段显示隐藏

1. 使用表单设计器进行debug调试 依据 vform3.0开发者文档 https://www.ganweicloud.com/docs/6.1.0/pages/d3e6d9/ 对switch组件设置事件逻辑 调试中

iPhone 和 Android 在日期格式方面的区别

整篇文章由iPhone 和 Android 在日期格式方面有所不同引起,大致介绍了,两种时间标准,以及在 JavaScript 下的格式转换方法。 Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 iPhone 和 Android 在日期格式方面有所不同。其中,iPhone(iOS)使…

985高校查重率“隐性阈值”:低于5%可能被重点审查!

你是不是也以为&#xff1a; “查重率越低越好&#xff0c;最好压到1%、0%&#xff0c;导师看了都感动哭&#x1f979;” 但是你不知道的是——在985/211等重点高校&#xff0c;查重率太低反而可能引起导师和学术办公室的“特别关注”&#xff01; 今天就来扒一扒这个查重圈“…

【NLP】33. Pinecone + OpenAI :构建自定义语义搜索系统

Pinecone OpenAI 中文教学教程&#xff1a;构建自定义语义搜索系统 一、背景介绍 当下 AI 问答系统、矩阵检索、短文本分类等场景中&#xff0c;都需要很好地实现 “根据输入进行相似给点搜索”。这种算法基础称为 “向量搜索”&#xff0c;它的核心是将文本转换为向量后&am…

【Mybatis-plus常用语法】

MyBatis-Plus 是 MyBatis 的增强工具&#xff0c;提供了很多便捷的功能来简化开发。以下是一些 MyBatis-Plus 的常见语法&#xff1a; 实体类注解&#xff1a;使用 TableName 注解来指定实体类和数据库表的映射关系。 TableName("user") public class User {privat…

Logback官方文档翻译章节目录

Logback官方文档翻译章节目录 第一章 Logback简介 第二章 Logback的架构&#xff08;一&#xff09; Logback的架构&#xff08;二&#xff09; Logback的架构&#xff08;三&#xff09; 持续更新中…

Python变量作用域

变量作用域是Python编程中非常重要的基础概念&#xff0c;理解它可以帮助你避免很多常见的错误。本文将用简单易懂的方式&#xff0c;带你全面掌握Python变量作用域的所有细节。 一、什么是变量作用域&#xff1f; 变量作用域&#xff08;Scope&#xff09;指的是变量在程序中…

初学者的AI智能体课程:构建AI智能体的十堂课

初学者的AI智能体课程:构建AI智能体的十堂课 在人工智能(AI)领域,AI智能体正在逐渐发挥其不容忽视的作用。自动化的智能体不仅仅在理论上广泛讨论,更加在实际应用中开辟了一片新的天地。那么如何动手开发属于自己的AI智能体呢?Microsoft提供的AI智能体入门课正是为此而设…

【并发编程】MySQL锁及单机锁实现

目录 一、MySQL锁机制 1.1 按锁粒度划分 1.2 按锁功能划分 1.3 InnoDB锁实现机制 (1)记录锁(Record Lock) (2) 间隙锁(Gap Lock) (3) 临键锁(Next-Key Lock) (4) 插入意向锁(Insert Intention Lock) 二、基于 JVM 本地锁实现,保证线程安全 2.1 线程不安全的分析 2.1…

能耗优化新引擎:EIOT平台助力企业降本增效

安科瑞顾强 数字化转型的背景下&#xff0c;能源管理正加速向智能化、远程化方向演进。安科瑞电气推出的EIOT托管平台及ADW300系列4G无线计量仪表&#xff0c;通过云端技术与无线通信的深度融合&#xff0c;为用户打造了高效、便捷的远程能源监测与管理体系&#xff0c;助力企…

(14)Element Plus项目综合案例

本系列教程目录&#xff1a;Vue3Element Plus全套学习笔记-目录大纲 文章目录 第3章 综合案例3.1 搭建项目3.1.1 创建Vite工程3.1.2 配置路由 3.2 登录模块页面3.2.1 注册页面3.2.2 登录页面3.2.3 忘记密码页面 3.3 导航设置3.3.1 头部3.3.2 侧边栏与底部1&#xff09;头像部分…

Webug4.0靶场通关笔记22- 第27关文件包含

目录 一、文件包含 1、原理分析 2、文件包含函数 &#xff08;1&#xff09;include( ) &#xff08;2&#xff09;include_once( ) &#xff08;3&#xff09;require( ) &#xff08;4&#xff09;require_once( ) 二、第27关渗透实战 1、打开靶场 2、源码分析 3、…

〖 Linux 〗解决 VS Code 远程连接服务器的常见问题

文章目录 解决 VS Code 远程连接服务器的断开问题VS Code Remote-SSH一直弹出输入密码的问题VsCode C 语法检测失效不标红色波浪线 解决办法卸载扩展方式&#xff1a; 解决vscode C智能提示缓慢 解决 VS Code 远程连接服务器的断开问题 解决 vscode 卡顿&#xff0c;卡死&…

ERC-20与ERC-721:区块链代币标准的双星解析

一、代币标准的诞生背景 在以太坊生态中&#xff0c;代币标准是构建去中心化应用&#xff08;DApps&#xff09;的基石。ERC-20与ERC-721分别代表同质化与非同质化代币的两大核心标准&#xff0c;前者支撑着90%以上的加密资产流通&#xff0c;后者则开启了数字资产唯一性的新时…

C++入门小馆 :多态

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【NextPilot日志移植】整体功能概要

整体日志系统的实现功能 该日志系统主要实现了飞行日志的记录功能&#xff0c;支持多种日志记录模式&#xff0c;可将日志存储到文件或通过 MAVLink 协议传输&#xff0c;同时具备日志加密、空间管理、事件记录等功能。具体如下&#xff1a; 日志记录模式&#xff1a;支持按武…

数字化转型:概念性名词浅谈(第二十五讲)

大家好&#xff0c;今天接着介绍数字化转型的概念性名词系列。 &#xff08;1&#xff09;SOP(标准作业程序) 标准作业程序&#xff08;Standard Operating Procedure, SOPs&#xff09;是在有限时间与资源内&#xff0c;为了执行复杂的日常事务所设计的内部程序。从管理学的…