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.pswp.cn/bicheng/80188.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80188.shtml
英文地址,請注明出處:http://en.pswp.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;為了執行復雜的日常事務所設計的內部程序。從管理學的…