在 Golang K8s 客户端中为 Deployment 设置 ConfigMapRef 和 SecretRef
Setting ConfigMapRef and SecretRef for Deployment in Golang K8s client
我已经被这个错误困扰了几个小时,但仍然不知道为什么!
我创建了一个简单的 Configmap 和一个分别名为 config1 和 secret1 的 Secret。
(这些的 Yaml 文件在此存储库中:https://github.com/hoangphanthai/test)
之后,我创建了一个 Go 文件(上面的 test.go)来创建一个 Statefulset 和一个 Deployment。我希望所有 pods(由 Statefulset 和 Deployment 创建)在其 Env 变量中引用这些 Configmap 和 Secret。
Statefulset 和 Deployment 的 Metadata 和 Spec 除了名称不同外完全相同。
但是只有Statefulset创建成功,Deployment.错误是“Deployment.apps“d1”无效:spec.template.spec.containers[0].envFrom:无效值:“”:一次不能指定多个字段
第二个运行,Statefulset和Deployment都不成功,显示“Failed to continue - 运行time error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation ]
无法将 EXC_BAD_ACCESS 信号传播到目标进程和恐慌(参见 https://github.com/go-delve/delve/issues/852)
最后已知的即时堆栈跟踪(goroutine id 1):“”
重要的代码如下(完整代码在 Repo 的 test.go 文件中):
deployment := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: "d1",
},
Spec: appsv1.DeploymentSpec{
Replicas: &repNo,
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": "postgres",
},
},
Template: apiv1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": "postgres",
},
},
Spec: apiv1.PodSpec{
Containers: containerList,
},
},
},
}
statefulset := &appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Name: "s1",
},
Spec: appsv1.StatefulSetSpec{
Replicas: &repNo,
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": "postgres",
},
},
Template: apiv1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": "postgres",
},
},
Spec: apiv1.PodSpec{
Containers: containerList,
},
},
},
}
起初我认为不可能同时设置 ConfigMapRef 和 SecretRef 但后来我尝试通过 yaml 应用部署(dep.yaml 以上)这与代码中的完全相同但它奏效了。
我也google了一下,不知道怎么解决。
如果有人告诉我如何解决这个问题,我将不胜感激。
感谢您的阅读。
基于这个错误:
Deployment.apps "d1" is invalid:
spec.template.spec.containers[0].envFrom: Invalid value: "": may not
have more than one field specified at a time"
我建议您在代码中尝试以下操作。请注意,只为 EnvFromSource 类型指定了一个字段,它是 ConfigMapRef 或 SecretRef,但不会同时是:
EnvFrom: []apiv1.EnvFromSource{
apiv1.EnvFromSource {
ConfigMapRef: &apiv1.ConfigMapEnvSource{
LocalObjectReference: apiv1.LocalObjectReference{
Name: configMapName,
},
},
},
apiv1.EnvFromSource {
SecretRef: &apiv1.SecretEnvSource{
LocalObjectReference: apiv1.LocalObjectReference{
Name: secretName,
},
},
},
}
我已经被这个错误困扰了几个小时,但仍然不知道为什么!
我创建了一个简单的 Configmap 和一个分别名为 config1 和 secret1 的 Secret。 (这些的 Yaml 文件在此存储库中:https://github.com/hoangphanthai/test)
之后,我创建了一个 Go 文件(上面的 test.go)来创建一个 Statefulset 和一个 Deployment。我希望所有 pods(由 Statefulset 和 Deployment 创建)在其 Env 变量中引用这些 Configmap 和 Secret。 Statefulset 和 Deployment 的 Metadata 和 Spec 除了名称不同外完全相同。
但是只有Statefulset创建成功,Deployment.错误是“Deployment.apps“d1”无效:spec.template.spec.containers[0].envFrom:无效值:“”:一次不能指定多个字段
第二个运行,Statefulset和Deployment都不成功,显示“Failed to continue - 运行time error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation ] 无法将 EXC_BAD_ACCESS 信号传播到目标进程和恐慌(参见 https://github.com/go-delve/delve/issues/852) 最后已知的即时堆栈跟踪(goroutine id 1):“”
重要的代码如下(完整代码在 Repo 的 test.go 文件中):
deployment := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: "d1",
},
Spec: appsv1.DeploymentSpec{
Replicas: &repNo,
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": "postgres",
},
},
Template: apiv1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": "postgres",
},
},
Spec: apiv1.PodSpec{
Containers: containerList,
},
},
},
}
statefulset := &appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Name: "s1",
},
Spec: appsv1.StatefulSetSpec{
Replicas: &repNo,
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": "postgres",
},
},
Template: apiv1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": "postgres",
},
},
Spec: apiv1.PodSpec{
Containers: containerList,
},
},
},
}
起初我认为不可能同时设置 ConfigMapRef 和 SecretRef 但后来我尝试通过 yaml 应用部署(dep.yaml 以上)这与代码中的完全相同但它奏效了。
我也google了一下,不知道怎么解决。
如果有人告诉我如何解决这个问题,我将不胜感激。
感谢您的阅读。
基于这个错误:
Deployment.apps "d1" is invalid: spec.template.spec.containers[0].envFrom: Invalid value: "": may not have more than one field specified at a time"
我建议您在代码中尝试以下操作。请注意,只为 EnvFromSource 类型指定了一个字段,它是 ConfigMapRef 或 SecretRef,但不会同时是:
EnvFrom: []apiv1.EnvFromSource{
apiv1.EnvFromSource {
ConfigMapRef: &apiv1.ConfigMapEnvSource{
LocalObjectReference: apiv1.LocalObjectReference{
Name: configMapName,
},
},
},
apiv1.EnvFromSource {
SecretRef: &apiv1.SecretEnvSource{
LocalObjectReference: apiv1.LocalObjectReference{
Name: secretName,
},
},
},
}