• Kubernetes—配置管理ConfigMap


    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。

  • 相关阅读:
    两行文字,溢出隐藏,并显示省略号
    vue的操作:使用手机访问电脑的页面做法如下:
    width: calc(100%
    路由配置
    安装node.js 和 npm 的完整步骤
    懒加载图片轮播,总结完美可用
    Canvas 总结,到第4章 canvas图形变换
    封装表单自定义错误信息。(阻止默认错误信息提示,添加自定义错误信息提示)
    判断指定对象是否进入浏览器可视窗口,true 进入,false 没进入
    单张图片,多张图标为一个轮播对象的轮播图:按需加载 和 非按需加载
  • 原文地址:https://www.cnblogs.com/Andya/p/12490000.html
Copyright © 2020-2023  润新知