创建 Deployment 必须设置 apiVersion(apps/v1)、kind(Deployment)、metadata.name(非空且符合命名规范)三个核心字段,缺一不可;spec.template.spec.containers 中每个容器的 name 和 image 也必须显式声明。
client-go 创建 Deployment 必须设置的三个核心字段
不填
、
、
,K8s 会直接拒绝创建并返回
错误。这三个字段不是可选的“建议”,而是 API server 的硬性校验项。
必须是
(v1.16+ 集群不再支持
)
必须为
(大小写敏感,不能写成
)
不能为空字符串,且只能包含小写字母、数字、连字符(
),长度不超过 63 字符
spec.template.spec.containers 中的 name 和 image 不可省略
Deployment 的 Pod 模板里,每个容器必须显式声明
和
,否则 K8s 会报错:
。注意:这不是 client-go 的限制,而是 K8s API server 的 schema 校验逻辑。
是容器在 Pod 内的唯一标识,用于日志、exec、port-forward 等操作,不能和同 Pod 内其他容器重名
建议带明确 tag(如
),避免使用
—— client-go 不拦截,但生产环境会埋坑
如果没设
,Pod 能跑起来,但 Service 无法通过 selector 正确关联端口
用 rest.InClusterConfig 连集群时,ServiceAccount 权限常被忽略
在 Pod 内运行 client-go 代码时,
可以自动读取
下的 token 和 CA,但默认 ServiceAccount 没有任何 RBAC 权限,创建 Deployment 会返回
。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
必须手动绑定 Role 或 ClusterRole,例如允许对
执行
和
YAML 示例中不要漏掉
的复数形式:
(不是
)
若用
,注意
字段仅在
中有效,
不认这个字段
调用 Create() 后必须检查 err 和返回对象的 ResourceVersion
client-go 的
成功返回 ≠ Deployment 已调度成功。它只表示 API server 接收并持久化了对象。
立即学习
“
go语言免费学习笔记(深入)
”;
返回的
对象里,
是非空字符串才说明写入 etcd 成功
如果
,先看错误类型:
可判断是否重名;
表示权限不足
别跳过
传参 —— 缺失 context 或超时未设,会导致 goroutine 泄漏,尤其在高并发调用时
实际运行中,最常卡住的地方不是代码语法,而是 RBAC 权限配置和 Pod 模板字段缺失。哪怕 YAML 能
成功,转成 Go struct 时漏掉一个
或写错
,都会让
直接失败。
apiVersionkindmetadata.name400 Bad RequestapiVersionapps/v1extensions/v1beta1kindDeploymentdeploymentmetadata.name-nameimagecontainer "xxx" in pod template is missing required field "image"nameimagenginx:1.25latestportsrest.InClusterConfig()/var/run/secrets/kubernetes.io/serviceaccount/403 Forbiddendeploymentscreategetrules[].resourcesdeploymentsdeploymentClusterRoleBindingsubjects[].namespaceRoleBindingClusterRoleBindingclientset.AppsV1().Deployments(namespace).Create(ctx, deploy, metav1.CreateOptions{})*appsv1.DeploymentResourceVersionerr != nilerrors.IsAlreadyExists(err)errors.IsForbidden(err)ctxkubectl applymetav1.ObjectMetaSpec.Template.Spec.Containers[0].NameCreate()