摘要: 通過Pod Preset自動配置容器的時區
默認的情況,在K8S裡啟動一個容器,該容器的設置的時區是UTC0,但是對于很多客戶而言,其主機環境并不在UTC0。例如中國客戶在UTC8。如果不把容器的時區和主機主機設置為一緻,則在查找日志等時候将非常不方便,也容易造成誤解。但是K8S以及Docker容器沒有一個簡便的設置/開關在系統層面做配置。都需要我們從單個容器入手做設置,具體方法如下:
Docker引擎提供了兩種設置方式,分别是通過環境變量以及挂載主機文件方式來完成
先看看沒有設置前,容器的情況:
docker run -it --rm centos date cat /etc/localtime
從輸出可以看出,容器和主機差了8個時區
我們通過環境變量的方式來改變容器的時區:
docker run -it --rm -e "TZ=Asia/Shanghai" centos date cat /etc/localtime
從輸出可以看出,雖然沒有改變對應的localtime文件,但是容器和主機的時區是一緻的了。
docker run -it --rm -v /etc/localtime:/etc/localtime centos date cat /etc/localtime
從輸出可以看出,容器和主機的時區是一緻的了,而且使用了本機的時區文件。
在K8S中,可以參考Docker的方式進行設置
apiVersion: v1 kind: Pod metadata: name: pod-env-tz spec: containers: - name: ngx image: nginx:latest imagePullPolicy: IfNotPresent env: - name: TZ value: Asia/Shanghai
apiVersion: v1 kind: Pod metadata: name: pod-vol-tz spec: containers: - name: ngx image: nginx:latest imagePullPolicy: IfNotPresent volumeMounts: - name: tz-config mountPath: /etc/localtime readOnly: true volumes: - name: tz-config hostPath: path: /etc/localtime
這裡引出了一個問題,難道每次每個容器都要做這樣的配置才可以麼?可否在系統層面設置,而無需在對應yaml文件體現呢?不然yaml文件将過于啰嗦。答案是使用K8S的特性Pod Preset來控制容器啟動前先配置好對應時區環境變量,或者挂載主機文件。下面我們通過配置環境變量的方式說明,挂載文件是類似的,就不重複了。
Pod Preset目前還是alpha階段,默認是沒有激活的,所以需要通過以下步驟激活:
咱們以阿裡雲的Kubernetes服務為例(如果還沒有,可以嘗試一下,一鍵就可以開通,還免費哦)。阿裡雲的Kubernetes服務的master組件(API Server, Scheduler, Controller)都是通過Static Pod的方式用Kubelet啟動,所以需要更改對應的yaml來激活Pod Preset:
編輯/etc/kubernetes/manifests/kube-apiserver.yaml,
保存後kubelet會自動重啟kube-apiserver組件。我們需要同時更改3台機器的master才可以。在期間你将收到類似以下的告警,在api server重啟成功後會自動恢複
kubectl get podpresets
對應的Pod Preset對象創建文件如下:
apiVersion: settings.k8s.io/v1alpha1 kind: PodPreset metadata: name: allow-tz-env spec: selector: matchLabels: env: - name: TZ value: Asia/Shanghai
這裡需要注意的地方是,一定需要寫selector...matchLabels,但是matchLabels為空,标示應用于所有容器,這個正式我們所期望的
kubectl apply -f allow-tz-env.yaml kubectl get podpresets
可以得到創建成功的Pod Preset列表:
apiVersion: v1 kind: Pod metadata: name: pod-no-tz spec: containers: - name: ngx image: nginx:latest imagePullPolicy: IfNotPresent
進入容器看看對應的環境變量:
從輸出可以看出,容器已經被默認配置了時區的環境變量,對應的時區是Asia/Shanghai
至此,我們就完成了容器的時區的"自動"配置了。Pod Preset的預設功能還是非常便利的,目前這塊還在演進中,但是已經能大大簡化了相關的管理工作,将這些配置從開發者手中解脫出來,變成系統管理配置。
需要注意的是,Pod Preset是namespace級别的對象,其作用範圍隻能是同一個命名空間下容器。
建議Kubernetes社區可以在kubelet的啟動參數重,增加一個開關,用來設置容器的默認時區,畢竟這個是很常見的實踐
作者:了哥-duff
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!