摘要: 經過Pod Preset自動配置容器的時區
默認的狀況,在K8S裏啓動一個容器,該容器的設置的時區是UTC0,可是對於不少客戶而言,其主機環境並不在UTC0。例如中國客戶在UTC8。若是不把容器的時區和主機主機設置爲一致,則在查找日誌等時候將很是不方便,也容易形成誤解。可是K8S以及Docker容器沒有一個簡便的設置/開關在系統層面作配置。都須要咱們從單個容器入手作設置,具體方法以下:api
Docker引擎提供了兩種設置方式,分別是經過環境變量以及掛載主機文件方式來完成阿里雲
方式一:設置容器的時區環境變量spa
先看看沒有設置前,容器的狀況:日誌
從輸出能夠看出,容器和主機差了8個時區server
咱們經過環境變量的方式來改變容器的時區:對象
從輸出能夠看出,雖然沒有改變對應的localtime文件,可是容器和主機的時區是一致的了。ip
方式二:掛載主機的時區文件到容器中開發
從輸出能夠看出,容器和主機的時區是一致的了,並且使用了本機的時區文件。文檔
在K8S中,能夠參考Docker的方式進行設置get
經過環境變量設置
經過掛載主機時區文件設置
這裏引出了一個問題,難道每次每一個容器都要作這樣的配置才能夠麼?能否在系統層面設置,而無需在對應yaml文件體現呢?否則yaml文件將過於囉嗦。答案是使用K8S的特性Pod Preset來控制容器啓動前先配置好對應時區環境變量,或者掛載主機文件。下面咱們經過配置環境變量的方式說明,掛載文件是相似的,就不重複了。
經過Pod Preset預設置時區環境變量
激活Pod Preset
Pod Preset目前仍是alpha階段,默認是沒有激活的,因此須要經過如下步驟激活:
我們以阿里雲的Kubernetes服務爲例(若是尚未,能夠嘗試一下,一鍵就能夠開通,還免費哦)。阿里雲的Kubernetes服務的master組件(API Server, Scheduler, Controller)都是經過Static Pod的方式用Kubelet啓動,因此須要更改對應的yaml來激活Pod Preset:
編輯/etc/kubernetes/manifests/kube-apiserver.yaml,
• 在-runtime-config增長settings.k8s.io/v1alpha1=true
• 在--admission-control增長PodPreset`
保存後kubelet會自動重啓kube-apiserver組件。咱們須要同時更改3臺機器的master才能夠。在期間你將收到相似如下的告警,在api server重啓成功後會自動恢復
驗證配置成功
• 確保api server已經恢復,若是恢復將收到以下通知信息:
• kubectl能夠查詢Pod Preset。在開關沒有開啓成功前,是沒法調用如下命令的
配置設置時區的Pod Preset
對應的Pod Preset對象建立文件以下:
這裏須要注意的地方是,必定須要寫selector...matchLabels,可是matchLabels爲空,標示應用於全部容器,這個正式咱們所指望的
能夠獲得建立成功的Pod Preset列表:
以普通的方式建立容器,可是環境變量被Pod Preset注入了
進入容器看看對應的環境變量:
從輸出能夠看出,容器已經被默認配置了時區的環境變量,對應的時區是Asia/Shanghai
至此,咱們就完成了容器的時區的"自動"配置了。Pod Preset的預設功能仍是很是便利的,目前這塊還在演進中,可是已經能大大簡化了相關的管理工做,將這些配置從開發者手中解脫出來,變成系統管理配置。
須要注意的是,Pod Preset是namespace級別的對象,其做用範圍只能是同一個命名空間下容器。
建議Kubernetes社區能夠在kubelet的啓動參數重,增長一個開關,用來設置容器的默認時區,畢竟這個是很常見的實踐
Pod Preset: https://kubernetes.io/docs/co...
Static Pod: https://kubernetes.io/docs/ta...
label-selectors: https://kubernetes.io/docs/co...
本文做者:了哥-duff
本文爲雲棲社區原創內容,未經容許不得轉載。