bash - 部署和ConfigMap之间有什么关系?

标签 bash shell docker kubernetes google-kubernetes-engine

我很好奇 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 脚本作为打印环境值的入口点。


firstContainerthirdContainer 能够正确打印所有 ConfigMap 值,这意味着所有 valuegs://Bucket-name//data 作为输入参数接收。

但是,secondContainer 无法正确打印这些值。我尝试回显收到的参数,结果发现它收到:

${BUCKET_NAME}, ${OUTPUT_DATA}, and ${key} literally as input arguments instead of the actual values from ConfigMaps.

因此,在观察上述行为后,我的问题如下:

  1. 部署和ConfigMap之间有什么关系?有没有 某种指定如何在 k8s pod/部署中创建资源的顺序(例如,是否先加载 ConfigMap,然后加载volumeMounts,然后加载容器或某种顺序)?

  2. ${}$() 有什么区别?当对入口点与 bashsh 不同的容器使用 ${} 时,为什么 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/

相关文章:

bash - 监控管道退出代码

linux - 在 Unix shell 脚本中将单个记录拆分为多个记录

bash - 通过 Bash 打开与 Arduino 的串行连接

bash - bash 脚本出错时触发函数

docker - 无法在 docker 容器 : Permission denied 内运行 Sonar 扫描仪

bash - 当分支和标签都指向同一个提交时,如何引用该分支?

python - Windows:从可点击图标运行 python 命令

bash - 使用 bash 自动回答 Graphite 安装的 django sync 提示

python-2.7 - 构建一个Docker文件

docker - 为什么加一个用户到一个组会增加这个centos :latest Docker image to 22. 7GB的大小?