博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kubernetes ConfigMap
阅读量:6331 次
发布时间:2019-06-22

本文共 8772 字,大约阅读时间需要 29 分钟。

ConfigMap概述

configmap用于将应用所需的配置信息与程序进行分离, 使应用程序更好的复用, 在大规模容器集群环境中, 对应用进行统一配置管理.

一般应用场景:

  • 生成为容器内的环境变量;
  • 以Volume的形式挂载为容器内部的文件或目录.

configmap以一个或多个key:value的形式保存在kubernetes系统中供应用使用, 既可以用于表示一个变量的值(例如log-level:info), 也可以用于表示一个完整的配置文件内容(例如xml或properties配置文件的全部内容).

声明方式:

  • 使用yaml配置文件;
  • 使用命令行命令(kubectl create configmap).

Pod中使用方式:

  • 环境变量方式
  • Volume挂载

创建ConfigMap

1. 使用yaml文件方式创建

1) 内容为变量

创建yaml文件cm-log-test.yaml:

apiVersion: v1kind: ConfigMapmetadata:  name: cm-logdata:  apploglevel: info  appdatadir: /var/data

生成configmap:

[root@localhost pod_dir]# kubectl create -f cm-log-test.yamlconfigmap "cm-log" created

2) 内容为配置文件内容

创建yaml文件cm-file-test.yaml:

apiVersion: v1kind: ConfigMapmetadata:  name: cm-filedata:  key-serverxml: |    
key-loggingproperties: | jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ku8manage?useUnicode=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=****** https=true web.uri=http://localhost:8080 web.session.expireTime=1200

生成configmap:

[root@localhost pod_dir]# kubectl create -f cm-file-test.yamlconfigmap "cm-file" created

2. 使用命令行方式创建

1) 字面值创建

使用--from-literal按字面值创建, 每个--from-literal后跟一个键值对.

# 语法kubectl create configmap 
--from-literal=key1=value1 --from-literal=key2=value2
[root@localhost pod_dir]# kubectl create configmap cm-literal --from-literal=loglevel=info --from-literal=datadir=/var/dataconfigmap "cm-literal" created

验证

[root@localhost pod_dir]# kubectl get configmap cm-literal -o yamlapiVersion: v1data:  datadir: /var/data  loglevel: infokind: ConfigMapmetadata:  creationTimestamp: 2018-07-05T11:29:55Z  name: cm-literal  namespace: default  resourceVersion: "29156"  selfLink: /api/v1/namespaces/default/configmaps/cm-literal  uid: bdfe61f9-8046-11e8-b599-000c2964ecfc

2) 文件创建

使用--from-file按文件创建, 每个--from-file后跟一个文件路径, 也可以指定key名称, 可选.

# 语法kubectl create configmap 
--from-file=[key=]file-path-1 --from-file=[key=]file-path-2
[root@localhost pod_dir]# kubectl create configmap cm-file --from-file=./server.xml --from-file=./log.properties configmap "cm-file" created

验证

[root@localhost pod_dir]# kubectl describe configmaps cm-file Name:         cm-fileNamespace:    defaultLabels:       
Annotations:
Data====log.properties:----verClassName=com.mysql.jdbc.Driver...server.xml:----ns xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance...

3) 目录创建

使用--from-literal按字面值创建, --from-file后跟一个目录, 该目录下的每个配置文件名都会被设置为key, 文件的内容被设置为value.

# 语法kubectl create configmap 
--from-file=config-file-dir
[root@localhost pod_dir]# kubectl create configmap cm-dir --from-file=./config-dir/configmap "cm-dir" created

验证

[root@localhost pod_dir]# kubectl describe configmap cm-dir Name:         cm-dirNamespace:    defaultLabels:       
Annotations:
Data====log.properties:----verClassName=com.mysql.jdbc.Driver...server.xml:----ns xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance...

在Pod中使用ConfigMap

1. 环境变量方式

以前面创建的创cm-log为例:

apiVersion: v1kind: ConfigMapmetadata:  name: cm-logdata:  apploglevel: info  appdatadir: /var/data

定义pod的yaml文件pod-cm-test.yaml:

apiVersion: v1kind: Podmetadata:  name: cm-test-pod  labels:    name: cm-pod-labelspec:  containers:    - name: cm-test      image: busybox      command: ["/bin/sh", "-c", "env | grep APP"]      env:        - name: APPLOGLEVEL    #定义环境变量名称          valueFrom:            configMapKeyRef:              name: cm-log     #环境变量的值取自cm-log              key: apploglevel #取key apploglevel对应的值        - name: APPDATADIR          valueFrom:            configMapKeyRef:              name: cm-log              key: appdatadir  restartPolicy: Never

创建Pod:

[root@localhost pod_dir]# kubectl create -f pod-cm-test.yamlpod "cm-test-pod" created

验证:

[root@localhost pod_dir]# kubectl logs cm-test-pod APPDATADIR=/var/dataAPPLOGLEVEL=info

上面用到了valueFrom, 用于指定单个环境变量情况, 还有envFrom, 可以将指定ConfigMap中的所有键值自动生成环境变量, 环境变量名称就是key, 环境变量的值就是value. 如下:

apiVersion: v1kind: Podmetadata:  name: cm-test-pod  labels:    name: cm-pod-labelspec:  containers:    - name: cm-test      image: busybox      command: ["/bin/sh", "-c", "env"]      envFrom:        - configMapRef:            name: cm-log  restartPolicy: Never

创建Pod:

[root@localhost pod_dir]# kubectl create -f pod-test-envFrom.yaml pod "cm-test-pod" created

验证:

[root@localhost pod_dir]# kubectl logs cm-test-pod apploglevel=infoKUBERNETES_PORT=tcp://10.68.0.1:443KUBERNETES_PORT_443_TCP_PROTO=tcpappdatadir=/var/dataKUBERNETES_PORT_443_TCP=tcp://10.68.0.1:443PWD=/

2. Volume挂载

使用上边以cm-file-test.yaml创建的cm-file为例.

创建Pod:

apiVersion: v1kind: Podmetadata:  name: cm-test-volumespec:  containers:  - name: cm-test-volume    image: kubeguide/tomcat-app:v1         ports:    - containerPort: 8080    volumeMounts:    - name: server      mountPath: /configfiles  volumes:  - name: server    configMap:      name: cm-file      items:      - key: key-serverxml        path: server.xml      - key: key-properties        path: logging.properties

创建Pod:

[root@localhost pod_dir]# kubectl create -f pod-volume-test.yaml pod "cm-test-volume" created

验证:

登录容器, 查看configfiles目录下存在server.xml和logging.properties文件:

[root@localhost pod_dir]# kubectl exec -ti cm-test-volume -- bashroot@cm-test-volume:/usr/local/tomcat# cd /configfiles/root@cm-test-volume:/configfiles# ls -a.  ..  ..2018_07_05_13_14_04.531049961  ..data  logging.properties  server.xml

查看文件内容:

root@cm-test-volume:/configfiles# cat logging.properties verClassName=com.mysql.jdbc.Driver    jdbc.url=jdbc:mysql://localhost:3306/ku8manage?useUnicode=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai...root@cm-test-volume:/configfiles# cat logging.properties verClassName=com.mysql.jdbc.Driver    jdbc.url=jdbc:mysql://localhost:3306/ku8manage?useUnicode=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai    jdbc.username=root    jdbc.password=******    https=true    web.uri=http://localhost:8080    web.session.expireTime=1200root@cm-test-volume:/configfiles# cat server.xml ns xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                http://www.springframework.org/schema/task/spring-task.xsd">...

如果在引用ConfigMap时不指定items, 则使用volumeMount方式在容器内的目录中为每个item生成一个文件名为key的文件, 如下:

创建Pod:

apiVersion: v1kind: Podmetadata:  name: cm-test-volumespec:  containers:  - name: cm-test-volume    image: kubeguide/tomcat-app:v1         ports:    - containerPort: 8080    volumeMounts:    - name: server      mountPath: /configfiles  volumes:  - name: server    configMap:      name: cm-file

应用: 使用ConfigMap配置redis

创建ConfigMap:

[root@localhost pod_dir]# kubectl create configmap example-redis-config --from-file=./redis-config configmap "example-redis-config" created

redis-config文件内容如下:

maxmemory 2mbmaxmemory-policy allkeys-lru

查看已创建的配置ConfigMap:

[root@localhost pod_dir]# kubectl get configmap example-redis-config -o yamlapiVersion: v1data:  redis-config: |    maxmemory 2mb    maxmemory-policy allkeys-lrukind: ConfigMapmetadata:  creationTimestamp: 2018-07-06T02:03:56Z  name: example-redis-config  namespace: default  resourceVersion: "41583"  selfLink: /api/v1/namespaces/default/configmaps/example-redis-config  uid: d6fa0d84-80c0-11e8-b599-000c2964ecfc

创建pod yaml文件:

apiVersion: v1kind: Podmetadata:  name: redisspec:  containers:  - name: redis    image: kubernetes/redis:v1    env:    - name: MASTER      value: "true"    ports:    - containerPort: 6379    resources:      limits:        cpu: "0.1"    volumeMounts:    - mountPath: /redis-master-data      name: data    - mountPath: /redis-master      name: config  volumes:    - name: data      emptyDir: {}    - name: config      configMap:        name: example-redis-config        items:        - key: redis-config          path: redis.conf

创建pod:

[root@localhost pod_dir]# kubectl create -f pod-cm-redis-test.yaml pod "redis" created

验证:

进入容器查看

[root@localhost pod_dir]# kubectl exec -it redis redis-cli127.0.0.1:6379> CONFIG GET maxmemory1) "maxmemory"2) "2097152"127.0.0.1:6379> config get maxmemory-policy1) "maxmemory-policy"2) "allkeys-lru"

使用ConfigMap须知:

  • ConfigMap必须在pod创建之前创建;
  • ConfigMap受Namespace限制, 处于同一Namespace的pod才能引用到它;
  • kubelet只支持被API server管理的pod使用ConfigMap, 也就是说静态pod不能使用ConfigMap.

转载地址:http://qsboa.baihongyu.com/

你可能感兴趣的文章
HDU 1255 覆盖的面积(矩形面积交)
查看>>
Combinations
查看>>
SQL数据库无法附加,提示 MDF" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。...
查看>>
第二十一章流 3用cin输入
查看>>
在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
查看>>
获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
查看>>
Orchard 视频资料
查看>>
简述:预处理、编译、汇编、链接
查看>>
调试网页PAIP HTML的调试与分析工具
查看>>
路径工程OpenCV依赖文件路径自动添加方法
查看>>
玩转SSRS第七篇---报表订阅
查看>>
WinCE API
查看>>
POJ 3280 Cheapest Palindrome(DP 回文变形)
查看>>
oracle修改内存使用和性能调节,SGA
查看>>
SQL语言基础
查看>>
对事件处理的错误使用
查看>>
最大熵模型(二)朗格朗日函数
查看>>
深入了解setInterval方法
查看>>
html img Src base64 图片显示
查看>>
[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction...
查看>>