Kubernetes 1.2版本添加了一個叫ConfigMap的新功能。這個功能提供給容器注入應用程序數據的方式。注入配置文件對於大部分應用程序來講很強大,可是新的ConfigMap功能不只能夠在容器開啓時提供初始配置功能,還有在容器運行時更新自身配置的功能。在這篇帖子裏,我將會給你們展現如何編寫微服務來利用更新好的配置,而且在fly上面重構你的service。git
讓咱們來看看監控配置文件變化的簡單網頁app是怎麼樣的。github
這個app有趣部分是ConfigManager
和 WatchFile
.golang
ConfigManager
的工做就是提供訪問咱們的 Config{}
的路徑結構,這樣的話當Kubernetes ConfigMap
給咱們一個新的配置文件版本或者咱們更新 Config{}
對象時候,競爭衝突不存在。數據庫
WatchFile
的工做就是爲做出的修改查看咱們的配置文件,而且運行讀取配置文件的新版本回調函數,使用ConfigManager
設置新的 Config{}
。網絡
讓咱們看一下ConfigManager
的安裝啓用。app
這裏是咱們使用一個簡單的Mutex用來避免競爭衝突的例子。一般你想要避免使用Mutex,而後使用創建在channel裏面的golang。可是既然管理員的工做是保護配置對象的實例,那麼使用Mutex也仍是能夠接受的。curl
懷着好奇心,我建立了一個這個對象的golang channel安裝啓用,而後運行一些基準點。你能夠點擊(點我)找到代碼和基準點測試。函數
Mutex版本沒有死鎖的風險,很高效。而 FileWatcher
的實施會較複雜一點。它的目標是使任意額外的fsnotify events成爲一個單獨更新的event,這樣咱們只要執行一次回調函數。查看完整代碼請點擊這裏(點我)
有意思的部分是 run()函數執行在線程中,而後運行回調函數。微服務
你可能會以爲代碼應該尋找 fsnotify.Writeevents而不是fsnotify.Remove,然而……ConfigMap所呈現給應用程序的配置文件事實上是一個鏈接到咱們配置文件的符號連接,而不是一個文件。當ConfigMap更新時,Kubernetes AtomicWriter()就能夠實現強大的ConfigMap更新。測試
爲了作到這樣,AtomicWriter()建立了一個新的目錄;編寫更新好的ConfigMap內容到新的目錄。一旦編寫完成,那麼它就會移動原始配置文件符號連接,而後用新的指向最新建立目錄符號連接替換它。
咱們的代碼處理方式理論上應該是監控咱們的配置文件符號連接,而不是爲events的真實文件。然而,fsnotify.v1並不容許咱們提交IN_DONT_FOLLOW標誌到inotify,inotify容許咱們爲修改監控符號連接。可是fsnotify取消引用符號連接,而後爲events監控真實文件。這不太可能做出修改,由於fsnotify是爲跨平臺設計的,並且不是全部的平臺都支持符號連接。
我繼續使用fsnotify函數庫,由於對於我來講,用它在osx上開發,在容器上部署都比較方便。以Linux爲中心的實施應該直接使用"golang.org/x/exp/inotify"數據庫。
如今咱們有了咱們的代碼,咱們能夠建立一個Docker鏡像而後更新到Docker hub,爲部署在咱們Kubernetes集羣作好準備。
假設你已經創建起了一個Kubernetes集羣;讓咱們來建立一個ConfigMap配置,而後用咱們的容器來使用它。
首先,咱們建立一個密鑰清單文件
這個定義了一個新的叫作configmap-microservice-demo的ConfigMap,它包括了 data:配置文件名字叫作configmap-microservice-demo.yaml
它的內容是message: Hello World。
使用 kubectl來建立ConfigMap。
你能夠檢測到最新的建立好的ConfigMap
接下來咱們來定義一個Replication Controller密鑰清單來運行咱們的應用程序容器。
有趣的地方就是volumes:和volumeMounts:,這二者告訴運行在節點上的kubelet哪裏能夠安裝咱們的配置文件。當咱們的容器運行的時候;數據卷插件會在咱們的容器中安裝一個叫作/etc/config的目錄,而後在這裏面替換咱們的配置文件configmap-microservice-demo.yaml。
從咱們的容器觀點角度看,咱們的配置文件完整途徑將會是:/etc/config/configmap-microservice-demo.yaml
如今讓咱們來建立Replication Controller。
咱們如今能夠檢查咱們正在運行的pods來尋找咱們新pod的IP地址。
如今若是你登陸到咱們集羣中的一個節點,咱們在集羣裏能夠用pod的IP地址從任何地方來訪問應用程序。
若是這個部分讓你很困惑,你能夠點擊這篇博客(點我),它對於Kubernetes網絡是如何運行的有很深層次的指導意義。這個是官方文檔(點我)。
如今爲了有趣的部分,讓咱們來更新咱們的配置,部署修改到ConfigMap。
讓咱們打開原始的ConfigMap密鑰清單文件,而後修改咱們的message: Hello World到message:Hello Grandma。
用咱們更新的版本替代目前的ConfigMap
咱們能夠驗證到,經過在configmap資源上執行get,更新很成功。
咱們的應用程序很快獲得了更新後的配置,咱們能夠經過看日誌就來驗證。
如今咱們能夠在集羣裏面curl咱們的應用程序,咱們應該看到更新的配置反應在咱們的應用程序裏。
你能夠登陸到咱們的容器正在運行的節點,而後檢查直接檢查配置文件。Kubernetes將目錄安裝在/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~configmap/config-volume。
查看完整代碼點擊這裏:點我
(若是須要轉載,請聯繫咱們哦,尊重知識產權人人有責)