K8s-存储_ConfigMap

K8s-存储


  • 引入:K8s-存储分类
    • ConfigMap --- 用于配置文件
    • Secret ---用于安全方面
    • Volume ---用于卷方面
    • Persistent Volume ---用于卷方面

ConfigMap

​ ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序 会从配置文件、命令行参数或环境变量中读取配置信息。 ConfigMap API 给我们提供了向容器中注入配置信息的机制, ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文 件或者 JSON 二进制等对象

​ 基于base 64位算法

​ 演示base 64位算法 #-d解密

  • ConfigMap的创建

    • 使用目录创建:步骤如下

    • 使用命令创建configmap实例

      若想使用资源清单形式创建configmap实例,可以先使用以下命令 查看书写形式

      ​ kubectl apply configmap game-config --fromfile=/root/data/ --dry-run -o yam

      由于我们的值比较灵活,volumes字段很多,如果每次都使用资源 清单来创建,则比较麻烦,之前是因为能使用标签,但此处不行,所以推荐以下命令来创建configmap

      ​ kubectl create configmap game-config --fromfile=/root/data/

      注 :--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,键值就是文件的内容

    • 使用文件创建configmap,和目录创建没什么区别

      kubectl create configmap game-config-2 --fromfile=./game.file

    • 使用字面值创建configmap

      使用文字值创建,利用--from-literal参数传递配置信息,该参数 可以使用多次,格式如下

      kubectl create configmap literal-config --fromliteral=name=dave --from-literal=password=pass

      kubectl get configmap literal-config -o yaml

    • pod中如何使用ConfigMap

      使用ConfigMap来替代环境变量,基于以下模板完成

      ​ 即两种实现方式

      ​ 1、替换环境变量

      ​ 2、直接将值注入进去

      apiVersion: v1
      kind: configMap
      metadata:
        name: literal-config
        namespace: default
      data:
        name: dave
        password: pass
      ---
      
      apiVersion: v1
      kind: configMap
      metadata: 
        name: env-config
        namespaces: default
      data: 
        log_level: INFO
      ---
      apiVersion: v1
      kind: Pod
      metadata: 
        name: cm-env-test-pod
      spec: 
        containers:
           - name: test-container
           image: chenxiyanglinux/myapp:v1
           command: ["/bin/sh","-c","env"]
           env: 
             - name: USERNAME
               valueFrom:
                 configMapKeyRef:
                   name: literal-config
                   key: name
             - name: PASSWORD
               valueFrom: 
                 configMapKeyRef:
                   name: literal-config
                   key: password
           envFrom: 
             - configMapRef
               name: env-config
        restartPolicy: Never   
        
      #env:替换环境变量名
      #envFrom:直接原封不动的传递进去
      #注:第一个模板上面已经使用命令创建,所以我们只需要将后两个 模板放在一起创建即可,使用---将两模板隔开即可
      

      查看日志:

      ​ kubectl logs cm-env-test-pod # 已经成功被注入环境变量

      注:要想使用此种方式注入环境变量,文件里的内容要遵循k:v结 构,即什么等于什么

    • 用 ConfigMap 设置命令行参数

      基于以下模板完成

      apiVersion: v1
      kind: Pod
      metadata: 
        name: cm-command-dapi-test-pod
      spec: 
        containers: 
          - name: test-container
            image: chenxiyanglinux/myapp:v1
            command: ["/bin/sh","-c","echo $(USERNAME) $(PASSWORD)"]
            env: 
              - name: USERNAME
                valueFrom: 
                  configMapKeyRef: 
                    name: literal-config
                    key: name
              - name: PASSWORD
                valueFrom: 
                  configMapKeyRef: 
                    name: literal-config
                    key: password
        restartPolicy: Never      
      

      注:这里调用的是值,倘若是命令的话,即直接调用了

    • 通过数据卷插件使用ConfigMap

      在数据卷里面使用这个 ConfigMap,有不同的选项。最基本的就 是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容

      apiVersion: v1
      kind: Pod
      metadata: 
        name: cm-volume-test-pod
      spec: 
        container: 
          - name: test-container
            image: chenxiyanglinux/myapp:v1
            volumeMounts: 
            - name: config-volume
              mountPath: /etc/config
        volumes: 
          - name: config-volume
            configMap:
              name: literal-config
        restartPolivy: Nerver    
      
      # 创建,进入pod查看是否挂载
      

    • ConfigMap的热更新

      基于以下模板创建,此模板创建后,会在hot-updatepod中 的/etc/config目录下有一个config-volume文件,文件内容是logconfig的log_level: INF

      apiVersion: v1
      kind: ConfigMap
      metadata: 
        name: log-config
        namespace: default
      data:
        log_level: INFO
      ---
      apiVersion: extensions/v1beta1
      kind: Deployment
      metadata: 
        name: hot-update
      spec:
        replicas: 1
        template: 
          metadata:
            label: 
              run: my-nginx
            sepc: 
            	containers: 
            	- name: my-nginx
            	  image: chenxiyanglinux/myapp:v1
            	  ports: 
            	  - containerPort: 80
            	  volumeMounts: 
            	  - name: config-volume
            	    mountPath: /etc/config
            	volumes: 
                - name: config-volume
                  configMap: 
                    name: log-config
      #  为了实现热更新,我们采取死循环的方式             
      

      执行命令修改值

      ​ kubectl edit configmap log-config 修改ConfigMap的值,将两处INFO改为ERROR(随便改的),

      注意:只要有INFO字段,都必须更改

      观察左侧变化,稍微等一会,已自动更新

    • 提问:若使用此种方法运用在服务器领域,怎样实现重载配置文件?

      1、伪造---即更新版本为小版本v1.1,但实际未修改镜像,但也达到 了镜像的修改;可以实现滚动更新

      2、ConfigMap 更新后滚动更新 Pod 更新

      ​ ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通 过修改 pod annotations 的方式强制触发滚动更新,以下两中方法

      交互模式

      kubectl edit deployment hot-update,添加annotations字段

​ 保存退出后查看:

​ 先移除之前的,再创建新的,达到滚动更新

命令方式

​ kubectl patch deployment hot-update --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20220224" }}}}}'

​ 这个例子里我们在 .spec.template.metadata.annotations 中添加 version/config,每次通过修改 version/config 来触发滚动更新

​ 注:!!! 更新 ConfigMap 后: 使用该 ConfigMap 挂载的 Env 不会同步更新 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概20秒)才能同步更新

posted @ 2022-07-25 14:44  Sunset_cloud  阅读(27)  评论(0编辑  收藏  举报