zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Django对静态文件的处理——部署阶段
    使用Django来处理对于静态文件的请求
    Django1.7如何配置静态资源访问
    Spring WebSocket中403错误解决
    FastJSON JSONObject 字段排序 Feature.OrderedField
    国际化(i18n) 各国语言缩写
    【转】java.io.Closeable接口
    【转】spring bean 卸载
    This content should also be served over HTTPS
    Failed to close the ServletOutputStream connection cleanly, Broken pipe
  • 原文地址:https://www.cnblogs.com/Andya/p/12490000.html
Copyright © 2011-2022 走看看