我最新最全的文章都在 南瓜慢说 www.pkslow.com ,欢送大家来喝茶!

1 简介

配置是程序绕不开的话题,在Kubernetes中应用ConfigMap来配置,它实质其实就是键值对。本文解说如何通过5种形式创立ConfigMap,通过4种形式应用ConfigMap

2 创立ConfigMap

按大类可分为两种形式,细分共有五种形式:

(一)kubectl create configmap创立

  • (1)通过命令行参数字面间接创立
  • (2)通过指定文件创建
  • (3)通过指定目录创立
  • (4)通过指定环境变量配置文件创立

(二)yaml文件创建

2.1 通过命令kubectl create configmap创立

2.1.1 从字面创立

命令如下:

$ kubectl create configmap pkslow-literal \--from-literal=pkslow.name=Larry \--from-literal=pkslow.age=18 \--from-literal=pkslow.webSite=www.pkslow.com 

通过参数--from-literal间接指定键值对。这种形式比拟实用于长期测试应用,而且不适宜配置很多的状况。

查看内容如下:

$ kubectl get configmaps pkslow-literal -o yaml

apiVersion: v1data:  pkslow.age: "18"  pkslow.name: Larry  pkslow.webSite: www.pkslow.comkind: ConfigMapmetadata:  name: pkslow-literal  namespace: default

2.1.2 从文件创建

application.yaml文件内容如下:

server:  port: 8080pkslow:  name: Larry  age: 18  webSite: www.pkslow.com

application-uat.yaml文件内容如下:

server:  port: 8080pkslow:  name: LarryDpk  age: 20  webSite: https://www.pkslow.com

命令如下:

$ kubectl create configmap pkslow-file \--from-file=application.yaml \--from-file=application-uat.yaml

通过参数--from-file来指定文件。查看内容如下:

$ kubectl get configmaps pkslow-file -o yaml

apiVersion: v1data:  application-uat.yaml: |-    server:      port: 8080    pkslow:      name: LarryDpk      age: 20      webSite: https://www.pkslow.com  application.yaml: |-    server:      port: 8080    pkslow:      name: Larry      age: 18      webSite: www.pkslow.comkind: ConfigMapmetadata:  name: pkslow-file  namespace: default

能够看到它的key为文件名,因为咱们没有指定,所以默认为文件名。须要指定则如下:

$ kubectl create configmap pkslow-file \--from-file=app=application.yaml \--from-file=uat=application-uat.yaml

2.1.3 从目录创立

命令如下:

$ kubectl create configmap pkslow-directory --from-file=./

如上一种形式没有太大差异,只是--from-file前面的参数是目录,而不是文件。

2.1.4 从环境变量配置文件创立

配置文件pkslow.env内容如下:

PKSLOW_NAME=LarryPKSLOW_AGE=18PKSLOW_WEBSITE=www.pkslow.com

创立命令如下:

$ kubectl create configmap pkslow-env --from-env-file=pkslow.env

查看内容如下:

kubectl get configmaps pkslow-env -o yaml

apiVersion: v1data:  PKSLOW_AGE: "18"  PKSLOW_NAME: Larry  PKSLOW_WEBSITE: www.pkslow.comkind: ConfigMapmetadata:  name: pkslow-env  namespace: default

仔细的敌人应该能发现,这种形式如之前的从文件创建很不一样。它的(key, value)不是(文件名,文件内容),而是文件中一个个的配置。

2.2 通过yaml文件创建

通过yaml文件创建就很惯例了,跟一般的kubernetes资源创立没有什么区别。先筹备yaml文件如下:

apiVersion: v1kind: ConfigMapmetadata:  name: pkslow-yamldata:  PKSLOW_AGE: "18"  PKSLOW_NAME: Larry  PKSLOW_WEBSITE: www.pkslow.com  application-uat.yaml: |-    server:      port: 8080    pkslow:      name: LarryDpk      age: 20      webSite: https://www.pkslow.com  application.yaml: |-    server:      port: 8080    pkslow:      name: Larry      age: 18      webSite: www.pkslow.com

再通过以下文件创建:

$ kubectl apply -f configmap.yaml

3 Pod应用ConfigMap

Pod中应用ConfigMap有以下四种形式:

  1. 在容器命令和参数内
  2. 容器的环境变量
  3. 在只读卷外面增加一个文件,让利用来读取
  4. 编写代码在 Pod 中运行,应用 Kubernetes API 来读取 ConfigMap

其中第1种和第2种形式相似,只是启动命令增加环境变量,所以还是要把ConfigMap映射为容器的环境变量。

第4种形式要拜访API,能够应用相干的库,如Spring Cloud Kubernetes,这里不再介绍。

所以咱们次要解说第2、3种形式。

3.1 Pod的环境变量映射

ConfigMap的值映射到环境变量,次要有两种形式,valueFromenvFrom

3.1.1 valueFrom一一映射

通过valueFrom来配置环境变量,Pod的环境变量名与ConfigMap不用雷同。

apiVersion: v1kind: Podmetadata:  name: pkslow-env-value-fromspec:  containers:    - name: test-container      image: busybox      command: [ "/bin/sh", "-c", "env" ]      env:        - name: PKSLOW_NAME          valueFrom:            configMapKeyRef:              name: pkslow-yaml              key: PKSLOW_NAME        - name: PKSLOW_WEBSITE          valueFrom:            configMapKeyRef:              name: pkslow-yaml              key: PKSLOW_WEBSITE  restartPolicy: Never

查看后果如下:

$ kubectl logs -f pkslow-env-value-from | grep PKSLOWPKSLOW_WEBSITE=www.pkslow.comPKSLOW_NAME=Larry

NOTE:当然也能够把application-uat.yaml这种文件映射成环境变量,但因为文件内容可能是多行的,咱们个别不会这样做。

3.1.2 envFrom全副映射

通过envFrom会把ConfigMap的所有键值对都映射到Pod的环境变量中去。应用如下:

apiVersion: v1kind: Podmetadata:  name: pkslow-env-env-fromspec:  containers:    - name: test-container      image: busybox      command: [ "/bin/sh", "-c", "env" ]      envFrom:        - configMapRef:            name: pkslow-yaml  restartPolicy: Never

查看环境变量如下:

$ kubectl logs -f pkslow-env-env-from PKSLOW_WEBSITE=www.pkslow.comPKSLOW_AGE=18PKSLOW_NAME=Larryapplication.yaml=server:  port: 8080pkslow:  name: Larry  age: 18  webSite: www.pkslow.comapplication-uat.yaml=server:  port: 8080pkslow:  name: LarryDpk  age: 20  webSite: https://www.pkslow.com

显然看起来这种形式更简便,不必每个环境变量都配一遍,但它可能会带来脏数据,就看怎么应用了。

3.2 加载文件

3.2.1 通过volume加载

能够通过volume的形式把ConfigMap加载进Pod,如下:

apiVersion: v1kind: Podmetadata:  name: pkslow-mount-volumespec:  volumes:    - name: config-volume      configMap:        name: pkslow-yaml  containers:    - name: test-container      image: busybox      command: [ "/bin/sh", "-c", "sleep 1000000" ]      imagePullPolicy: IfNotPresent      volumeMounts:        - name: config-volume          mountPath: /data/config  restartPolicy: Never

进入Pod,查看内容如下:

$ kubectl exec -it pkslow-mount-volume -- /bin/sh/ # cd /data/config//data/config # ls -lrttotal 0lrwxrwxrwx    1 root     root            23 Feb 21 17:10 application.yaml -> ..data/application.yamllrwxrwxrwx    1 root     root            27 Feb 21 17:10 application-uat.yaml -> ..data/application-uat.yamllrwxrwxrwx    1 root     root            21 Feb 21 17:10 PKSLOW_WEBSITE -> ..data/PKSLOW_WEBSITElrwxrwxrwx    1 root     root            18 Feb 21 17:10 PKSLOW_NAME -> ..data/PKSLOW_NAMElrwxrwxrwx    1 root     root            17 Feb 21 17:10 PKSLOW_AGE -> ..data/PKSLOW_AGE/data/config # cat PKSLOW_WEBSITEwww.pkslow.com/data/config # cat application.yamlserver:  port: 8080pkslow:  name: Larry  age: 18  webSite: www.pkslow.com

如果只想要ConfigMap的局部内容,并自定义文件名,可通过items来配置,如下:

apiVersion: v1kind: Podmetadata:  name: pkslow-mount-volumespec:  volumes:    - name: config-volume      configMap:        name: pkslow-yaml        items:          - key: application.yaml            path: app.yaml          - key: application-uat.yaml            path: uat.yaml  containers:    - name: test-container      image: busybox      command: [ "/bin/sh", "-c", "sleep 1000000" ]      imagePullPolicy: IfNotPresent      volumeMounts:        - name: config-volume          mountPath: /data/config  restartPolicy: Never

3.2.2 通过subPath加载

通过配置subPath字段,把文件一个一个加载到Pod中去。

apiVersion: v1kind: Podmetadata:  name: pkslow-mount-subpathspec:  volumes:    - name: config-volume      configMap:        name: pkslow-yaml  containers:    - name: test-container      image: busybox      command: [ "/bin/sh", "-c", "sleep 1000000" ]      imagePullPolicy: IfNotPresent      volumeMounts:        - name: config-volume          mountPath: /data/config/dev.yaml          subPath: application.yaml        - name: config-volume          mountPath: /data/config/uat.yaml          subPath: application-uat.yaml  restartPolicy: Never

查看内容如下:

$ kubectl exec -it pkslow-mount-subpath -- /bin/sh/ # cd /data/config//data/config # ls -lrttotal 8-rw-r--r--    1 root     root            89 Feb 21 17:31 uat.yaml-rw-r--r--    1 root     root            78 Feb 21 17:31 dev.yaml/data/config # cat dev.yaml server:  port: 8080pkslow:  name: Larry  age: 18  webSite: www.pkslow.com  /data/config # cat uat.yaml server:  port: 8080pkslow:  name: LarryDpk  age: 20  webSite: https://www.pkslow.com

4 不可变的ConfigMap

能够禁止批改ConfigMap,益处有:

  • 爱护利用,使之免受意外(不想要的)更新所带来的负面影响。
  • 通过大幅升高对 kube-apiserver 的压力晋升集群性能,这是因为零碎会敞开 对已标记为不可变更的 ConfigMap 的监督操作。

此性能个性由 ImmutableEphemeralVolumes 个性门控 来管制。你能够通过将 immutable 字段设置为 true 创立不可变更的 ConfigMap。 例如:

apiVersion: v1kind: ConfigMapmetadata:  ...data:  ...immutable: true

一旦某 ConfigMap 被标记为不可变更,则 无奈 逆转这一变动,也无奈更改 databinaryData 字段的内容。你只能删除并重建 ConfigMap。 因为现有的 Pod 会保护一个对已删除的 ConfigMap 的挂载点,倡议从新创立 这些 Pods。

5 总结

SecretConfigMap的创立与应用也是相似的,不再具体介绍了。

代码请查看:https://github.com/LarryDpk/p...


欢送关注微信公众号<南瓜慢说>,将继续为你更新...

多读书,多分享;多写作,多整顿。