传递配置给容器化应用程序有几种方式:

  1. 嵌入应用本身;
  2. 通过命令行传递参数;
  3. 通过环境变量传递参数;

在k8s中无论你有没有使用configmap,以下方法均可以配置应用程序:

  1. 向容器传递命令行参数:command、args;
  2. 为每个容器设置自定义环境变量;
  3. 通过特殊类型的卷将配置文件挂载到容器中,如:gitrepo;

ConfigMap的主要作用:

就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,将来可直接注入到Pod中的容器使用;

ConfigMap本质上就是一个键值对,值可以是定义的具体值,也可以是完整的配置文件;

应用无需读取Configmap,映射的内容是通过env或者volume的形式传递给容器,而不是直接传递给容器;

创建Configmap

命令创建简单的configmap

  1. kubectl create configmap my-config --from-literal=key1=config1
  • --from-literal是命令的参数,后面的才是配置的key-value;

多个参数:

  1. kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

从字面量创建参数,也可以从文件,文件夹等创建configmap,可以通过命令:kubectl create configmap -h 查看;

yaml文件创建

configmap的yaml文件比较简单,data下面就是一个一个的条目;

关于|管道符的含义,点击此处

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: test-cfg
  5. namespace: default
  6. data:
  7. cache_host: memcached-gcxt
  8. cache_port: "11211"
  9. cache_prefix: gcxt
  10. my.cnf: |
  11. [mysqld]
  12. log-bin = mysql-bin
  13. app.properties: |
  14. property.1 = value-1
  15. property.2 = value-2
  16. property.3 = value-3

使用Configmap

将configmap中的值传递给容器有三种方式;

1. 容器的环境变量

环境变量命名不可以使用"-"

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: fortune-config
  5. data:
  6. sleep-interval: "25"

注入容器:

  1. spec:
  2. containers:
  3. - image: luksa/fortune:env
  4. env:
  5. - name: INTERVAL
  6. valueFrom:
  7. configMapKeyRef:
  8. name: fortune-config
  9. key: sleep-interval

Pod运行后,容器内的INTERVAL环境变量值就是25;

2. 作为命令行参数

pod.spec.containers.args无法直接引用ConfigMap entries(条目),可以利用configmap先初始化某个环境变量,再在参数字段中引用;

  1. spec:
  2. containers:
  3. - image: luksa/fortune:env
  4. env:
  5. - name: INTERVAL
  6. valueFrom:
  7. configMapKeyRef:
  8. name: fortune-config
  9. key: sleep-interval
  10. # !!!
  11. args: ["$(INTERVAL)"]

3. 将configmap条目暴露为文件

Env和命令行参数传值仅适用于变量值较短的场景,但configmap中可以包含完整的配置文件,如下所示,可以借助于configmap volume;

a.json

  1. server {
  2. listen 80;
  3. server_name www.kubia-example.com;
  4. gzip on;
  5. gzip_types text/plain application/xml;
  6. location / {
  7. root /usr/share/nginx/html;
  8. index index.html index.htm;
  9. }
  10. }

用命令创建configmap:

  1. kubectl create configmap fortune-config --from-file=a.json --from-literal=sleep-interval=25

configmap demo

  1. apiVersion: v1
  2. data:
  3. a.json: |
  4. server {
  5. listen 80;
  6. server_name www.kubia-example.com;
  7. gzip on;
  8. gzip_types text/plain application/xml;
  9. location / {
  10. root /usr/share/nginx/html;
  11. index index.html index.htm;
  12. }
  13. }
  14. sleep-interval: "25"
  15. kind: ConfigMap

关于此处|管道符的含义,点击这里

Usag:使用configMap volume挂载到容器的/etc/nginx/conf.d文件夹下,configmap里的每个条目会自动转换为该文件夹下的文件;

对于这个demo文件夹下有两个文件:a .json、sleep-interval

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: fortune-configmap-volume
  5. spec:
  6. containers:
  7. - image: nginx:alpine
  8. name: web-server
  9. volumeMounts:
  10. - name: config
  11. mountPath: /etc/nginx/conf.d
  12. readOnly: true
  13. volumes:
  14. - name: config
  15. configMap:
  16. name: fortune-config

这种方式的问题时:如果这个容器只需要条目1,但这样会所有条目都暴露出来,存在安全隐患;所以应该只暴露容器需要的条目;

还是针对上面的configmap fortune-config,使用volume的items属性:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: fortune-configmap-volume
  5. spec:
  6. containers:
  7. - image: nginx:alpine
  8. name: web-server
  9. volumeMounts:
  10. - name: config
  11. mountPath: /etc/nginx/conf.d
  12. readOnly: true
  13. volumes:
  14. - name: config
  15. configMap:
  16. name: fortune-config
  17. items: # 使用iterms属性
  18. - key: a.json # configmap条目的key
  19. path: gzip.conf # 条目的value被存在gzip.conf文件中

此时/etc/nginx/conf.d文件夹下仅有gzip.conf这个文件,内容是a .json;对于没有加入到items的其他条目,你可以环境变量,或者命令行参数继续引入;

configmap独立条目作为文件被挂载且不覆盖容器内原有文件夹里的原内容:

  1. spec:
  2. containers:
  3. - name: php
  4. image: php:7.0-apache
  5. volumeMounts:
  6. - mountPath: /var/www/html/index.php
  7. name: index
  8. subPath: indexaaa.php #
  9. volumes:
  10. - name: index
  11. configMap:
  12. name: php-index
  13. items: # 不用items也可以用subpath
  14. - key: index.php
  15. path: indexaaa.php # configmap中的目录index.php对应的值给了相对路径 indexaaa.php,所以上面的subpath要用 相对路径indexaaa.php

不用items也可以用subpath,只要是挂载文件或者文件夹到容器里的已经存在的目录下就可以用subpath不对原有的造成影响。

设置挂载的配置文件权限

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: fortune-configmap-volume
  5. spec:
  6. containers:
  7. - image: luksa/fortune:env
  8. env:
  9. - name: INTERVAL
  10. valueFrom:
  11. configMapKeyRef:
  12. name: fortune-config
  13. key: sleep-interval
  14. name: html-generator
  15. volumeMounts:
  16. - name: html
  17. mountPath: /var/htdocs
  18. - image: nginx:alpine
  19. name: web-server
  20. volumeMounts:
  21. - name: html
  22. mountPath: /usr/share/nginx/html
  23. readOnly: true
  24. - name: config #
  25. mountPath: /etc/nginx/conf.d
  26. readOnly: true
  27. - name: config
  28. mountPath: /tmp/whole-fortune-config-volume
  29. readOnly: true
  30. volumes:
  31. - name: html
  32. emptyDir: {}
  33. - name: config #
  34. configMap:
  35. name: fortune-config
  36. defaultMode: 0660 # rw- rw- ---

四位权限,一般只考虑后三位;详细了解:https://blog.csdn.net/qq_33472414/article/details/92803165?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduend~default-1-92803165.nonecase&utm_term=linux%E6%9D%83%E9%99%90%E6%95%B0%E5%AD%97%E8%A1%A8%E7%A4%BA4%E4%BD%8D&spm=1000.2123.3001.4430

在Pod中引用不存在的Configmap

创建Pod时,configmap不存在,引用了不存在的configmap的容器会启动失败,其他容器能正常启动;

可以标记Configmap引用是可选的:configMapKeyRef.optional: true;即便该configmap引用不存在也可以正常启动容器;

Configmap热更新

Configmap热更新效果是:更新configmap只用,注入到容器内部的配置变动;但热更新是有前提的:

  • 注入环境变量,或者通过subPath挂载的文件都不能动态更新,只有通过目录挂载的configmap才具有热更新功能;

Configmap热更新原理 https://github.com/QingyaFan/container-cloud/issues/2

Configmap-K8s容器的配置文件的更多相关文章

  1. k8s容器挂载配置文件

    1.新建ConfigMap apiVersion: v1 kind: ConfigMap metadata: name: test-conf namespace: default labels: na ...

  2. K8s容器编排

    K8s容器编排 Kubernetes(k8s)具有完备的集群管理能力: 包括多层次的安全防护和准入机制 多租户应用支撑能力 透明的服务注册和服务发现机制 内建智能负载均衡器 强大的故障发现和自我修复能 ...

  3. 微服务与K8S容器云平台架构

    微服务与K8S容器云平台架构 微服务与12要素 网络 日志收集 服务网关 服务注册 服务治理- java agent 监控 今天先到这儿,希望对技术领导力, 企业管理,系统架构设计与评估,团队管理, ...

  4. @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本

    今天遇到了很奇葩的问题,我本机的是以test环境启动的,调用另一个服务接口的时候返回参数却不同,调用接口是没错,怎么会这样,排查了很久,发现在eureka上注册的另一个服务是testone环境,而这个 ...

  5. k8s容器拷贝文件到本地、本地文件拷贝到k8s容器

    k8s容器拷贝文件到本地 kubectl cp qzcsbj/order-b477c8947-tr8rz:/tmp/jstack.txt /root/test/jstack.txt 本地文件拷贝到k8 ...

  6. 使用filebeat收集k8s上pod里的容器日志配置文件模板

    具体使用有待商榷 filebeat.inputs: - type: container paths: - /var/log/containers/*.log processors: - add_kub ...

  7. k8s容器-运维管理篇

    二. 运维和管理 维护参考网址 https://jimmysong.io/kubernetes-handbook/practice/install-kubernetes-on-centos.html ...

  8. k8s容器-节点部署篇

    一. k8s节点部署 1. 环境规划 系统环境概述 系统环境说明 操作系统 Ubuntu16.04 or CentOS7 选的是CentOS7        -        Kubernetes版本 ...

  9. ELK:收集k8s容器日志最佳实践

    简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...

随机推荐

  1. 转换…Transform…(Power Query 之 M 语言)

    转换列: = Table.TransformColumns( 表, {{"列名1", 转换函数1, 数据类型1},-,{"列名n", 转换函数n, 数据类型n} ...

  2. M-SOLUTIONS Programming Contest 2021(AtCoder Beginner Contest 232) 题解

    目录 G - Modulo Shortest Path H - King's Tour 因为偷懒就只写G和H的题解了. G - Modulo Shortest Path 首先可以观察到对于一条从点\( ...

  3. CF615A Bulbs 题解

    Content 有 \(n\) 个灯,一开始它们都是关着的.有 \(m\) 个按钮,每个按钮可以开 \(k\) 盏灯.求能否通过这 \(m\) 个按钮使得所有灯全部都开着. 数据范围:\(1\leqs ...

  4. CF208A Dubstep 题解

    Content 有一个字符串被变换了.其中在这个字符串的前面加了 \(\geqslant 0\) 个 WUB,每个单词(由空格间隔)之间加了 \(\geqslant 1\) 个 WUB,在这个字符串的 ...

  5. SpringCloud Alibaba实战(12:引入Dubbo实现RPC调用)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是老三,断更了半年,我又滚回来继续写这个系列了,还有人看吗-- 在前面的章 ...

  6. java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量

    SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: ""   import ja ...

  7. 从go程序中发消息给winform(C#)

    背景: 1.服务端语言为GO,客户端语言为:C#(WinForm): 2.在客户端操执行长耗时任务时,服务器应该将后台日志或定时将心跳信息及时传递给客户端,这样方便用户查看服务器执行情况(重要). 一 ...

  8. Apache Shiro使用官方自带的生成AES密钥

    package test; import org.apache.shiro.codec.Base64; import javax.crypto.KeyGenerator; import javax.c ...

  9. 分割字符串StringTokenizer

    StringTokenizer 原来是一个遗留类,并未被废弃,只是出于兼容性原因而被保留,在新代码中已经不鼓励使用它了,建议使用 String 的 split 方法或 java.util.regex ...

  10. Chapter 10 Random Variability

    目录 10.1 Identification versus estimation 10.2 Estimation of causal effects 10.3 The myth of the supe ...