Kubernetes学习笔记-ConfigMap和Secret:配置应用程序(2)20220502

利用ConfigMap解耦配置

应用配置的关键在于能够在多个环境中区分配置选项,将配置从应用程序源码中分离,可频繁变更配置值。
1)ConfigMap介绍
kubernetes允许将配置选项分离到单独的资源对象ConfigMap中,就是一个键/值对映射。值可以是短字面量,也可以是完整的配置文件。应用无须直接读取ConfigMap,甚至根本不需要知道其是否存在。映射的内容通过环境变量或者卷文件的形式传递给容器,而并非直接传递给容器。
不管应用具体是如何使用configmap的,将配置存放在独立的资源对象中有助于在不同环境(开发、测试、质量保障和生产等)下拥有多份同名的配置清单


2)创建ConfigMap
使用指令kubectl create configmap
$kubectl create configmap fortone-config - -from-litreral =sleep-interval=25
注意:ConfigMap中的键名必须是一个合法的DNS子域,仅包含数字字母、破折号、下划线以及圆点。首位的圆点符号是可选的
configmap一般包含多个映射条目。通过添加多个- -from-literal可创建包含多个条目的configmap
通过kubectl 创建configmap的yaml文件
$kubectl create -f fortune-config.yaml
从文件内容创建Configmap条目:
$kubectl create configmap my-config - -from-file=config-file.conf
运行上述命令时,kubectl 会在当前目录下查找config-file.conf文件,并将文件内容存储在ConfigMap中以config-file.conf为键名的条目下
从文件夹创建ConfigMap
$kubectl create configmap my-conf - -from-file=/path/to/dir
合并不同选项
创建ConfigMap时可以混合使用提到的所有选项
$kubectl create configmap my-config
--from-file=foo.json
- -from-file=bar=foobar.config
- -from-file=config-opts/
- -from-literal=some=thing


3)给容器传递ConfigMap条目作为环境变量
将映射中的值传递给pod的容器,三种方法,其中最为简单的一种:设置环境变量
在创建pod的yaml文件中指定环境变量
ApiVersion:v1
kind:Pod
metadata:
name:fortune-env-from-configmap
spec:
containers:
-image:luksa/firtune:env
env:
-name:INTERVAL
valueFrom:
configMapKeyRef:
name:fortune-config
key:sleep-interval

这里定义了一个环境变量INTERVAL,并将其值设置为fortune-config ConfigMap值键名为sleep-interval对应的值
在pod中引用不存在的ConfigMap
kubernetes会正常调度pod并尝试运行所有的容器,如果pod定义的ConfigMap不存在,则该容器会启动失败,其他容器正常启动,如果之后创建了这个缺失的ConfigMap失败容器会自动启动,无须重新创建pod
注意:可以标记对ConfigMap的引用是可选的(设置configMapKeyRef.optional:true),这样即使ConfigMap不存在,容器也能正常启动


4)一次性传递ConfigMap的所有条目作为环境变量
如果configmap包含很多条目,之前的方法为每个条目单独设置环境变量的过程就很单调乏味且容器出错,可以使用kubernetes提供的暴露ConfigMap的所有条目作为环境变量的手段(1.6版本开始)
如果一个ConfigMap包含FOO、BAR、FOO-BAR三个键,可以通过envFrom属性字段将所有条目暴露作为环境变量
示例:
spec:
containers:
-image:some-image
envFrom:
-prefix:CONFIG_
configMapRef:
name:my-config-map

注意:前缀是可选的,若不设置前缀值,环境变量名称与ConfigMap中的键名相同
另:FOO-BAR包含破折号,这不是一个合法的环境变量名称,kubernetes不会主动转换键名!如果ConfigMap的某键名格式不正确,创建环境变量时会忽略对应的条目


5)传递ConfigMap条目作为命令行参数
在字段pod.spec.containers.args中无法直接引用ConfigMap的条目,但可以利用ConfigMap条目初始化某个环境变量,然后再在参数字段中引用该环境变量
示例:
……
spec:
containers:
-image:luksa/fortune:args
env:
-name:INTERVAL
valueFrom:
configMapKeyRef:
name:fortune-config
key:sleep-interval
args:[“$(INTERVAL)”]
………
环境变量的定义与之前相同,需通过$(ENV_VARIABLE_NAME)将其环境变量的值注入参数值


6)使用ConfigMap卷将条目暴露为文件
前面的环境变量或命令行参数值作为配置值通常适用于变量值较短的场景。ConfigMap中包含完整的配置文件内容,可以借助configMap卷将其暴露给容器
configMap卷会将ConfigMap中的每个条目均暴露成一个文件。运行在容器中的进程可通过读取文件内容获取对应条目的值
这种方法既适用于传递较大的配置文件给容器,也适用于传递较短的变量值
创建ConfigMap
使用配置文件配置运行在fortune pod的web服务器容器中的nginx web服务器。
如想要nginx服务器压缩传递给客户端的响应,nginx的配置文件需要开启压缩配置
开启gzip压缩的nginx的配置文件my-nginx-config示例:
server{
listen 80;
server_name www.kubia-example.com
gzip on;
gzip_types text/plain application/xml;

location /{
root /usr/share/nginx/html;
index index.html index.htm;



创建ConfigMap文件Yaml文件
ConfigMap里面包含了两个条目,条目的键名与文件名相同
在卷内使用ConfigMap条目
创建包含ConfigMap条目内容的卷只需要创建一个引用ConfigMap名称的卷并挂载到容器
pod定义中包含了引用fortune-config ConfigMap的卷,需要被挂载到文件夹/etc/nginx/conf.d下让Nginx服务器使用它
检查Nginx是否使用被挂载的配置文件
$kubectl port-foeward fortune-configmap-volume 8080:80 &
$curl -H “Accept-Encoding:gzip” -I localhost:8080
检查被挂载的ConfigMap卷的内容
$kubectl exec fortune-configmap -volume -c web-server ls /etc/nginx/conf.d
卷内暴露指定的ConfigMap条目
通过卷的items属性能够指定哪些条目会被暴露作为ConfigMap卷中的文件
pod的yaml文件
指定单个条目时需同时设置条目的键名称以及对应的文件名
挂载某一文件夹会隐藏该文件夹中已经存在的文件
如何处理?
ConfigMap独立条目作为文件被挂载且不隐藏文件夹中的其他文件,volumeMount额外的subPath字段可以被用作挂载卷中某个对文件或者文件夹,无须挂载完整卷

示例:
spec:
containers:
-image:some/image
volumeMounts:
-name:myvolume
mountPath:/etc/someconfig.conf
subPath:myconfig.conf
挂载任意一种卷时均可使用subPath属性。可以选择挂载部分卷而不是挂载完整的卷
为configMap卷中的文件设置权限
configMap卷中所有的文件权限默认被设置为644,可以通过卷规格定义中的defaultMode属性改变默认权限
ConfigMap通常被用作存储非敏感数据,不过依旧可能希望仅限于文件拥有者的用户和组可读写


7)更新应用配置且不重启应用程序
之前的环境变量或命令行参数作为配置源的弊端在于无法在进程运行时更新配置。将ConfigMap暴露为卷可以达到配置热更新的效果,无须重新创建pod或者重启容器

ConfigMap被更新之后,卷中引用它的所有文件也回相应更新,进程发现文件被更新后进行重载。Kubernetes同样支持文件更新之后手动通知容器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值