背景
ASP.NET Core默认的配置文件定义在 和 文件中。这里面有一个问题就是,在使用容器部署时,每次修改配置文件都需要重新构建镜像。当然你也可能会说,我的配置文件很稳定不需要修改,但你又如何确保配置文件中一些机密配置的安全问题呢?比如暴露了你的远程数据库的连接信息,哪天被员工不小心删库跑路了呢?那接下来就来讲解下如何在.NET Core 中正确使用ConfigMap。
ConfigMap/Secret
K8S中引入了ConfigMap/Secret来存储配置数据,分别用于存储非敏感信息和敏感信息。其目的在于将应用和配置解耦,以确保容器化应用程序的可移植性。
创建 ConfigMap
ConfigMap的创建很简单,一句命令就可以直接将 文件转换为ConfigMap。
PS:使用K8S一定要善用帮助命令,比如执行 ,你就可以了解到多种创建ConfigMap的方式。
其中我们可以看到可以通过指定 来从指定文件创建。
Let's have a try!
1.先行创建示例项目:
2.默认包含两个配置文件 和
3.先来尝试将 转换为ConfigMap:
从上面的输出结果来看,其中包含了 换行符,显然不是我们想要的结果。猜测是因为Windows和Linux系统换行符的差异导致的。先来插播下换行符的知识:
CR:Carriage Return,对应ASCII中转义字符\r,表示回车LF:Linefeed,对应ASCII中转义字符\n,表示换行CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行众所周知,Windows操作系统采用两个字符来进行换行,即CRLF;Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;
所以解决方式就很简单,将换行符切换为Linux系统的 即可。操作方式很简单:对于VS Code 只需要按图下所示操作即可,点击右下角的 ,选择 即可。
对于VS,如果VS打开json文件有下面的提示,直接切换就好。没有,可以安装Line Endings Unifier)扩展来统一处理。
现在ConfigMap的格式正常了。下面我们尝试把 也合并到一个ConfigMap中。
PS:
如果你的配置文件包含多余的空格,则生成的ConfigMap可能就会包含 字符,就像这样: 。解决办法就是保存文件时记得格式化文件就好了,或者手动删除多余空格。
创建ConfigMap的时候可以指定 参数进行试运行,避免直接创建到服务器。
从文件创建ConfigMap时,可以不指定Key,默认会以文件名为Key。
至此,完成了appsetting到configmap的切换。
应用 ConfigMap
ConfigMap的应用很简单,只需要将configmap挂载到容器内的独立目录即可。
先来看一下借助VS帮生成的Dockerfile。
可以看出文件中定义的 指定的工作目录为 ,所以需要把ConfigMap挂载到 目录下。先执行 构建镜像。
我们来新建一个 文件配置如下:
这里有必要解释两个参数:
volumes:-configMap:指定引用哪个ConfigMap
volumeMounts:用来指定将ConfigMap中的配置挂载到容器的哪个路径
subPath:用来指定引用ConfigMap的哪个配置节点。
创建Deployment之前先修改下ConfigMap的配置,以方便确认最终成功从ConfigMap挂载配置。将 节点的默认值改为Error。
修改完毕后,执行后续命令来创建Deployment,并验证。
从以上输出可以看出,默认的配置项已被ConfigMap的配置覆盖。
热更新
以Volume方式挂载的ConfigMap支持热更新(大概需要10s左右)。但一种情况例外,就是指定subPath的情况下,更新ConfigMap,容器中挂载的ConfigMap是不会自动更新的。
A container using a ConfigMap as a subPath volume will not receive ConfigMap updates.
对于这种情况,也很好处理,将ConfigMap挂载到 目录下一个单独目录就好,比如挂载到 目录,然后修改配置文件的加载路径即可。
最后
本文就.NET Core如何应用ConfigMap进行了详细的介绍。其中最关键在于appsettings.json到ConfigMap的转换,以及挂载目录的指定。希望对你有所帮助。而至于Secret的应用,原理相通了,关键在于Secret的生成,这里就交给你自己探索了。
领取专属 10元无门槛券
私享最新 技术干货