68803c1dd5db7d6de0934f1ec291c653.gif

ConfigMap:用于将应用的配置信息与程序的分离。这种方式不仅可以实现应用程序被的复用,而且还可以通过不同的配置实现更灵活的功能。在创建容器时,用户可以将应用程序打包为容器镜像后,通过环境变量或者外接挂载文件的方式进行配置注入。

一、创建ConfigMap

1、使用kubectl命令创建

[root@k8s-master ~]# mkdir /data[root@k8s-master data]# touch my.cnf[root@k8s-master data]# touch php.ini[root@k8s-master data]# touch nginx.conf

(1)指定目录

[root@k8s-master ~]# kubectl create configmap test-map --from-file=/data
6d8b5380fa39df5e17e6f446fc429ed3.png
[root@k8s-master ~]# kubectl get configmaps test-map
fd3cfdd6989a5889a9ef80306acf67e6.png
[root@k8s-master ~]# kubectl describe configmaps test-map
621acb48b377f8b3b962cacc24cf6dfe.png
[root@k8s-master ~]# kubectl get configmaps test-map -o yaml
afb91e8a14a708b29f7a37818334e124.png

(2)指定文件

[root@k8s-master ~]# kubectl create configmap test-map --from-file=/data/my.cnf --from-file=/data/php.ini  --from-file=/data/nginx.conf
05ecad652b2807684360ad19610d194b.png

(3)自定义值(指定字符串)

[root@k8s-master ~]# kubectl create configmap test-map --from-literal=port=3306 --from-literal=datadir=/data/mysql

--from-literal:在命令中定义字面值

例如:

port=3306

datadir=/data/mysql

fcd5b3a2d70bcfb7d97d7cffcc671118.png

2、使用yaml配置文件创建

[root@k8s-master ~]# vim test-map.yaml添加:apiVersion: v1kind: ConfigMapmetadata:  name: test-mapdata:  poth: /usr/sbin/nginx -t
4c73186941f1f7e3cc84f7fcb065b520.png
[root@k8s-master ~]# kubectl apply -f test-map.yaml
b845c0256684471efddca2faf7978705.png
[root@k8s-master ~]# kubectl get configmap
c2aa755b53b62b438d08d0f2dad34428.png
[root@k8s-master ~]# kubectl describe configmaps test-map
a549fc5543bcea47680db546d8afc132.png
[root@k8s-master ~]# kubectl get configmaps test-map -o yaml
13064cb9bffdb6322445b3e2401fdb2a.png

二、使用ConfigMap

  • 将ConfigMap中的数据设置为环境变量
  • 将ConfigMap中的数据设置为命令行参数
  • 使用Volume将ConfigMap作为文件或目录挂载

1、用作环境变量

[root@k8s-master ~]# vim test-map.yaml添加:apiVersion: v1kind: ConfigMapmetadata:  name: test-mapdata:  aaa: good  bbb: food
a69b71084ee3b4e159d980fdfe90cf02.png
[root@k8s-master ~]# kubectl apply -f test-map.yaml
6fa91849b6c21a0cffc273e4a551f561.png
[root@k8s-master ~]# kubectl get configmaps test-map
3a82f08c326f3d423672722749f6806d.png
[root@k8s-master ~]# vim test-pod.yaml添加:apiVersion: v1kind: Podmetadata:  name: test-podspec:  containers:  - name: test-pod    image: busybox:1.28    command: [ "/bin/sh", "-c", "env" ]    env:    - name: A_A      valueFrom:        configMapKeyRef:          name: test-map          key: aaa    - name: B_B      valueFrom:        configMapKeyRef:          name: test-map          key: bbb  restartPolicy: Never
37ab21688657185100c404de7f4aae57.png
[root@k8s-master ~]# kubectl apply -f test-pod.yaml
5d2ed055d1031cb36c68277c5853f40e.png
[root@k8s-master ~]# kubectl get pod
ee9e4ddc507a2558994689c2cf1dffcd.png

注意:完成Pod创建,运行结束,才能看到日志信息。

[root@k8s-master ~]# kubectl logs test-pod
405e0179e9cee96ac3d8fc98ed1f715a.png

2、用作命令行参数

结合上面的例子进行讲解

[root@k8s-master ~]# vim test-pod.yaml修改:apiVersion: v1kind: Podmetadata:  name: test-podspec:  containers:  - name: test-pod    image: busybox:1.28    command: [ "/bin/sh", "-c", "echo $(A_A) $(B_B)" ]                             ## 使用环境变量    env:    - name: A_A      valueFrom:        configMapKeyRef:          name: test-map          key: aaa    - name: B_B      valueFrom:        configMapKeyRef:          name: test-map          key: bbb  restartPolicy: Never
b26f43eb5be74aa0ffdf2556cb430df2.png
[root@k8s-master ~]# kubectl get pod
dd2f6eae3f1b7a4882acb68c2a262944.png
[root@k8s-master ~]# kubectl logs test-pod
a9f55be95eb2d71ccb72d87dab9e11d6.png

3、通过volumeMount使用ConfigMap

网站目录:/usr/share/nginx/html

(1) 创建ConfigMap

[root@k8s-master ~]# mkdir /data/[root@k8s-master ~]# echo "welcome to dodo web server" > /data/index.html[root@k8s-master ~]# kubectl create configmap test-map --from-file=/data/
3ac65341bae851a374abadc5ea3c946e.png
[root@k8s-master ~]# kubectl get configmaps test-map
c91be25ecbe09ca11eaaffcec4c030d8.png

(2)创建Pod使用ConfigMap

[root@k8s-master ~]# vim test-pod.yaml添加:apiVersion: v1kind: Podmetadata:  name: test-podspec:  containers:  - name: test-pod    image: nginx:1.16    ports:    - name: http      containerPort: 80    volumeMounts:    - name: test-volume      mountPath: /usr/share/nginx/html  volumes:  - name: test-volume    configMap:                               ##挂载configMap      name: test-map                     ##指定configMap的名称
96b30d45a298720901aee5a3c63fd828.png
[root@k8s-master ~]# kubectl apply -f test-pod.yaml
f5e33804bc0c29a6308bd53b3ceb4753.png
[root@k8s-master ~]# kubectl get pod -o wide
c6022a28a5aaae8fc4515f5d249652c1.png
[root@k8s-master ~]# kubectl exec -it test-pod -- sh
9cbd00f2c311eb3100b3cbd740a3888c.png

访问web服务

[root@k8s-master ~]# curl 10.244.41.2
3d90abffd9987fe2e50bb96946cc0053.png

三、ConfigMap的使用限制

ConfigMap必须在Pod之前创建(除非您把 ConfigMap 标志成”optional”)。如果您引用了一个不存在的 ConfigMap, 那这个Pod是无法启动的。就像引用了不存在的 Key 会导致 Pod 无法启动一样。

ConfigMap受Namespace限制,只有处于相同的Namespace中的Pod可以引用它;

ConfigMap中的配额管理还未能实现;

kubelet值支持可以被API Server管理的Pod使用ConfigMap。kubelet在当前Node上通过 --manifest-url 或 --config 自动创建的静态Pod将无法引用ConfigMap;

在Pod对ConfigMap进行挂载(volumeMount)操作时,容器内部只能挂载为目录,无法挂载为文件。

四、kubernetes集群中Secret与ConfigMap区别:

Secret主要是用来解决密码、token、密钥等敏感数据的配置问题,它有三种类型:

Service Account :用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中;

Opaque : base64编码格式的Secret,用来存储密码、密钥等;

kubernetes.io/dockerconfigjson :用来存储私有docker registry的认证信息。

而ConfigMap就是主要解决配置文件。可以解耦配置和镜像的分离。比如说在配置文件或者环境变量等等之类。kubernetes通过ConfigMap来实现对容器中应用的配置管理。


a8400cebfba5f1867220a4d0c99b7e6e.png
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐