Мне интересно, как ConfigMap и Deployment работают в kubernetes.
Я хотел использовать значения в ConfigMap в качестве аргументов для моих модулей развертывания. Я пробовал это с разными изображениями и обнаружил разное поведение при передаче значения ConfigMap в качестве аргументов команды между контейнерами, которые используют sh
в качестве точки входа, и другими командами в качестве точки входа.
Вот пример конфигурации, чтобы лучше проиллюстрировать мой случай:
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-envs
data:
key: "value"
BUCKET_NAME: "gs://bucket-name/"
OUTPUT_PATH: "/data"
deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
spec:
template:
containers:
- name: firstContainer
image: busybox
command: ["sh"]
args:
- c
- |
echo $key
echo ${BUCKET_NAME}
echo $(OUTPUT_PATH)
envFrom:
- configMapRef:
name: app-envs
- name: secondContainer
image: someImage
args: [ "cmd", "${BUCKET_NAME}", "${OUTPUT_DATA}", "${key}" ]
envFrom:
- configMapRef:
name: app-envs
- name: thirdContainer
image: someImage
args: [ "cmd", "$(BUCKET_NAME)", "$(OUTPUT_DATA)", "$(key)" ]
envFrom:
- configMapRef:
name: app-envs
someImage
- это изображение докера, в котором в качестве точки входа используется определенный сценарий bash, который печатает значения среды.
firstContainer
и thirdContainer
способны правильно печатать все значения ConfigMap, то есть все value
, gs://bucket-name/
и /data
принимаются в качестве входных аргументов.
Однако secondContainer
не может правильно распечатать эти значения. Я попытался повторить полученные аргументы, и оказалось, что он получает:
${BUCKET_NAME}
, ${OUTPUT_DATA}
и ${key}
буквально в качестве ввода
аргументы вместо фактических значений из ConfigMaps.
Итак, после наблюдения вышеуказанного поведения, вот мои вопросы:
Какая связь между развертыванием и ConfigMap? Есть
какой-то порядок, который определяет, как создаются ресурсы в модуле / развертывании k8s (например, загружается ли сначала ConfigMap, затем volumeMounts, а затем контейнер или какой-либо вид заказов)?
В чем разница между ${}
и $()
? Почему значения ConfigMap принимаются в виде буквенных строк при использовании ${}
для контейнера с точкой входа, отличной от bash
или sh
?
Спасибо. Буду признателен за вашу помощь.