使用Golang客户端创建Kubernetes Secret遇名称必填错误
问题分析与解决方案
嘿,我一眼就揪出了问题的核心——你的代码逻辑里犯了一个很容易忽略的变量误用错误!
问题根源
看你这段创建Secret的代码:
secret, err = d.serviceClient.Secrets(namespace).Get(secret.Name, metav1.GetOptions{}) if err != nil { // 若未找到则创建新Secret if _, err := d.serviceClient.Secrets(namespace).Create(secret); err != nil { return errors.Wrap(err, "error creating user secrets") } }
这里有两个致命的逻辑漏洞:
- 调用
Get方法时,你用了secret.Name作为查询参数,但此时secret变量根本没被正确初始化(至少从你提供的代码片段里看不到它的前置赋值),这导致你在查询一个空名称的Secret,必然返回“未找到”的错误。 - 当Get失败进入创建分支后,你直接传入
secret变量调用Create,但这个secret是Get失败后的返回值——大概率是一个零值的Secret对象,它的metadata.name是空的,这才触发了Kubernetes的校验错误。
而你写的generateDatabaseSecret函数完全没被用到!你生成了正确的Secret实例,但代码里根本没把它传给Create方法,这就难怪报错信息和你打印的JSON不一致了。
修正后的代码
你需要先调用generateDatabaseSecret生成正确的Secret实例,再用它来做查询和创建操作:
// 先生成你想要的Secret实例(记得传入对应的Deployment对象) targetSecret := generateDatabaseSecret(yourDeploymentInstance) // 用生成的Secret的名称去查询 secret, err := d.serviceClient.Secrets(namespace).Get(targetSecret.Name, metav1.GetOptions{}) if err != nil { // 未找到时,使用生成的targetSecret来创建 if _, err := d.serviceClient.Secrets(namespace).Create(targetSecret); err != nil { return errors.Wrap(err, "error creating user secrets") } }
另外,顺便检查下你的API版本导入是否一致:确保generateDatabaseSecret返回的*v1.Secret和serviceClient使用的Secret类型是同一个(比如都是k8s.io/api/core/v1下的类型),避免因为版本不一致导致的隐性问题。从你打印的JSON来看,生成的Secret结构是完全正确的,问题就出在逻辑上没用到这个正确的实例。
内容的提问来源于stack exchange,提问作者Ewan Valentine
相关产品推荐
相关产品推荐

