Kubernetes—配置管理ConfigMap(二十一)

关注WX:CodingTechWork,一起学习进步。

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: value01
  appconf02: 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: value01
  appconf02: value02
kind: ConfigMap
metadata:
  creationTimestamp: 2020-03-13T13:06:21Z
  name: cm-test01
  namespace: system-pro
  resourceVersion: "594861"
  selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test01
  uid: 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:value01
    key02:value02
    conf01: value03
kind: ConfigMap
metadata:
  creationTimestamp: 2020-03-13T14:29:30Z
  name: cm-test-file
  namespace: system-pro
  resourceVersion: "598548"
  selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test-file
  uid: 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: value01
  key02: value02
kind: ConfigMap
metadata:
  creationTimestamp: 2020-03-13T14:30:57Z
  name: cm-test-literal
  namespace: system-pro
  resourceVersion: "598613"
  selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test-literal
  uid: 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-test
    image: tomcat:8
    command: [ "/bin/sh", "-c", "env | grep APP"]
    env:
    - name: APPCONF01       # 定义环境变量的名称
      valueFrom:            # key “appconf01”的值获取
        configMapKeyRef:
          name: cm-test01   # 环境变量的值来自于configmap cm-test01
          key: appconf01    # configmap中的配置key为appconf01
    - name: APPCONF02       # 定义环境变量的名称
      valueFrom:            # key “appconf02”的值获取
        configMapKeyRef:
          name: cm-test01   # 环境变量的值来自于configmap cm-test01
          key: appconf02    # configmap中的配置key为appconf02
  restartPolicy: 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-test2
    image: tomcat:8
    command: [ "/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-test3
    image: tomcat:8
    volumeMounts:
    - name: vm-01-1
      mountPath: /conf
  volumes:
  - name: vm-01-1
    configMap:
      name: cm-test-file
      items:
      - key: key-testproperties
        path: test.properties
  restartPolicy: Never

不指定items

[root@k8s /cm/test]#  vim pod-test04.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-test004
spec:
  containers:
  - name: cm-test4
    image: tomcat:8
    volumeMounts:
    - name: vm-02-2
      mountPath: /conf
  volumes:
  - name: vm-02-2
    configMap:
      name: cm-test-file
  restartPolicy: 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。

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 1、在yaml文件中配置环境变量 (1)、配置固定值环境变量 env: - name: INTERVAL val...
    七月流火2019阅读 867评论 0 0
  • 很多应用程序需要一些配置通过组合的配置文件,命令行参数和环境变量。这些配置应该与镜像内容分离以保持容器化应用程序的...
    YiQinGuo阅读 13,686评论 0 3
  • 应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使得应用程序被更好地复用,通过不同的配置也能实...
    王勇1024阅读 20,403评论 0 5
  • 昨天,那个不愿意将我们的关系公之于众的前男友问我:“我们可以重新开始吗?”我不知道我为什么会泪崩,早已经放下的纠葛...
    希月安宁阅读 242评论 1 0
  • 满窗新月半窗山漫翻诗书久未眠遥寄心歌向谁个孤灯清影犹盘桓 。一。。。。。。。。。。。。。。。。。。。。。。。。。。...
    眠雲阅读 761评论 12 25