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

作者: hangge 发布时间: 2019-09-02 浏览: 615 次 编辑

    前文介绍了如何用 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

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


(2)执行如下命令可以查看条目的 key 和 value

1
kubectl describe configmap myconfigmap

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

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

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


(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 中。

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


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 的数据。

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


原文链接:https://www.hangge.com/blog/cache/detail_2439.html