可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

写在前面
为了不违反广告法,我竭尽全力,不过“最佳实践”确是标题党无疑,如果硬要说的话 只能是个人最佳实践。
问题引出
可能很多新手都会遇到同样的问题:我要我的Asp.net Core 应用传统方式直接部署(host),docker部署(docker-compose),kubernetes(以下称k8s)下部署,都用统一的方式读取配置,怎么实现呢?。
大家知道,我们默认平时配置文件以appsettings.json 、appsettings.{EnvironmentName}.json 形式存在,这样在host方式下面没有问题,但在docker下,如果直接把配置打包到镜像,那每次改一下下配置就需要重新打包,那成本太大了。另外在k8s下面又有Secret、ConfigMap等多种方式管理配置,如何把多种配置存储和读取,有机结合、同一份代码统一管理使用,是我们今天的主题。
下面我用一个Api网关Ocelot作为示例(demo),讲讲我处理的方式,希望能给大家带来一定启发。
一、先把配置文件改成Yaml格式
注:
其实不改为yml也可以的!!
主要考虑到后面在docker、k8s等里面,更好管理,比如yaml的注释和json的注释语法不一致等等问题;
比如我原来的appsettings.json长这样:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"AddAdministration": {
"Path": "/administration",
"IdentityServer": {
"Authority": "http://172.16.3.117:5100",
"ApiName": "ocelot",
"RequireHttpsMetadata": false,
"ApiSecret": "secret"
}
}
}
改成 appsettings.yml
Logging:
LogLevel:
Default: Information
Microsoft: Warning
Microsoft.Hosting.Lifetime: Information
AllowedHosts: '*'
AddAdministration:
Path: /administration
IdentityServer:
Authority: 'http://172.16.3.117:5100'
ApiName: ocelot
RequireHttpsMetadata: false
ApiSecret: secret
是不是看起来简单清晰了很多,其实我现在越来越喜欢用yml了
既然配置源的格式变了,那读取配置的方法也肯定变了,起码config.AddJsonFile(“xx.json”) 要改为 config.AddYamlFile(“xx.yml”)
新增引用的扩展:NetEscapades.Configuration.Yaml
加载配置文件改写为:
.AddYamlFile("appsettings.yml", optional: false, reloadOnChange: true)
.AddYamlFile($"appsettings.{env.EnvironmentName}.yml", optional: true, reloadOnChange: true)
二、Docker使用
“但在docker下,如果直接把配置打包到镜像,那每次改一下下配置就需要重新打包,那成本太大了”
我前面提出了这个问题,如想不重新打包,Volume(挂载)就好了。
把你的配置文件放到/home/heidemo/config目录后,比如我们什么的示例配置文件: appsettings.yml
docker run --rm=true -v /home/heidemo/config:/config gebiwangshushu/hei-ocelot-apigateway:1.0
这样就可以随性更新/home/heidemo/config下的配置信息而不需要每次都重新build镜像了,这样是支持热更新的,当然如果你修改的那个配置是需要重启程序才可以加载的,那还是要用docker-compose 重启下对应服务的;
三、docker-compose使用
我们知道 Docker是 官方编排(Orchestration)项目之一,如果我们在Docker环境下挂载配置的话,那在docker-compose下面的配置也是挂载的,我们来看下我们掐头去尾后的 docker-compose.yml:
version: '3.4'
services:
hei.ocelot.apigateway:
...
volumes:
- /home/heidemo/config:/app/config
...
没错,docker-compose 额挂载就这么定义,这样可以实现跟Docker一样的挂载效果;
大家可以用以上配置 clone我的demo,然后 docker-compose up 一下,看看效果;
四、k8s使用
前面的docker、docker-compose 的方式还是非常容易理解的,就是挂载;那我们在k8s下面运行的时候,它的容器实例是动态的运行到集群的各台机器上的,那如果我们我们只用文件挂载很明显就不满足要求了,我们来看看怎么实现。
先准备一个configMap,hei-ocelot-config.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: hei-ocelot-apigateway
namespace: dotnetcore
data:
appsettings.yml: |
Logging:
LogLevel:
Default: Information
Microsoft: Warning
Microsoft.Hosting.Lifetime: Information
AllowedHosts: '*'
AddAdministration:
Path: /administration
IdentityServer:
Authority: 'http://172.16.1.30:31100' #这里的授权中心可以配置你自己的
ApiName: ocelot
RequireHttpsMetadata: false
ApiSecret: secret
完整请看这里
大家可以看到,我们的data节点是跟我们程序里面的appsettings.json一样一样的,这也是我们比较喜欢不再用json的原因。
创建configMap:
kubectl apply -f hei-ocelot-config.yml
查看configMap:
kubectl describe configmaps hei-ocelot-apigateway -n dotnetcore

使用configMap:
这里是使用示例,在我的demo根目录下面完整配置deploy.yml 是可以直接部署的。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hei-ocelot-apigateway
namespace: dotnetcore
spec:
replicas: 1
selector:
matchLabels:
app: hei-ocelot-apigateway
template:
metadata:
labels:
app: hei-ocelot-apigateway
spec:
containers:
- name: hei-ocelot-apigateway
image: gebiwangshushu/hei-ocelot-apigateway:1.1
ports:
- containerPort: 80
volumeMounts:
- name: hei-ocelot-apigateway
mountPath: "/app/config"
readOnly: true
volumes:
- name: hei-ocelot-apigateway
configMap:
name: hei-ocelot-apigateway
可以看到我们在k8s下面也是用volumes的方式使用我们的configMap的,其中挂载目录volumeMounts:mountPath是"/app/config",我们进入运行中pod看下配置:
kubectl exec -it hei-ocelot-apigateway-795495f7c8-vpmhb sh -n dotnetcore
cd /app/config
我们可以看到我们的pod里面的/app/config ,确确实实有我们要的配置;

这里因为我们是volumes 的方式的,大家可以试着改下上面的configMap-- hei-ocelot-config.yml 再重新apply 一下,会看到这里的配置是几乎是即时更新的(有一点点延迟);
PS:有一个问题有些在startup使用的配置,即时更新了也需要重启下应用,这个我暂时还没想到什么办法好办法,各位老哥有什么思路的可以直接甩我一脸~
总结
其实写完我觉得也有点怪怪,说新手引导吧,不够保姆式、说经验分享,不够精简,下次我定好好想,认真写好点;
然后我的主题,其实思考过同样问题的读者,全文就一句:volumes挂载配置做到各种环境下的配置统一;
最后,我提出了一个问题:程序启动使用的配置,如何在配置文件更新的情况后重启程序应用新配置(或者叫热加载配置?当然这里不是指配置文件的reloadOnChange=true);
github:https://github.com/gebiWangshushu/Hei.Ocelot.ApiGateway
可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践的更多相关文章
- Docker+Kubernetes(k8s)微服务容器化实践
第1章 初识微服务微服务的入门,我们从传统的单体架构入手,看看在什么样的环境和需求下一步步走到微服务的,然后再具体了解一下什么才是微服务,让大家对微服务的概念有深入的理解.然后我们一起画一个微服务的架 ...
- 从头认识一下docker-附带asp.net core程序的docker化部署
从头认识一下docker-附带asp.net core程序的docker化部署 简介 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是 ...
- 理解ASP.NET Core - [04] Host
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 本文会涉及部分 Host 相关的源码,并会附上 github 源码地址,不过为了降低篇幅,我会 ...
- 如何将 asp.net core 应用进行 docker 容器部署
asp.net core 部署在 docker 容器中比较简单,但常因asp.net core程序发布的问题造成容器无法正常启动.现在把详细的操作的步骤记录如下: 一.asp.net core web ...
- [ASP.NET Core开发实战]基础篇06 配置
配置,是应用程序很重要的组成部分,常常用于提供信息,像第三方应用登录钥匙.上传格式与大小限制等等. ASP.NET Core提供一系列配置提供程序读取配置文件或配置项信息. ASP.NET Core项 ...
- ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)
先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn& ...
- asp.net core 3.0 MVC JSON 全局配置
asp.net core 3.0 MVC JSON 全局配置 System.Text.Json(default) startup配置代码如下: using System.Text.Encodings. ...
- [ASP.NET Core 3框架揭秘] Options[1]: 配置选项的正确使用方式[上篇]
依赖注入不仅是支撑整个ASP.NET Core框架的基石,也是开发ASP.NET Core应用采用的基本编程模式,所以依赖注入十分重要.依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式 ...
- [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]
四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options ...
随机推荐
- easy tornado
easy tornado 题目分析 这是一道2018年护网杯的题目 /flag.txt /welcome.txt /hints.txt 一共有3个文件. /flag.txt flag in /flll ...
- C语言中的内存对齐问题
问题 突然收到了一个问题: #include<stdio.h> #include <math.h> struct icd { int a; //4 char b; //1 do ...
- 机器学习实战基础(十一):sklearn中的数据预处理和特征工程(四) 数据预处理 Preprocessing & Impute 之 处理分类特征:编码与哑变量
处理分类特征:编码与哑变量 在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的 ...
- 数据可视化之分析篇(七)Power BI数据分析应用:水平分析法
https://zhuanlan.zhihu.com/p/103264851 首先,以财务报表分析为例,介绍通用的分析方法论,整体架构如下图所示: (点击查看大图) 接下来我会围绕这五种不同的方法论, ...
- AI开发利器:HiLens Studio技术解读
摘要:传统的AI应用开发和部署意味着高成本和高门槛,借助HiLens Studio,AI应用开发和部署仅需要三步. 曾几何时, 在我们青春年少时, 当我们看到某篇AI的技术文章时, 心中总不免想要在一 ...
- 导出数据到Excel的时候报JAVA.LANG.NOSUCHMETHODERROR: ORG.APACHE.POI.SS.USERMODEL.CELLSTYLE.SETVERTICALALIGNMENT(LORG/APACHE/POI/SS/USERMODEL/VERTICALALIGNMENT;)V
JAVA.LANG.NOSUCHMETHODERROR: ORG.APACHE.POI.SS.USERMODEL.CELLSTYLE.SETVERTICALALIGNMENT(LORG/APACHE/ ...
- 基于python的自动化测试框架搭建
滴~ 今日打卡! 好多天没来打卡了.博主最近一直在把碎片化知识转化为知识体系的过程中挣扎.Python语言.selenium.unittest框架.HTMLTestRunner框架都有所了解,也写 ...
- Python Ethical Hacking - BeEF Framework(2)
Basic BeEF commands: Login the BeEF Control Panel, and go to Commands page. Create Alert Dialog: Run ...
- IDM的“免费版”NDM免费的下载工具
软件截图 软件介绍 免费小巧的多线程下载工具,支持断点续传,支持浏览器扩展,嗅探下载音视频文件. 和IDM差不多,只不过是免费的 下载软件 Win 我提供的UCloud-OSS 官网下载 Mac 我提 ...
- 轻量级分布式延时任务处理组件easyTask-L-入门篇
今天给大家介绍一款新武器.我自研的一个java组件easyTask-L.这个是做啥的呢?我之前研发了一款单机版本的easyTask,这次是要介绍另外一款easyTask-L.区别就是后者支持分布式环境 ...