K8s - Kubernetes使用详解10(使用ConfigMap管理应用配置信息)
前文介绍了如何用 Secret 为 Pod 提供密码、Token、私钥等敏感数据;而对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap 来实现.
(2)使用 --from-file 方式来创建(每个文件内容对应一个信息条目):
(3)使用 --from-env-file 方式来创建(文件 env.txt 中每行 Key=Value 对应一个信息条目)
(4)使用 YAML 配置文件方式来创建:
(2)执行如下命令可以查看条目的 key 和 value:
(2)Pod 创建以后可以看到 Kubernetes 会在指定的路径 /etc/foo 下为每条配置数据创建一个文件,文件名就是数据条目的 Key(这里是 /etc/foo/config1 和 /etc/foo/config2)。而 Value 则存放在文件中。
(3)我们也可以自定义存放数据的文件名,比如将配置文件进行如下修改:
(4)重新创建 Pod 可以发现这时数据将分别存放在 /etc/foo/my-group/my-config1 和 /etc/foo/my-group/my-config2 中。
(2)容器创建后,我们通过环境变量 CONFIG_1 和 CONFIG_2 成功读取到 ConfigMap 的数据。
ConfigMap 的创建、使用方式与 Secret 非常类似,主要的不同在于数据以明文的形式存放。下面通过样例进行演示。
十、使用 ConfigMap 管理应用配置信息
1,创建 ConfigMap
与 Secret 一样,ConfigMap 也支持四种创建方式,这里假设我们需要创建一个包含如下信息的 ConfigMap:
(1)使用 --from-literal 方式来创建(每个 --from-literal 对应一个信息条目):
- config1:xxx
- config2:yyy
kubectl create configmap myconfigmap --from-literal=config1=xxx --from-literal=config2=yyy
(2)使用 --from-file 方式来创建(每个文件内容对应一个信息条目):
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 对应一个信息条目)
cat << EOF > env.txt config1=xxx config2=yyy EOF kubectl create configmap myconfigmap --from-env-file=env.txt
(4)使用 YAML 配置文件方式来创建:
- 首先创建一个名为 myconfigmap.yml 的配置文件,内容如下:
apiVersion: v1 kind: ConfigMap metadata: name: myconfigmap data: config1: xxx config2: yyy
- 然后执行 kubectl apply 命令创建 ConfigMap 即可:
kubectl apply -f myconfigmap.yml
2,查看 ConfigMap
(1)执行如下命令可以查看存在的 ConfigMap,这里可以看到 myconfigmap 里有两个数据条目:
kubectl get configmap myconfigmap

(2)执行如下命令可以查看条目的 key 和 value:
kubectl describe configmap myconfigmap

3,ConfigMap 的使用方式一:通过 Volume 方式
注意:以 Volume 方式使用的 ConfigMap 支持动态更新。也就是说 ConfigMap 更新后,容器中的数据也会更新。
(1)首先我们创建一个 Pod 配置文件 mypod.yml 内容如下:- 我们定义了一个名为 foo 的 Volume,来源为 secret myconfigmap。
- 并且将 foo mount 到容器路径 /etc/foo(指定读写权限为 readOnly)
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 则存放在文件中。
kubectl apply -f mypod.yml kubectl exec -it mypod sh ls /etc/foo cat /etc/foo/config1 cat /etc/foo/config2

(3)我们也可以自定义存放数据的文件名,比如将配置文件进行如下修改:
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 读取到环境变量中。
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 的数据。
