1 ConfigMap介绍

1.1 概述

  在部署应用程序时,我们都会涉及到应用的配置,在容器中,如Docker容器中,如果将配置文件打入容器镜像,这种行为等同于写死配置,每次修改完配置,镜像就得重新构建。当然,我们也可以通过挂载包含该文件的卷进行配置管理和修改。而在k8s中,我们要讲一种更好的方式,即ConfigMap,这种资源对象的出现,更是极大的方便了应用程序的配置管理。
  ConfigMap是一个或多个key/value的形式保存在k8s中,内部可以管理变量也可以管理完整的配置文件内容。

1.2 用法

  1. 生成容器内的环境变量,在pod中可以通过spec.env或者spec.envFrom进行引用。
  2. 设置容器启动命令的启动参数,前提是设置为环境变量。
  3. 以卷volume的方式挂载到容器内部的文件或目录,通过spec.volumes引用。

2 ConfigMap用法

在使用命令的时候注意单词: configmap等价于cm,cm算是简写,类似于deployment可以使用命令时写成deploy,service可以写成svc,namespace可以写成ns,pod可以写成po。

2.1 创建

1)yaml文件方式创建
样例:

apiVersion: v1
kind: ConfigMap
metadata:name: cm-test01
data:appconf01: value01appconf02: value02

命令:
$ kubectl create -f configmap-test01.yaml

2)命令行方式创建

  • 读取文件方式(也可以是目录)通过--from-file参数从文件中读取。可以指定key的名称,若不指定,则默认使用文件名为key。
    如当前目录有一个配置文件为test.properties
key01:value01
key02:value02
conf01: value03

$ kubectl create cm cm-test-file --from-file=test.properties

  • 指定参数方式,通过--from-literal指定keyxx=valuexx创建confimap中的data内配置属性。
    $ kubectl create configmap cm-test-literal --from-literal=key01=value01 --from-literal=key02=value02

2.2 查询

1)查看configmap列表
$ kubectl get cm

[root@k8s /cm/test]#  kubectl get cm
NAME        DATA      AGE
cm-test-file      1         1m
cm-test-literal   2         2s
cm-test01         2         1h

2)查看configmap详情
$ kubectl describe cm cm-test01

[root@k8s /cm/test]#  kubectl describe cm cm-test01
Name:           cm-test01
Namespace:      system-pro
Labels:         <none>
Annotations:    <none>Data
====
appconf01:
----
value01
appconf02:
----
value02

$ kubectl describe configmap cm-test-file

[root@k8s /cm/test]#  kubectl describe configmap cm-test-file
Name:           cm-test-file
Namespace:      system-pro
Labels:         <none>
Annotations:    <none>Data
====
test.properties:
----
key01:value01
key02:value02
conf01: value03

$ kubectl describe cm cm-test-literal

[root@k8s /cm/test]#  kubectl describe cm cm-test-literal
Name:           cm-test-literal
Namespace:      system-pro
Labels:         <none>
Annotations:    <none>Data
====
key01:
----
value01
key02:
----
value02

3)查看yaml输出
$ kubectl get cm cm-test01 -o yaml

[root@k8s /cm/test]#  kubectl get cm cm-test01 -o yaml
apiVersion: v1
data:appconf01: value01appconf02: value02
kind: ConfigMap
metadata:creationTimestamp: 2020-03-13T13:06:21Zname: cm-test01namespace: system-proresourceVersion: "594861"selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test01uid: 6f5e7efb-652b-11ea-adf9-fa163e4464a5

$ kubectl get configmap cm-test-file -o yaml

[root@k8s /cm/test]#  kubectl get configmap cm-test-file -o yaml
apiVersion: v1
data:test.properties: |key01:value01key02:value02conf01: value03
kind: ConfigMap
metadata:creationTimestamp: 2020-03-13T14:29:30Zname: cm-test-filenamespace: system-proresourceVersion: "598548"selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test-fileuid: 0d226ad2-6537-11ea-adf9-fa163e4464a5

$ kubectl get cm cm-test-literal -o yaml

[root@k8s /cm/test]#  kubectl get cm cm-test-literal -o yaml
apiVersion: v1
data:key01: value01key02: value02
kind: ConfigMap
metadata:creationTimestamp: 2020-03-13T14:30:57Zname: cm-test-literalnamespace: system-proresourceVersion: "598613"selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test-literaluid: 412affd4-6537-11ea-adf9-fa163e4464a5

2.3 更新

1)edit
$ kubectl edit cm cm-test01

通过kubectl describe cm cm-test01查看更新是否生效

2)apply
直接更改yaml文件里面的值,通过kubectl apply -f configmap-test01.yaml重新发布一遍进行更新。

2.4 删除

1)通过yaml文件的方式删除
$ kubectl delete -f configmap-test01.yaml

2)直接删除资源
$ kubectl delete cm cm-test01

3 ConfigMap和Pod的使用

容器应用对ConfigMap的使用主要是两种:
1)通过环境变量获取ConfigMap的内容:spec.envspec.envFrom
2)通过卷volume挂载的方式将ConfigMap的内容挂载到容器内部的文件或目录:spec.volumes

以下内容均以上述的ConfigMap资源cm-test01为例

3.1 环境变量方式

spec.env方式

1)创建pod

[root@k8s /cm/test]#  vim pod-test01.yaml
apiVersion: v1
kind: Pod
metadata:name: cm-pod-test001
spec:containers:- name: cm-testimage: tomcat:8command: [ "/bin/sh", "-c", "env | grep APP"]env:- name: APPCONF01      # 定义环境变量的名称valueFrom:           # key “appconf01”的值获取configMapKeyRef:name: cm-test01    # 环境变量的值来自于configmap cm-test01key: appconf01    # configmap中的配置key为appconf01- name: APPCONF02       # 定义环境变量的名称valueFrom:           # key “appconf02”的值获取configMapKeyRef:name: cm-test01    # 环境变量的值来自于configmap cm-test01key: appconf02    # configmap中的配置key为appconf02restartPolicy: Never        # 重启策略:从不。

执行创建pod:
$ kubectl create -f pod-test01.yaml

2)查看pod
$ kubectl get pods

[root@k8s /cm/test]#  kubectl get pods
NAME             READY     STATUS      RESTARTS   AGE
cm-pod-test001   0/1       Completed   0          1h

3)查看pod日志
$ kubectl logs cm-pod-test001

[root@k8s /cm/test]#  kubectl logs cm-pod-test001
APPCONF01=value01
APPCONF02=value02

说明容器内部的环境变量使用ConfigMap中进行读取的。

spec.envFrom方式

1)创建pod
yaml文件

[root@k8s /cm/test]#  vim pod-test02.yaml
apiVersion: v1
kind: Pod
metadata:name: cm-pod-test002
spec:containers:- name: cm-test2image: tomcat:8command: [ "/bin/sh", "-c", "env"]envFrom:- configMapRef:name: cm-test01   # 根据ConfigMap cm-test01资源自动生成环境变量restartPolicy: Never

执行创建pod:
$ kubectl create -f pod-test02.yaml

2)查看pod
$ kubectl get po

[root@k8s /cm/test]#  kubectl get po
NAME             READY     STATUS      RESTARTS   AGE
cm-pod-test001   0/1       Completed   0          2h
cm-pod-test002   0/1       Completed   0          1h

注意:
环境变量的名称受限制:[a-zA-Z][a-zA-Z0-9_]*,不能以数字或非法字符开头。

3.2 卷挂载方式

指定items

[root@k8s /cm/test]#  vim pod-test03.yaml
apiVersion: v1
kind: Pod
metadata:name: cm-pod-test003
spec:containers:- name: cm-test3image: tomcat:8volumeMounts:- name: vm-01-1mountPath: /confvolumes:- name: vm-01-1configMap:name: cm-test-fileitems:- key: key-testpropertiespath: test.propertiesrestartPolicy: Never

不指定items

[root@k8s /cm/test]#  vim pod-test04.yaml
apiVersion: v1
kind: Pod
metadata:name: cm-pod-test004
spec:containers:- name: cm-test4image: tomcat:8volumeMounts:- name: vm-02-2mountPath: /confvolumes:- name: vm-02-2configMap:name: cm-test-filerestartPolicy: Never

进入容器中查看
$ kubectl exec -it cm-pod-test004 -c cm-test4 -- bash
进入容器后,ls /conf查看是否有test.properties文件。

[root@k8s /cm/test]#  kubectl exec -it cm-pod-test004 -c cm-test4  -- bash
root@cm-pod-test004:/usr/local/tomcat# ls /conf
test.properties

补充

关于--from-file的方式的创建指定key和不指定key的区别
1)不指定key名
创建:
$ kubectl create cm cm-test-file --from-file=test.properties
输出:
$ kubectl get cm cm-test-file -o yaml

2)指定key
创建:
$ kubectl create cm cm-test-file02 --from-file=tp=test.properties
输出:
$ kubectl get cm cm-test-file -o yaml

若指定key的名称,configmap中将会使用指定名称;若不指定,则默认使用文件名为key。

Kubernetes—配置管理ConfigMap(十三)相关推荐

  1. Kubernetes的ConfigMap说明

    这篇博文,我们来说一说,关于在kubernetes的pod中自定义配置的问题. 我们知道,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如说在web的程序中,需要连接数据库,缓存甚至是队列等等. ...

  2. k8s springboot 文件_Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程...

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Docker & Kubernetes相关文章:容器技术 之前介绍了Spring Cloud Config的用法,但 ...

  3. KCL 与其他 Kubernetes 配置管理工具的异同 - Kustomize 篇 [一个自研编程语言能做什么?(系列 2)]

    在系列上一篇文章 [用一个自己做的编程语言能做什么? (系列文章 1)] KCL - 让 Kubernetes 资源清单管理更容易 - 徐鹏飞Peefy的个人空间 - OSCHINA - 中文开源技术 ...

  4. kubernetes存储 -- Configmap应用配置管理

    简介 生产环境中很多应用程序的配置可能需要通过配置文件,命令行参数和环境变量的组合配置来完成.这些配置应该从image中解耦,以此来保持容器化应用程序的可移植性.在K8S1.2后引入ConfigMap ...

  5. CC00185.CloudKubernetes——|KuberNetes配置管理.V16|——|configmap.secret热更新.v02|configmap编辑方式|

    一.configmap编辑方式 ### --- 编辑configmap的形式:~~~ 方式一: edit:显示文件内容会很杂乱,不是很标准的显示内容,造成视觉的难理解.若是文件特别小的话,它会把文件内 ...

  6. 如何使用Kubernetes的configmap通过环境变量注入到pod里

    在Kubernetes官网里,有这样一篇文章,提到了Kubernetes里的一个最佳实践就是把应用代码同配置信息分开,一种方式就是使用Kubernetes 1.2里引入的configmap概念. ht ...

  7. k8s pod MySQL环境变量,如何使用Kubernetes的configmap通过环境变量注入到pod里

    在Kubernetes官网里,有这样一篇文章,提到了Kubernetes里的一个最佳实践就是把应用代码同配置信息分开,一种方式就是使用Kubernetes 1.2里引入的configmap概念. co ...

  8. 35 【kubernetes】configMap

    kubernetes可以驱动容器的运行,并且把容器的运行放置在kubernetes定义的体系结构中pods这一级. 但是容器运行通常会需要某些参数,比如环境变量或者硬件使用情况. 为了解决对每个con ...

  9. 零代码变更,巧用 Reloader 快速实现 Kubernetes 的 Configmap 和 Secret 热更新

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 1背景 1.1 配置中心问题 在云原生中配置中心,例如:Configmap和Secret对象,虽然可以进行直接更新 ...

最新文章

  1. Linux-Shell 快捷键
  2. Java并发基础01. 传统线程技术中创建线程的两种方式
  3. MS SQL收縮資料庫
  4. Linux操作系统下实现远程开机
  5. java输入数据插入if_java编程,从键盘录入10个整数数据,将每次录入的数据按从小到大的顺序插入到数组中。...
  6. vanilla_如何在Vanilla JavaScript中操作DOM
  7. sqlmap的简单用法
  8. 列运算_MIT—线性代数笔记06 列空间和零空间
  9. Python使用UDP协议实现局域网内屏幕广播
  10. 三维球体换算到二维_三维制图讲义04 - 基础几何体
  11. 人脸识别ArcfaceDemo for Windows 分享
  12. 4.19华为技术面+4.21华为主管面(已OC)
  13. Android:手机号码归属地查询
  14. 共享鸡皮疙瘩?庆应大学开发了一种贴身设备,利用腕带和颈带数据,分享刺激感受...
  15. HTML中注解的写法正确的是,css注释的写法(单行和多行)
  16. php弱口令总结,web漏洞之弱口令
  17. sqlite设密工具如何使用(本人资源)
  18. 航天器导航属于计算机应用的哪个领域,计算机应用基础作业1含答案
  19. html 用css画出斑马线,CSS3实现斑马线、棋盘、格子复杂背景
  20. python hypothesis testing

热门文章

  1. 佳能相机CR2转TIFF
  2. linux内核那些事之delay延迟技术
  3. linux sysfs link(sysfs_create_link)
  4. Supported Data Types(flink支持的数据类型)
  5. wine mac 中文 方块乱码 解决
  6. Bootstrap-CSS-表单
  7. MMdetection安装使用(1)
  8. webstorm 左侧文件目录树(不显示,怎么办?) - 设置篇
  9. MUI入门小白到大师 - 讲解
  10. 《一本书》文字展示网站Typecho主题