我很好奇 ConfigMap 和 Deployment 在 kubernetes 中是如何工作的。
我想使用 ConfigMap 中的值作为我的部署 Pod 的参数。我已经使用不同的图像进行了尝试,并在使用 sh
作为入口点和其他命令作为入口点的容器之间传递 ConfigMap 值作为命令参数时发现了不同的行为。
这是一个示例配置,可以更好地说明我的情况:
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
是一个 docker 镜像,它有一定的 bash 脚本作为打印环境值的入口点。
firstContainer
和 thirdContainer
能够正确打印所有 ConfigMap 值,这意味着所有 value
、gs://Bucket-name/
和 /data
作为输入参数接收。
但是,secondContainer
无法正确打印这些值。我尝试回显收到的参数,结果发现它收到:
${BUCKET_NAME}
,${OUTPUT_DATA}
, and${key}
literally as input arguments instead of the actual values from ConfigMaps.
因此,在观察上述行为后,我的问题如下:
部署和ConfigMap之间有什么关系?有没有 某种指定如何在 k8s pod/部署中创建资源的顺序(例如,是否先加载 ConfigMap,然后加载volumeMounts,然后加载容器或某种顺序)?
${}
和$()
有什么区别?当对入口点与bash
或sh
不同的容器使用${}
时,为什么 ConfigMap 值会以文字字符串形式接收?
谢谢。我们将不胜感激您的帮助。
最佳答案
Kubernetes 只能直接理解括号中的环境变量引用$(VAR)
;例如,参见 Define a Command and Arguments for a Container 中的注释.
args: [ "cmd", "$(BUCKET_NAME)", "$(OUTPUT_DATA)", "$(key)" ]
Kubernetes 本身知道环境变量是什么并进行替换,因此容器以 cmd gs://bucket-name//data key
启动。
command: ["sh"]
args:
- c
- |
echo $key
echo ${BUCKET_NAME}
echo $(OUTPUT_PATH)
Kubernetes 扩展了 $(OUTPUT_PATH)
但不理解任何其他形式的大括号,因此其他字符串按原样发送。不过,由于您是通过 shell 显式运行此命令,因此 $key
和 ${BUCKET_NAME}
都是标准 shell 变量扩展,因此 shell 会扩展这些值。
args: [ "cmd", "${BUCKET_NAME}", "${OUTPUT_DATA}", "${key}" ]
Kubernetes 不会扩展花括号中的内容,并且没有 shell 或其他任何东西来扩展这些变量,因此变量字符串(而不是它们的内容)按原样传递。
关于bash - 部署和ConfigMap之间有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55016997/