4

私はこのバグに何時間も悩まされてきましたが、まだ理由がわかりません!

それぞれ config1 と secret1 という単純な Configmap と Secret を作成しました。(これらの Yaml ファイルは、このリポジトリ内にあります: https://github.com/hoangphanthai/test )

その後、Statefulset と Deployment を作成するために Go ファイル (上記の test.go) を作成しました。すべての Pod (Statefulset と Deployment によって作成されたもの) が Env 変数でこれらの Configmap と Secret を参照するようにします。Statefulset と Deployment の両方のメタデータと仕様は、名前を除いて同一です。

ただし、Statefulset のみが正常に作成されますが、Deployment. エラーは「Deployment.apps "d1" が無効です: spec.template.spec.containers[0].envFrom: 無効な値: "": 一度に複数のフィールドが指定されていない可能性があります」

2 回目の実行では、Statefulset と Deployment の両方が成功せず、「Failed to continue - runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation] Unable to propogate EXC_BAD_ACCESS signal to target process and panic ( httpsを参照)」が表示されます。 ://github.com/go-delve/delve/issues/852 ) 最後の既知の即時スタックトレース (ゴルーチン ID 1):""

重要なコードは次のとおりです (完全なコードは、リポジトリの 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) を介して展開を適用しようとしましたが、うまくいきました。

私もそれをグーグルで調べましたが、それを解決する方法がわかりません。

誰かがこれを修正する方法を教えてくれたら、とても感謝しています。

お読みいただきありがとうございます。

4

1 に答える 1

4

このエラーに基づいて:

Deployment.apps "d1" は無効です: spec.template.spec.containers[0].envFrom: 無効な値: "": 一度に複数のフィールドを指定することはできません"

コードで次のことを試すことをお勧めします。EnvFromSource タイプには 1 つのフィールドのみが指定されており、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 に答える