前文介绍了如何用 Secret 为 Pod 提供密码、Token、私钥等敏感数据;而对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap 来实现.
ConfigMap 的创建、使用方式与 Secret 非常类似,主要的不同在于数据以明文的形式存放。下面通过样例进行演示。
十、使用 ConfigMap 管理应用配置信息
1,创建 ConfigMap
与 Secret 一样,ConfigMap 也支持四种创建方式,这里假设我们需要创建一个包含如下信息的 ConfigMap:
config1:xxx
config2:yyy
(1)使用 --from-literal 方式来创建(每个 --from-literal 对应一个信息条目):
1 | kubectl create configmap myconfigmap --from-literal=config1=xxx --from-literal=config2=yyy |
(2)使用 --from-file 方式来创建(每个文件内容对应一个信息条目):
1 2 3 | echo -n xxx > ./config1 echo -n yyy > ./config2 kubectl create configmap myconfigmap --from-file=./config1 --from-file=./config2 |
(3)使用 --from-env-file 方式来创建(文件 env.txt 中每行 Key=Value 对应一个信息条目)
1 2 3 4 5 6 | cat << EOF > env.txt config1=xxx config2=yyy EOF kubectl create configmap myconfigmap --from-env-file=env.txt |
(4)使用 YAML 配置文件方式来创建:
首先创建一个名为 myconfigmap.yml 的配置文件,内容如下:
1 2 3 4 5 6 7 | apiVersion: v1 kind: ConfigMap metadata: name: myconfigmap data: config1: xxx config2: yyy |
然后执行 kubectl apply 命令创建 ConfigMap 即可:
1 | kubectl apply -f myconfigmap.yml |
2,查看 ConfigMap
(1)执行如下命令可以查看存在的 ConfigMap,这里可以看到 myconfigmap 里有两个数据条目:
1 | kubectl get configmap myconfigmap |
(2)执行如下命令可以查看条目的 key 和 value:
1 | kubectl describe configmap myconfigmap |
3,ConfigMap 的使用方式一:通过 Volume 方式
注意:以 Volume 方式使用的 ConfigMap 支持动态更新。也就是说 ConfigMap 更新后,容器中的数据也会更新。
(1)首先我们创建一个 Pod 配置文件 mypod.yml 内容如下:
我们定义了一个名为 foo 的 Volume,来源为 secret myconfigmap。
并且将 foo mount 到容器路径 /etc/foo(指定读写权限为 readOnly)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - image: busybox name: app volumeMounts: - mountPath: /etc/foo name: foo readOnly: true args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 volumes: - name: foo configMap: name: myconfigmap |
(2)Pod 创建以后可以看到 Kubernetes 会在指定的路径 /etc/foo 下为每条配置数据创建一个文件,文件名就是数据条目的 Key(这里是 /etc/foo/config1 和 /etc/foo/config2)。而 Value 则存放在文件中。
1 2 3 4 5 | kubectl apply -f mypod.yml kubectl exec -it mypod sh ls /etc/foo cat /etc/foo/config1 cat /etc/foo/config2 |
(3)我们也可以自定义存放数据的文件名,比如将配置文件进行如下修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - image: busybox name: app volumeMounts: - mountPath: /etc/foo name: foo readOnly: true args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 volumes: - name: foo configMap: name: myconfigmap items: - key: config1 path: my-group/my-config1 - key: config2 path: my-group/my-config2 |
(4)重新创建 Pod 可以发现这时数据将分别存放在 /etc/foo/my-group/my-config1 和 /etc/foo/my-group/my-config2 中。
4,ConfigMap 的使用方式二:通过环境变量方式
注意:虽然环境变量读取 ConfigMap 很方便,但无法支撑 ConfigMap 动态更新。
(1)我们对配置文件内容进行修改,将 ConfigMap 读取到环境变量中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - image: busybox name: app args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 30000 env: - name: CONFIG_1 valueFrom: configMapKeyRef: name: myconfigmap key: config1 - name: CONFIG_2 valueFrom: configMapKeyRef: name: myconfigmap key: config2 |
(2)容器创建后,我们通过环境变量 CONFIG_1 和 CONFIG_2 成功读取到 ConfigMap 的数据。
原文链接:https://www.hangge.com/blog/cache/detail_2439.html