返回 导航

Docker / K8s

hangge.com

K8s - Kubernetes使用详解10(使用ConfigMap管理应用配置信息)

作者:hangge | 2019-08-08 08:10
    前文介绍了如何用 Secret Pod 提供密码、Token、私钥等敏感数据;而对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap 来实现.
    ConfigMap 的创建、使用方式与 Secret 非常类似,主要的不同在于数据以明文的形式存放。下面通过样例进行演示。

十、使用 ConfigMap 管理应用配置信息

1,创建 ConfigMap

Secret 一样,ConfigMap 也支持四种创建方式,这里假设我们需要创建一个包含如下信息的 ConfigMap
  • config1:xxx
  • config2:yyy
(1)使用 --from-literal 方式来创建(每个 --from-literal 对应一个信息条目):
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 配置文件方式来创建:
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  config1: xxx
  config2: yyy
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 内容如下:
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 的数据。
评论

全部评论(0)

回到顶部