4

我已经被这个错误搞砸了几个小时,但仍然不知道为什么!

我创建了一个简单的 Configmap 和一个分别称为 config1 和 secret1 的 Secret。(这些的 Yaml 文件在这个 repo 中:https ://github.com/hoangphanthai/test )

之后,我创建了一个 Go 文件(上面的 test.go)来创建一个 Statefulset 和一个 Deployment。我希望所有 pod(由 Statefulset 和 Deployment 创建)在其 Env 变量中引用这些 Configmap 和 Secret。Statefulset 和 Deployment 的 Metadata 和 Spec 是相同的,只是它们的名称不同。

但是,只有Statefulset创建成功,而Deployment。错误是“Deployment.apps“d1”无效:spec.template.spec.containers[0].envFrom:无效值:“”:一次不能指定多个字段”

第二次运行,Statefulset 和 Deployment 都没有成功,它显示“无法继续 - 运行时错误:无效的内存地址或 nil 指针取消引用 [信号 SIGSEGV:分段违规] 无法将 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了一下,不知道怎么解决。

如果有人告诉我如何解决这个问题,我将非常感激。

感谢您的阅读。

4

1 回答 1

4

基于此错误:

Deployment.apps“d1”无效:spec.template.spec.containers[0].envFrom:无效值:“”:一次不能指定多个字段“

我建议您应该在代码中尝试以下操作。请注意,仅为 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,
                    },
                },
            },
        }
于 2021-02-03T13:52:21.883 回答