上一篇文章讲了 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,springCloud中的SpringCloudConfigconsul也可以充当配置中心。

这些都需要额外部署多一个服务,而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…

部署Chart应用并使用.net core读取Kubernetes中的configMap的更多相关文章

  1. .net core 读取本地指定目录下的文件

    项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------beg ...

  2. ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings,及.NET Core控制台项目中读取AppSettings

    问: ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings 答: Dependency injection is possible in filters as ...

  3. 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?

    原文:如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容? 文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和 ...

  4. .net core 读取appsettings.json乱码

    .net core 读取配置文件乱码:vs2019读取appsettings.json乱码问题; .net core 读取appsettings.json乱码问题;用notepad++或者其他编辑器打 ...

  5. ASP.NET Core 2.0 中读取 Request.Body 的正确姿势

    原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...

  6. 深入理解 EF Core:EF Core 读取数据时发生了什么?

    阅读本文大概需要 11 分钟. 原文:https://bit.ly/2UMiDLb 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能 ...

  7. ASP.NET Core 5.0 中读取Request中Body信息

    ASP.NET Core 5.0 中读取Request中Body信息 记录一下如何读取Request中Body信息 public class ValuesController : Controller ...

  8. Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例

    在<Kubernetes中分布式存储Rook-Ceph部署快速演练>文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernete ...

  9. java的poi技术下载Excel模板上传Excel读取Excel中内容(SSM框架)

    使用到的jar包 JSP: client.jsp <%@ page language="java" contentType="text/html; charset= ...

随机推荐

  1. HDU-5706

    GirlCat Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem Desc ...

  2. jQuery匿名函数$(function(){ }

    搬运原地址:https://zhidao.baidu.com/question/473318430.html $(function(){ }实际上是匿名函数.这是JQuery的语法,$表示JQuery ...

  3. 全文检索-Lucene.net

    Lucene.net是Lucene的.net移植版本,在较早之前是比较受欢迎的一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎. ...

  4. Linux(二十二)Ubuntu安装和配置

    Ubuntu的介绍 Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu是基于GNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球化的专业开发团队(Ca ...

  5. Python《学习手册:第二章-习题》

    什么是Python解释器? Python解释器是运行Python程序的程序. 什么是源代码? 源代码是为程序所写的语句:它包括文本文件(通常以.py为文件名结尾)的文件. 什么是字节码? 字节码是Py ...

  6. C语言 > 构造素数表

    #include <stdio.h> #define NUMBER 1000 int main(){ int isPrime[NUMBER]; ; i < NUMBER; i++){ ...

  7. VS2010+OpenCV3.4.1+zbar 64位

    1. OpenCV3.4.1和zbar文件夹放到指定的路径下,我把它们放在了"D:\二维码\环境"中. zbar:链接:https://pan.baidu.com/s/11eCDV ...

  8. js基础--浏览器标签页隐藏或显示状态 visibility详解

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在工作中我们可能会遇到这样的需求,当浏览器切换到别的标签页或着最小化时,我们需要暂停页面上正在播放的视频或者音乐,这个需求 ...

  9. Redis之实战篇(与Mybatis整合)

    摘要: 现在市面流行的java框架,一个是ssh(spring.struts2.hibernate),另一个是ssm(spring.springmvc.mybatis),由于之前已经有整合过ssm框架 ...

  10. Java 8 文件操作(转)

    我们知道在JDK6甚至之前的时候,我们想要读取一个文本文件也是非常麻烦的一件事,而现在他们都变得简单了, 这要归功于NIO2,我们先看看之前的做法: 读取一个文本文件 BufferedReader b ...