
client-go Clientset实战3步掌握Deployment的创建、更新与删除【免费下载链接】client-goGo client for Kubernetes.项目地址: https://gitcode.com/gh_mirrors/cl/client-goclient-go 是 Kubernetes 官方的 Go 语言客户端库Go client for Kubernetes几乎所有 K8s 控制器controller的底层都依赖它。本文将带你使用 client-go 的Clientset以官方示例为基础用 3 步完成 Deployment 的创建、更新与删除CRUD并讲清每步背后的原理与常见坑是一份面向新手、即学即用的实战指南。为什么选择 Clientsetclient-go 提供了两种主要客户端模型选型先搞清楚客户端特点适用场景kubernetes.Clientset编译期类型安全方法调用即 API 请求操作内置资源Pod、Deployment 等本文主角dynamic.DynamicClient对象以unstructured表示运行时发现操作 CRD 自定义资源Clientset 内部为每个 API Group/Version 暴露了类型安全的方法例如访问 Deployment 的完整接口定义在 kubernetes/typed/apps/v1/deployment.goCreate、Get、List、Update、Delete、Patch、Watch、Apply一应俱全。 想深入了解 Clientset 与 DynamicClient 的架构分层可阅读 ARCHITECTURE.md。第 0 步构建能连接集群的 Clientset一切操作的起点是把 kubeconfig 转成rest.Config再构建 Clientset。官方示例 examples/create-update-delete-deployment/main.go 中的核心只有 4 行见 main.go#L55-L62config, _ : clientcmd.BuildConfigFromFlags(, *kubeconfig) clientset, _ : kubernetes.NewForConfig(config)两种常见取配置方式集群外运行开发机、CI用 tools/clientcmd/ 解析~/.kube/config即上面的BuildConfigFromFlags集群内运行Pod 里的控制器一行rest.InClusterConfig()参考 examples/in-cluster-client-configuration/main.go#L38-L47。拿到 Clientset 后按「API 组 → 资源 → 命名空间」三级取值即可得到 Deployment 操作句柄main.go#L64deploymentsClient : clientset.AppsV1().Deployments(default)第 1 步Create 创建 Deployment先用 Go 结构体描述一个 2 副本的 nginx Deployment示例代码见 main.go#L66-L100然后一个Create调用提交到 API Serverresult, err : deploymentsClient.Create(ctx, deployment, metav1.CreateOptions{})要点提醒Spec.Selector和 Pod 模板的 Labels 必须匹配示例统一用app: demo否则创建会被拒绝返回的result是服务端视角的对象包含了集群自动填充的ResourceVersion、UID等字段——请保留它第 2 步要用创建成功后可用kubectl get pods验证。第 2 步Update 更新 Deployment重点正确处理冲突更新Deployment最大的坑是409 ConflictK8s 用乐观锁ResourceVersion做并发控制如果你提交的是旧版本对象而期间别人或控制器改过它更新就会被拒绝。client-go 给出的推荐做法是「Get 最新 → 修改 → Update冲突则重试」封装在 util/retry/util.go 的RetryOnConflict中它带指数退避避免打爆 API Server。官方示例main.go#L126-L138retry.RetryOnConflict(retry.DefaultRetry, func() error { result, _ : deploymentsClient.Get(ctx, demo-deployment, metav1.GetOptions{}) result.Spec.Replicas ptr.Toint32 // 缩容到 1 副本 result.Spec.Template.Spec.Containers[0].Image nginx:1.13 // 升级镜像 _, err : deploymentsClient.Update(ctx, result, metav1.UpdateOptions{}) return err })⚠️ 新手常犯错误直接Update自己最初的deployment变量类似kubectl replace会覆盖掉他人的修改。一定要像上面那样每次重试都先Get最新版本再改。第 3 步Delete 删除 Deployment删除只需名字和传播策略main.go#L158-L164policy : metav1.DeletePropagationForeground err : deploymentsClient.Delete(ctx, demo-deployment, metav1.DeleteOptions{PropagationPolicy: policy})Foreground先删 Deployment确认其下属资源ReplicaSet、Pod清理完毕后才返回若中途退出程序可用kubectl delete deploy demo-deployment手动兜底清理见 examples/create-update-delete-deployment/README.md。常见错误速查表现象原因解决办法the server could not find the requested resource集群版本过低 v1.6或资源名/组写错用kubectl version检查版本409 Conflict提交的ResourceVersion过期用retry.RetryOnConflict包裹「Get→改→Update」404 Not Found资源不存在用errors.IsNotFound(err)做程序化判断更新后镜像没变模板 Labels/Selector 未同步检查 Pod 模板与Spec.Selector一致性跑一跑完整示例与预期输出上面 3 步的完整可运行程序就在 examples/create-update-delete-deployment/每个操作之间会暂停等你按回车方便你一边跑一边用kubectl观察集群变化。预期输出如下Creating deployment... Created deployment demo-deployment. - Press Return key to continue. Updating deployment... Updated deployment... Listing deployments in namespace default: * demo-deployment (1 replicas) Deleting deployment... Deleted deployment.总结3 步速记卡建连接clientcmd.BuildConfigFromFlags或rest.InClusterConfig→kubernetes.NewForConfig建资源Create提交 Go 结构体保存返回的服务端对象改资源RetryOnConflict内「Get 最新 → 修改 → Update」绝不动用旧版本删资源Delete并指定传播策略。掌握这条主线后把Deployments换成Pods、StatefulSets等任意内置资源参考 kubernetes/typed/ 下各 API 组即可管理集群中的全部类型化资源进阶内容如工作队列、Informer 控制器模式可继续探索 examples/README.md。【免费下载链接】client-goGo client for Kubernetes.项目地址: https://gitcode.com/gh_mirrors/cl/client-go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考