部署Chart应用并使用.net core读取Kubernetes中的configMap

上一篇文章讲了 k8s使用helm打包chart并上传到腾讯云TencentHub,今天就讲一下使用Helm部署应用并使用configMap代替asp.net core 中的appsettings.json文件。
html

把Chart上传到TencentHub以后,咱们就能够经过腾讯云的容器服务,直接部署Helm应用了。git

部署Helm应用

点击新建而后选择TencentHub,私有仓库,就能够看到本身上传的Chart了。填写一下应用名称,拉到最下方点击完成便可建立应用。github

 注意:若是你的yaml文件写的不对,如少个空格,变量参数名称写错或者不存在,都没法建立成功。spring

 能够点击新建下方那个查看详情,能够看到Helm应用安装日志,安装失败会提示错误信息,本身跟据错误提示修复本身的错误。json

成功安装后点击应用能够查看资源信息和状态app

注意:Chart部署成功不表明你的服务已经成功启动了,若是你的服务自己是有问题起不来的话,这里不会有提示,须要本身去查看Pod是否已经正常启动成功。asp.net

好了,应用部署完成后,咱们来试试如何读取configMap。async

读取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…

相关文章
相关标签/搜索