【原創】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,東八區時間)
UTC應該是指(Coordinated Universal 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化的形式比較推薦,可考慮將其作為功能,由用戶決定是否開啟容器與宿主機時間的同步,即可實現需求,靈活性也較高。

 

作者簡介:雲計算容器\Docker\K8s\Serverless方向產品經理,學點技術,為更好地設計產品。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM