部署Chart應用並使用.net core讀取Kubernetes中的configMap


上一篇文章講了 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…

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM