创建 Deployment 必须设置 apiVersion(apps/v1)、kind(Deployment)、metadata.name(非空且符合命名规范)三个核心字段,缺一不可;spec.template.spec.containers 中每个容器的 name 和 image 也必须显式声明。

client-go 创建 Deployment 必须设置的三个核心字段
不填 apiVersion、kind、metadata.name,K8s 会直接拒绝创建并返回 400 Bad Request 错误。这三个字段不是可选的“建议”,而是 API server 的硬性校验项。
-
apiVersion必须是apps/v1(v1.16+ 集群不再支持extensions/v1beta1) -
kind必须为Deployment(大小写敏感,不能写成deployment) -
metadata.name不能为空字符串,且只能包含小写字母、数字、连字符(-),长度不超过 63 字符
spec.template.spec.containers 中的 name 和 image 不可省略
Deployment 的 Pod 模板里,每个容器必须显式声明 name 和 image,否则 K8s 会报错:container "xxx" in pod template is missing required field "image"。注意:这不是 client-go 的限制,而是 K8s API server 的 schema 校验逻辑。
-
name是容器在 Pod 内的唯一标识,用于日志、exec、port-forward 等操作,不能和同 Pod 内其他容器重名 -
image建议带明确 tag(如nginx:1.25),避免使用latest—— client-go 不拦截,但生产环境会埋坑 - 如果没设
ports,Pod 能跑起来,但 Service 无法通过 selector 正确关联端口
用 rest.InClusterConfig 连集群时,ServiceAccount 权限常被忽略
在 Pod 内运行 client-go 代码时,rest.InClusterConfig() 可以自动读取 /var/run/secrets/kubernetes.io/serviceaccount/ 下的 token 和 CA,但默认 ServiceAccount 没有任何 RBAC 权限,创建 Deployment 会返回 403 Forbidden。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 必须手动绑定 Role 或 ClusterRole,例如允许对
deployments执行create和get - YAML 示例中不要漏掉
rules[].resources的复数形式:deployments(不是deployment) - 若用
ClusterRoleBinding,注意subjects[].namespace字段仅在RoleBinding中有效,ClusterRoleBinding不认这个字段
调用 Create() 后必须检查 err 和返回对象的 ResourceVersion
client-go 的 clientset.AppsV1().Deployments(namespace).Create(ctx, deploy, metav1.CreateOptions{}) 成功返回 ≠ Deployment 已调度成功。它只表示 API server 接收并持久化了对象。
立即学习“go语言免费学习笔记(深入)”;
- 返回的
*appsv1.Deployment对象里,ResourceVersion是非空字符串才说明写入 etcd 成功 - 如果
err != nil,先看错误类型:errors.IsAlreadyExists(err)可判断是否重名;errors.IsForbidden(err)表示权限不足 - 别跳过
ctx传参 —— 缺失 context 或超时未设,会导致 goroutine 泄漏,尤其在高并发调用时
kubectl apply 成功,转成 Go struct 时漏掉一个 metav1.ObjectMeta 或写错 Spec.Template.Spec.Containers[0].Name,都会让 Create() 直接失败。

















