上一篇文章講了 k8s使用helm打包chart並上傳到騰訊雲TencentHub,今天就講一下使用Helm部署應用並使用configMap代替asp.net core 中的appsettings.json文件。 把Chart上傳到TencentHub之後,我們就可以通過騰訊雲的容器服務,直接部署H ...
上一篇文章講了 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中的SpringCloudConfig,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…