Golang通过client-go操作Kubernetes资源需先初始化clientset(支持kubeconfig或in-cluster配置),再调用CoreV1Client等执行CRUD;自定义资源用dynamic.Client,监听变化则依赖Informer实现高效List-Watch。

用 Golang 通过 client-go 操作 Kubernetes 资源,核心是构建 REST 客户端、获取配置、实例化对应资源的客户端(如 CoreV1Client),再调用增删改查方法。关键在于正确初始化 clientset,并理解 Scheme、RESTClient 和 Informer 的分工。
初始化 clientset:连接集群
最常用的是从 kubeconfig 文件或 in-cluster 配置加载 REST 配置,再生成 clientset:
- 本地开发:用
rest.InClusterConfig()(Pod 内)或clientcmd.BuildConfigFromFlags("", kubeconfigPath)(本地~/.kube/config) - 调用
kubernetes.NewForConfig(cfg)得到*kubernetes.Clientset,它聚合了所有内置资源的客户端,比如clientset.CoreV1().Pods("default") - 注意:配置中 context 和 user 必须有足够 RBAC 权限,否则 API 调用会返回 403
操作 Pod 等核心资源:CRUD 示例
拿到 clientset 后,按 Group/Version/Resource 分层访问。例如操作 Pod:
- 创建:
clientset.CoreV1().Pods("default").Create(ctx, podObj, metav1.CreateOptions{}),其中podObj是*corev1.Pod类型,需设置ObjectMeta.Name、Spec.Containers等字段 - 获取:
clientset.CoreV1().Pods("default").Get(ctx, "my-pod", metav1.GetOptions{}) - 更新:
clientset.CoreV1().Pods("default").Update(ctx, updatedPod, metav1.UpdateOptions{})(注意要带 ResourceVersion) - 删除:
clientset.CoreV1().Pods("default").Delete(ctx, "my-pod", metav1.DeleteOptions{})
处理自定义资源(CRD):用 DynamicClient
对于非内置资源(如 ingressroute.contour.io),不能直接用 clientset,需用 dynamic.Interface:
- 通过
dynamic.NewForConfig(cfg)初始化 dynamic client - 构造
schema.GroupVersionResource,例如contourv1alpha1.SchemeGroupVersion.WithResource("ingressroutes") - 调用
dynamicClient.Resource(gvr).Namespace("default").Create(...),传入unstructured.Unstructured对象 - 好处是无需为每个 CRD 生成 Go 类型,适合泛化场景;缺点是失去编译期类型检查
监听资源变化:用 Informer 提升效率和可靠性
轮询 API Server 效率低且易丢事件。Informer 封装了 List-Watch 机制,自动重连、缓存本地对象、触发事件回调:
- 用
cache.NewSharedIndexInformer或更常用的cache.NewSharedInformer,传入ListWatch(通常由clientset.CoreV1().Pods("").ListWatch构造) - 注册
AddFunc、UpdateFunc、DeleteFunc处理事件 - 启动前调用
Informer.Run(stopCh),并用cache.WaitForCacheSync确保初始数据同步完成 - 实际项目中常配合
workqueue.RateLimitingInterface做事件去重与限流









