【原創】K8s-Pod時間與宿主時區時區同步
一、問題背景
容器預設的時區採用的是世界時鐘即UTC時區,但是宿主機預設採用的是CST,兩者時區相差8小時,如下所示,前者為容器的時間,後者為宿主機時間,容器的時間比宿主機的時間早8小時
[root@k8s-master zhanglei]# kubectl exec -ti myapp-statefulset-0 -- sh / # date Tue Aug 25 06:50:29 UTC 2020 / # exit [root@k8s-master zhanglei]# date 2020年 08月 25日 星期二 14:50:37 CST
CST應該是指(China Shanghai Time,東八區時間)
在某些時間敏感的場景,如日誌定位問題,為了方便,需要實現容器時間和宿主機時間保持一致。
二、解決方案
1、通過將宿主機的時區檔案掛載到Pod
[root@k8s-master zhanglei]# cat dep-ord.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-dep-timesys namespace: default labels: app: nginx-deployment spec: replicas:2 selector: matchLabels: app: nginx-deployment-ord-time template: metadata: labels: app: nginx-deployment-ord-time spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: timezone mountPath:/etc/localtime # 掛載到容器的目錄 volumes: - name: timezone hostPath: path: /usr/share/zoneinfo/Asia/Shanghai # 宿主機的目錄
[root@k8s-master zhanglei]# kubectl get pod |grep time nginx-dep-timesys-6c7b6f86c6-2dlp7 1/1 Running 0 22m nginx-dep-timesys-6c7b6f86c6-vdzwh 1/1 Running 0 22m [root@k8s-master zhanglei]# kubectl exec -it nginx-dep-timesys-6c7b6f86c6-2dlp7 -- bash root@nginx-dep-timesys-6c7b6f86c6-2dlp7:/# date Tue Aug 25 14:57:01 CST 2020 root@nginx-dep-timesys-6c7b6f86c6-2dlp7:/# exit exit [root@k8s-master zhanglei]# date 2020年 08月 25日 星期二 14:57:07 CST
將宿主機的區間檔案通過mountPath掛載到容器之後,可以看到兩者時區已經保持了一致。
2、通過環境變數
[root@k8s-master zhanglei]# cat dep-test.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-timeenv namespace: default labels: app: nginx-deployment spec: replicas: 1 selector: matchLabels: app: nginx-deployment template: metadata: labels: app: nginx-deployment spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 env: - name: TZ value: Asia/Shanghai # 宿主機的環境變數
root@nginx-deployment-timeenv-7b6d4c8b5-kbj9q:/# date
Tue Aug 25 19:03:09 CST 2020
root@nginx-deployment-timeenv-7b6d4c8b5-kbj9q:/# exit
exit
[root@k8s-master zhanglei]# date
2020年 08月 25日 星期二 19:03:18 CST
可以看到容器時間和宿主機的時間保持了一致
3、通過dockfile映象構建來同步容器和宿主機的時區
[root@k8s-master zhanglei]# touch testdockertime [root@k8s-master zhanglei]# vim testdockertime
[root@k8s-master zhanglei]# cat testdockertime FROM nginx RUN rm -f /etc/localtime \ && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone [root@k8s-master zhanglei]# docker build -t nginx:testdate -f testdockertime . Sending build context to Docker daemon 82.43kB Step 1/2 : FROM nginx ---> 4bb46517cac3 Step 2/2 : RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone ---> Running in 29c9ffc202e6 '/etc/localtime' -> '/usr/share/zoneinfo/Asia/Shanghai' Removing intermediate container 29c9ffc202e6 ---> d3cde57b8afc Successfully built d3cde57b8afc Successfully tagged nginx:testdate
[root@k8s-master zhanglei]# docker images |grep nginx nginx testdate d3cde57b8afc 50 seconds ago 133MB
通過上面的步驟在nginx的基礎上重新制作了映象,其新的映象的tag為testdate,有了新的映象,就可以執行新的容器,通過docker run 執行1個容器
[root@k8s-master zhanglei]# docker run -it nginx:testdate /bin/bash root@266e44b054a5:/# date Tue Aug 25 19:35:00 CST 2020 root@266e44b054a5:/# exit exit [root@k8s-master zhanglei]# date 2020年 08月 25日 星期二 19:35:09 CST
如上可以看到通過製作映象也可實現容器與宿主機的時區同步
三、總結
以上為容器與宿主機時區同步的幾種方法,對於使用者來說,可通過製作映象、加入環境變數,通過hostPath將時區檔案掛載到容器時區路徑等方式,不過這需要建立在使用者有一定的容器先驗知識的基礎上,因此對於產品服務提供方來來說,應儘量降低使用者的使用門檻,因此UI化的形式比較推薦,可考慮將其作為功能,由使用者決定是否開啟容器與宿主機時間的同步,即可實現需求,靈活性也較高。