一、ConfigMap
概念
ConfigMap的功能在k8s1.2版本中引入的,许多应用程序会从配置文件,命令行参数或环境变量中读取配置信息。ConfigMap API会给我们提供了向容器中注入配置信息的机制,ConigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制的对象
1. 为什么需要configmap
我们经常都需要为我们的应用程序配置一些特殊的数据,比如密钥、Token 、数据库连接地址或者其他私密的信息。你的应用可能会使用一些特定的配置文件进行配置,比如settings.py文件,或者我们可以在应用的业务逻辑中读取环境变量或者某些标志来处理配置信息。我们要做到这个,有好多种方案,比如:
- 我们可以直接在打包镜像的时候写在应用配置文件里面,但是这种方式的坏处显而易见而且非常明显。
- 我们可以在配置文件里面通过 env 环境变量传入,但是这样的话我们要修改 env 就必须去修改 yaml 文件,而且需要重启所有的 container 才行。
通过env设置不同的环境,使用不同的yaml配置文件
- 我们可以在应用启动的时候去数据库或者某个特定的地方拿,没问题!但是第一,实现起来麻烦;第二,如果配置的地方变了怎么办?
当然还有别的方案,但是各种方案都有各自的问题。
而且,还有一个问题就是,如果说我的一个配置,是要多个应用一起使用的,以上除了第三种方案,都没办法进行配置的共享,就是说我如果要改配置的话,那得一个一个手动改。假如我们有 100 个应用,就得改 100 份配置,以此类推……
kubernetes 对这个问题提供了一个很好的解决方案,就是用 ConfigMap 和 Secret。
有很多种方案可以将项目 和 项目的配置解耦:
configMap就是让项目镜像 和 配置、环境变量、配置文件等配置数据 解耦,保证镜像的可移植性
- ConfigMap功能在kubernetes1.2版本中引入,许多应用程序会从配置文件,命令行参数或环境变量中读取配置信息,ConfigAPI给我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
- ConfigMap对像是一系列配置的集合,k8s会将这一集合注入到对应的Pod对像中,并为容器成功启动使用。注入的方式一般有两种,一种是挂载存储卷,一种是传递变量。ConfigMap被引用之前必须存在,属于名称空间级别,不能跨名称空间使用,内容明文显示。ConfigMap内容修改后,对应的pod必须重启或者重新加载配置(支持热更新的应用,不需要重启)。
- Secret类似于ConfigMap,是用Base64加密,密文显示,一般存放敏感数据。一般有两种创建方式,一种是使用kubectl create创建,一种是用Secret配置文件。
2. 应用场景
应用场景:镜像往往是一个应用的基础,还有很多需要自定义的参数或配置,例如资源的消耗、日志的位置级别等等,这些配置可能会有很多,因此不能放入镜像中,Kubernetes中提供了Configmap来实现向容器中提供配置文件或环境变量来实现不同配置,从而实现了镜像配置与镜像本身解耦,使容器应用做到不依赖于环境配置。
向容器传递参数:
Docker | Kubernetes | 描述 |
---|---|---|
ENTRYPOINT | command | 容器中的可执行文件 |
CMD | args | 需要传递给可执行文件的参数 |
Kubernetes如果需要向容器传递参数,可以在Yaml文件中通过command和args或者环境变量的方式实现。(不使用configMap的场景)
示例: demo-mpconft.yaml
apiVersion: v1
kind: Pod
metadata:
name: print-mapenv
spec:
containers:
- name: env-print-demo
image: centos:7.9.2009
imagePullPolicy: IfNotPresent
env: #添加了一个环境变量
- name: GREETING
value: "hello"
- name: HONORIFIC
value: "welcome"
- name: NAME
value: "Kubernetes is a good product"
command:
- "echo" #执行echo命令
args:
- "$(GREETING) $(HONORIFIC) $(NAME)" #命令中传入了这些参数,引用的就是上面env中定义的
等待一会儿时间后,看到STATUS是Completed,Ready是0/1,pod中的容器已经结束了 因为我们yaml文件里就要求容器运行以后只执行一条指令,执行完成后就结束了
# 创建后,命令 echo hello welcome Kubernetes is a good product 将在容器中运行,也就是环境变量中的值被传递到了容器中。
# 查看pod就可以看出
# [root@k8s-master yaml]# kubectl logs print-mapenv
hello welcome Kubernetes is a good product
现在测试的这种情况是将配置数据和yaml资源文件耦合在一起了,接下来我们使用configMap分离
3. 创建ConfigMap
3.1 help文档
通过hepl命令可以查看configmap的用法:
# [root@k8s-master-155-221 configmap]# kubectl create configmap --help
......
Aliases:
configmap, cm #可以使用cm替代
Examples:
# Create a new configmap named my-config based on folder bar
# 从目录创建 文件名称为键 文件内容为值
kubectl create configmap my-config --from-file=path/to/bar
# Create a new configmap named my-config with specified keys instead of file basenames on disk
# 从文件创建 key1为键 文件内容为值
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
# Create a new configmap named my-config with key1=config1 and key2=config2
# 直接命令行给定,键为key1 值为config1
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
# Create a new configmap named my-config from the key=value pairs in the file
# 从文件创建 文件名为键 文件内容为值
kubectl create configmap my-config --from-file=path/to/bar
# Create a new configmap named my-config from an env file
kubectl create configmap my-config --from-env-file=path/to/bar.env
Usage:
kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run=server|client|none]
[options]
Use "kubectl options" for a list of global command-line options (applies to all commands).
3.2 使用目录创建
# 指定目录
# 创建configmap目录
# ls /opt/yaml/configmap
# 创建game.properties文件
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
# ui.propertes文件
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
# 创建configmap ,指令
# game-config-test :configmap的名称
# --from-file:指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
# [root@k8s-master configmap]# kubectl create configmap game-config-test --from-file=/opt/yaml/configmap
configmap/game-config-test created
# 查看configmap文件
# [root@k8s-master configmap]# kubectl get cm
NAME DATA AGE
game-config-test 2 24s
# 查看详细信息 -o 指定输出格式为yaml
# [root@k8s-master configmap]# kubectl get cm game-config-test -o yaml
apiVersion: v1
data:
game.properties: | # | 前是文件名; | 后是文件内容
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.propertes: | # | 前是文件名; | 后是文件内容
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
kind: ConfigMap # 类型
metadata:
creationTimestamp: "2021-06-04T06:45:42Z"
name: game-config-test # 名称
namespace: default # 命名空间
resourceVersion: "625034"
uid: 8a7f0064-f816-4e70-a367-bd37371dcaec
data就是数据区,存放的就是配置文件,key就是文件名,后面"|"后跟的就是配置文件内容,这个是yaml语法