Kubernetes 示例小册

--- apiVersion: v1 kind: ConfigMap metadata: name: example-volume-config data: config.json: | { "foo": "bar", "baz": "qux" } .env: | color_info=gray color_warn=yellow --- apiVersion: v1 kind: ConfigMap metadata: name: example-env-config data: FOO_VALUE: bar Baz: qux URL: <https://zuolan.me> url: <https://zuolan.me/test> --- apiVersion: v1 kind: ConfigMap metadata: name: example-env2-config data: Foo: from_env2 --- apiVersion: v1 kind: Pod metadata: name: volumes-configmap-pod spec: containers: - name: configmap-example-pod command: [ "sleep", "3600" ] image: ubuntu:20.04 env: - name: FOO_VALUE valueFrom: configMapKeyRef: name: example-env2-config key: Foo envFrom: - configMapRef: name: example-env-config volumeMounts: - mountPath: /config name: example-config-volume volumes: - name: example-config-volume configMap: defaultMode: 420 name: example-volume-config

使用方式

ConfigMap 有两种常见使用形式, 一种是把文件挂载到容器中, 另一种是以环境变量的形式调用 (大小写敏感).

挂载 ConfigMap 为文件

在这种方式中, 需要配置 Volumes 和容器中的 volumeMount:
spec: containers: - name: configmap-example-pod .... volumeMounts: - mountPath: /config name: example-config-volume volumes: - name: example-config-volume configMap: defaultMode: 420 name: example-volume-config
除了

通过环境变量调用

在这种方式中, 又有两种不一样的形式 (分别是 envFrom 和 valueFrom), 其中 envFrom 是读取完整的 ConfigMap 文件, 把整个 ConfigMap 的键值对 (参考例子中的 example-env-config) 导入容器中, 成为容器环境变量.
另一种 valueFrom 是指定导入 ConfigMap 中的某一部分, 只有指定了 key 的键值对会导入容器中, 并且 容器中的变量名是在 YAML 中指定的 (比如示例中的 FOO_VALUE).
最后 valueFrom 优先度会高于 envFrom.
spec: containers: - name: configmap-example-pod command: [ "sleep", "3600" ] image: ubuntu:20.04 env: - name: FOO_VALUE valueFrom: configMapKeyRef: name: example-env2-config key: Foo envFrom: - configMapRef: name: example-env-config

热更新小细节

以 volumeMount 形式挂载的配置文件可以热更新, 当你修改 ConfigMap 之后, 容器内的配置文件会在十余秒之后更新. 而以 env 形式挂载的配置文件是一次性的, 更新 ConfigMap 之后要重启 Pod 才能使新配置生效.
而且如果使用 ConfigMap 的 subPath 方式挂载为文件, 也是不会自动更新的.

ConfigMap 常见问题

  1. 如何挂载一个 ConfigMap 到非空目录?
  1. 如何修改 ConfigMap 的权限?
  1. 为什么有时候 ConfigMap 会缩成一行?
有时候通过 kubectl get -o yaml 看到的 ConfigMap 内容会缩成一行:
apiVersion: v1 data: test.yaml: "\\n\\techo \\"a\\"\\n echo \\"b\\" \\n" kind: ConfigMap metadata: name: test
造成这种现象的原因通常是因为文件中某一行结尾有空格, 或者中间有特殊字符. 可以用 vim 的 :set invlist 来查看人眼不可视的空格.
对于本文内容有任何疑问, 可与我联系.