上一篇文章讲了 k8s 使用 helm 打包 chart 并上传到腾讯云 TencentHub, 今天就讲一下使用 Helm 部署应用并使用 configMap 代替 ASP.NET core 中的 appsettings.JSON 文件.
把 Chart 上传到 TencentHub 之后, 我们就可以通过腾讯云的容器服务, 直接部署 Helm 应用了.
部署 Helm 应用
点击新建然后选择 TencentHub, 私有仓库, 就可以看到自己上传的 Chart 了. 填写一下应用名称, 拉到最下方点击完成即可创建应用.
注意: 如果你的 YAML 文件写的不对, 如少个空格, 变量参数名称写错或者不存在, 都无法创建成功.
可以点击新建下方那个查看详情, 可以看到 Helm 应用安装日志, 安装失败会提示错误信息, 自己跟据错误提示修复自己的错误.
成功安装后点击应用可以查看资源信息和状态
注意: Chart 部署成功不代表你的服务已经成功启动了, 如果你的服务本身是有问题起不来的话, 这里不会有提示, 需要自己去查看 Pod 是否已经正常启动成功.
好了, 应用部署完成后, 我们来试试如何读取 configMap.
读取 configMap
上篇文章没有把 config.YAML 文件的内容放出来, 里面内容如下
其中 metadata 中的 name 是必选项, namespace 不写的话默认是 default,labels 用于条件过滤筛选.
data 就是我们的配置内容, key-value 的形式存在.
------------------------------------------------ 分割线 -----------------------------------------------------
.net core 调用 k8s 需要使用 KubeClient, 这里我使用 https://github.com/tintoy/dotnet-kube-client 来调用 k8s 的接口.
直接使用 nuget 搜索 KubeClient 即可找到.
KubeClient 支持依赖注入. 需要安装
- KubeClient.Extensions.DependencyInjection
- void ConfigureServices(IServiceCollection services)
- {
- services.AddKubeClient(new KubeClientOptions
- {
- ApiEndPoint = new Uri("http://localhost:8001"),
- AuthStrategy = KubeAuthStrategy.BearerToken,
- AccessToken = "my-access-token",
- AllowInsecure = true // Don't validate server certificate
- });
- }
最简单的创建一个 KubeClient 方法如下:
- KubeApiClient client = KubeApiClient.Create(new KubeClientOptions
- {
- ApiEndPoint = new Uri("http://localhost:8001"),
- AuthStrategy = KubeAuthStrategy.BearerToken,
- AccessToken = "my-access-token",
- AllowInsecure = true // Don't validate server certificate
- });
这里我只是简单读取 k8s 中的 configMap, 至于用途下面再讲.
使用 console 控制台程序编写如下代码.
- class Program
- {
- static async Task Main(string[] args)
- {
- KubeApiClient client = KubeApiClient.Create(new KubeClientOptions
- {
- ApiEndPoint = new Uri("https://xxxxxxx.tencent-cloud.com"),
- AuthStrategy = KubeAuthStrategy.BearerToken,
- AccessToken = "GzxxxxxxxxxxxxxT",
- AllowInsecure = true // Don't validate server certificate
- });
- var configClient = client.ConfigMapsV1();
- var configList = await configClient.List( labelSelector:"configMap=wechat", kubeNamespace: "dev" );
- Console.WriteLine(JsonConvert.SerializeObject(configList));
- Console.ReadKey();
- }
- }
使用 KubeApiClient 获取一个 configClient, 然后 configClient.List()获取 k8s 中的所有 configMap,labelSelector 和 kubeNamespace 都是默认可空参数, 用于过滤筛选 configMap.
这里我们通过断点可以看到, 已经读取到 wechat 中的 configMap 信息, AppMode:Devlopment 就是我们 config.YAML 中 data 中的内容.
至此我们已经完成了. net core 读取 configMap 的事情了.
ASP.NET core 中加载 configMap
使用 nuget 安装
KubeClient
和
KubeClient.Extensions.Configuration
在 Startup.cs 中的构造函数添加下面代码即可.
- var configBuilder = new ConfigurationBuilder();
- var client = KubeApiClient.Create(new KubeClientOptions
- {
- ApiEndPoint = new Uri("https://xxxxxxx.tencent-cloud.com"),
- AuthStrategy = KubeAuthStrategy.BearerToken,
- AccessToken = "GzxxxxxxxxxxxxxT",
- AllowInsecure = true // Don't validate server certificate
- });
- )
- configuration.AddKubeConfigMap(client, "extensions-sample", reloadOnChange: true);
- Configuration = configBuilder.Build();
使用 configMap 的原因
现在 ASP.NET core 一般是使用 appsettings.JSON 文件来读取项目的配置信息, 这样做非常简单易容, 但是在生产环境特别是微服务上面我们往往需要一个配置中心来管理应用配置.
目前充当配置中心的产品有很多, 如携程的 Apollo https://github.com/ctripcorp/apollo ,springCloud 中的 SpringCloudConfig, https://github.com/hashicorp/consul 也可以充当配置中心.
这些都需要额外部署多一个服务, 而 configMap 也可以实现配置中心的功能, 何乐而不为呢. 至于有不同意见的读者, 欢迎评论指点指点.
k8s 中存储配置信息的不只 configMap, 一些敏感信息, 我们可以使用 Secret,Secret 以密文的方式存储数据, 避免了直接在配置文件中保存敏感信息.
Pod 可以通过 Volume 或者环境变量的方式使用 configMap 和 Secret.
总结一下
由于自己也是刚接触这个不久, 很多都还不没有深入理解到, 就暂且说说遇到的一些问题吧......
首先最基本的, YAML 格式错误, YAML 很好用无需置疑, 但是当配置信息以多起来的时候, YAML 空格的问题就容易犯了, 毕竟谁不会手误呢~~~( ͡° ͜ʖ ͡°)
一个是 YAML 的分号: 后面必须加上一个空格. 另一个是 YAML 的对象层级是跟据空格划分的, 虽然没有规定几个空格一层, 但是要同层次的空格都是必须一致的. 在 YAML 上面慎用 TAB......(o)
然后呢, 就是 Chart 模板的配置信息.
Chart 模板中资源类型是通过 kind 区分的, 然后资源的基本信息是在 metadata 中描述.
比如说 config.YAML 中, kind 是 ConfigMap.
metadata 中包含资源的 name,namespace,labels 等, 虽然至于 name 是必须项, 但是最好尽量把能写的都写上.
第一次操作的时候只填写了 name, 然后再查询的时候怎么都查不出来 (ノへ~,) 然后才知道 namespace 不对...... 默认 namespace 是 defalut 〒▽〒
然后, 把 namespace 补上去了, 然后再拉一次, 出来了, 但是是一次性拉取 namespace 下的所有 configMap, 没法过滤, 然后看了下 API 才发现可以用 label 过滤(;´༎ຶД༎ຶ`)
嗯, 然后又补了个 labels 上去了╮(╯▽╰)╭
嗯, 还有其他很多细节, 暂时还没去接触, 这就不说了()
最后
最后呢, 期待各位大佬指点指点○( ^皿^)っ Hiahiahia...
来源: https://www.cnblogs.com/fanshaoO/p/10406325.html