Usando Kubernetes 1.19.3, inicializo los valores de las variables env usando 3 formas diferentes:
env con clave/valor explícito en la definición del podenvFrom usando configMapRef y secretRef Cuando se duplica un nombre de clave, como se muestra en el siguiente ejemplo, DUPLIK1 y DUPLIK2 se definen varias veces con diferentes valores.
¿Cuál es la regla de precedencia que usa Kubernetes para asignar el valor final a la variable?
# create some test Key/Value configs and Key/Value secrets kubectl create configmap myconfigmap --from-literal=DUPLIK1=myConfig1 --from-literal=CMKEY1=CMval1 --from-literal=DUPLIK2=FromConfigMap -n mydebugns kubectl create secret generic mysecret --from-literal=SECRETKEY1=SECval1 --from-literal=SECRETKEY2=SECval2 --from-literal=DUPLIK2=FromSecret -n mydebugns # create a test pod cat <<EOF | kubectl apply -n mydebugns -f - apiVersion: v1 kind: Pod metadata: name: pod1 spec: containers: - name: container1 image: busybox command: [ "/bin/sh", "-c", "env" ] env: - name: DUPLIK1 value: "Key/Value defined in field env" envFrom: - configMapRef: name: myconfigmap - secretRef: name: mysecret restartPolicy: Never EOFMostrar valores de variables de entorno. El resultado es determinista. Eliminar recursos + recrear siempre termina con el mismo resultado.
kubectl logs pod/pod1 -n mydebugns CMKEY1=CMval1 DUPLIK1=Key/Value defined in field env DUPLIK2=FromSecret SECRETKEY1=SECval1 SECRETKEY2=SECval2Recursos de prueba de limpieza
kubectl delete pod/pod1 -n mydebugns kubectl delete cm/myconfigmap -n mydebugns kubectl delete secret/mysecret -n mydebugnsDe los documentos de Kubernetes:
envVar: Lista de variables de entorno para establecer en el contenedor. No se puede actualizar.
envFrom: lista de fuentes para completar las variables de entorno en el contenedor. Las claves definidas dentro de una fuente deben ser un C_IDENTIFIER. Todas las claves no válidas se informarán como un evento cuando se inicie el contenedor. Cuando una clave existe en varias fuentes, tendrá prioridad el valor asociado con la última fuente. Los valores definidos por un Env con una clave duplicada tendrán prioridad. No se puede actualizar.
El enlace anterior establece claramente que env tendrá prioridad sobre envFrom y no se puede actualizar.
Además, cuando una clave a la que se hace referencia está presente en varios recursos, el valor asociado con la última fuente anulará todos los valores anteriores.
Según lo anterior, el resultado que está viendo es el comportamiento esperado:
DUPLIK1 se agrega como campo env y, por lo tanto, no se puede actualizarDUPLIK2 se agrega como envFrom y por lo tanto, el del secreto tiene prioridad tal como se define en el último