kubernetes ConfigMap

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: configmap用于将应用所需的配置信息与程序进行分离, 使应用程序更好的复用, 在大规模容器集群环境中, 对应用进行统一配置管理. 一般应用场景: 生成为容器内的环境变量; 以Volume的形式挂载为容器内部的文件或目录.

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: v1
kind: ConfigMap
metadata:
  name: cm-log
data:
  apploglevel: info
  appdatadir: /var/data

生成configmap:

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

2) 内容为配置文件内容

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-file
data:
  key-serverxml: |
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                http://www.springframework.org/schema/task/spring-task.xsd">

        <context:annotation-config />
        <context:component-scan base-package="com.ysbd" />
        <aop:aspectj-autoproxy proxy-target-class="true" />

        <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
                <constructor-arg>
                        <bean class="com.zaxxer.hikari.HikariConfig">
                                <property name="poolName" value="HikariDataSource" />
                                <property name="driverClassName" value="${jdbc.driverClassName}" />
                        </bean>
                </constructor-arg>
        </bean>
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <property name="dataSource" ref="dataSource"></property>
        </bean>
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="dataSource"></property>
        </bean>
        <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
                <tx:attributes>
                        <tx:method name="*" propagation="REQUIRED" />
                </tx:attributes>
        </tx:advice>
        <aop:config>
                <aop:pointcut expression="execution(* com.ysbd.service..*.*(..))" id="allManagerMethod" />
                <aop:advisor advice-ref="transactionAdvice" pointcut-ref="allManagerMethod" />
        </aop:config>
    </beans>
  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.yaml
configmap "cm-file" created

2. 使用命令行方式创建

1) 字面值创建

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

# 语法
kubectl create configmap <cm-name> --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/data
configmap "cm-literal" created

验证

[root@localhost pod_dir]# kubectl get configmap cm-literal -o yaml
apiVersion: v1
data:
  datadir: /var/data
  loglevel: info
kind: ConfigMap
metadata:
  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 <cm-name> --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-file
Namespace:    default
Labels:       <none>
Annotations:  <none>

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 <cm-name> --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-dir
Namespace:    default
Labels:       <none>
Annotations:  <none>

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: v1
kind: ConfigMap
metadata:
  name: cm-log
data:
  apploglevel: info
  appdatadir: /var/data

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

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
  labels:
    name: cm-pod-label
spec:
  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.yaml
pod "cm-test-pod" created

验证:

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

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

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod
  labels:
    name: cm-pod-label
spec:
  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=info
KUBERNETES_PORT=tcp://10.68.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
appdatadir=/var/data
KUBERNETES_PORT_443_TCP=tcp://10.68.0.1:443
PWD=/

2. Volume挂载

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

创建Pod:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-volume
spec:
  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 -- bash
root@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=1200
root@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: v1
kind: Pod
metadata:
  name: cm-test-volume
spec:
  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 2mb
maxmemory-policy allkeys-lru

查看已创建的配置ConfigMap:

[root@localhost pod_dir]# kubectl get configmap example-redis-config -o yaml
apiVersion: v1
data:
  redis-config: |
    maxmemory 2mb
    maxmemory-policy allkeys-lru
kind: ConfigMap
metadata:
  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: v1
kind: Pod
metadata:
  name: redis
spec:
  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-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "2097152"
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"

使用ConfigMap须知:

  • ConfigMap必须在pod创建之前创建;
  • ConfigMap受Namespace限制, 处于同一Namespace的pod才能引用到它;
  • kubelet只支持被API server管理的pod使用ConfigMap, 也就是说静态pod不能使用ConfigMap.
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6月前
|
存储 Kubernetes 网络协议
kubernetes ConfigMap存储卷
kubernetes ConfigMap存储卷
|
7天前
|
存储 Kubernetes 数据安全/隐私保护
Kubernetes的ConfigMap和Secret
Kubernetes的ConfigMap和Secret
26 0
|
4月前
|
存储 Kubernetes API
k8s学习-ConfigMap(创建、使用、更新、删除等)
k8s学习-ConfigMap(创建、使用、更新、删除等)
475 0
|
8月前
|
存储 Kubernetes 数据安全/隐私保护
k8s--配置存储 ConfigMap、Secret
k8s--配置存储 ConfigMap、Secret
|
4月前
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes|关于configMap的一些学习
云原生|kubernetes|关于configMap的一些学习
49 1
|
6月前
|
存储 Kubernetes 关系型数据库
【Kubernetes的Configmap、SecretMetric service及HPA、Wordpress应用Mysql主从PVPVCSCHPA】
【Kubernetes的Configmap、SecretMetric service及HPA、Wordpress应用Mysql主从PVPVCSCHPA】
|
9月前
|
存储 Kubernetes 安全
【k8s 系列】k8s 学习二十三-2,ConfigMap 补充 和 Secret
对于上一篇文章我们分享了为什么要使用 ConfigMap ,我们创建 ConfigMap 的时候可以传入单个或者多个键值对,也可以传入文件,还分享了如何简单的传入 ConfigMap 里面的数据作为环境变量
|
9月前
|
存储 Kubernetes Docker
【k8s 系列】k8s 学习二十三,ConfigMap 如何配置应用程序
今天我们来分享 ConfigMap 资源,分享之前,我们来看看前面我们跑应用程序都是怎么玩的 前面的应用程序中,都是没有写入配置的,顶多用到了卷,用来存储数据
192 0
|
11月前
|
存储 Kubernetes API
上篇:一文了解K8S的ConfigMap
上篇:一文了解K8S的ConfigMap
199 0
|
Kubernetes Docker 容器
kubernetes 【组件】configmap配置更新
kubernetes 【组件】configmap配置更新