Docker K8s 解決容器內時區不一致方案

2022-06-11 04:09:12 字數 3599 閱讀 2015

**自:

我們知道,使用 docker 容器啟動服務後,如果使用預設 centos 系統作為基礎映象,就會出現系統時區不一致的問題,因為預設 centos 系統時間為 utc 協調世界時 (universal time coordinated),一般本地所屬時區為 cst(+8 時區,上海時間),時間上剛好相差 8 個小時。這就導致了,我們服務啟動後,獲取系統時間來進行相關操作,例如存入資料庫、時間換算、日誌記錄等,都會出現時間不一致的問題,所以很有必要解決掉容器內時區不統一的問題。

問題顯示如下:

# 檢視本地時間

$ date

wed mar 6 16:41:08 cst 2019

# 檢視容器內 centos 系統預設時區

$ docker run -it centos /bin/sh

sh-4.2# date

wed mar 6 08:41:45 utc 2019

本次演示環境,我是在虛擬機上安裝 linux 系統來執行操作,通過虛擬機器完成 kubernetes 集群的搭建,以下是安裝的軟體及版本:

可以直接修改dockerfile,在構建系統基礎映象或者基於基礎映象再次構建業務映象時,新增時區修改配置即可。

$ cat dockerfile.date

from centos

run rm -f /etc/localtime \

&& ln -sv /usr/share/zoneinfo/asia/shanghai /etc/localtime \

&& echo "asia/shanghai" > /etc/timezone

# 構建容器映象

$ docker build -t centos7-date:test -f dockerfile.date .

sending build context to docker daemon 4.426gb

step 1/2 : from centos

---> 1e1148e4cc2c

step 2/2 : run rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/asia/shanghai /etc/localtime && echo "asia/shanghai" > /etc/timezone

---> running in fe2e931c3cf2

'/etc/localtime' -> '/usr/share/zoneinfo/asia/shanghai'

removing intermediate container fe2e931c3cf2

---> 2120143141c8

successfully built 2120143141c8

successfully tagged centos7-date:test

$ docker run -it centos7-date:test /bin/sh

sh-4.2# date

wed mar 6 16:40:01 cst 2019

可以看到,系統時間正常了,個人比較推薦這種方式,一勞永逸,只需要一次配置即可,後續在基於此基礎映象製作的映象就可以直接使用了,不需要擔心時區問題。

除了在 dockerfile 中修改配置方式外,我們還可以在容器啟動時通過掛載主機時區配置到容器內,前提是主機時區配置檔案正常。

# 掛載本地 /etc/localtime 到容器內覆蓋配置

$ docker run -it -v /etc/localtime:/etc/localtime centos /bin/sh

sh-4.2# date

wed mar 6 16:42:38 cst 2019

# 或者掛載本地 /usr/share/zoneinfo/asia/shanghai 到容器內覆蓋配置

$ docker run -it -v /usr/share/zoneinfo/asia/shanghai:/etc/localtime centos /bin/sh

sh-4.2# date

wed mar 6 16:42:52 cst 2019

以上兩種方式,其實原理都一樣,在 centos 系統中,/usr/share/zoneinfo/asia/shanghai/etc/localtime二者是一致的,我們一般會將二者軟連線或者直接 cp 覆蓋。

還有一種方式,就是進入到容器內處理,但是此方式有個不好的地方就是,如果容器刪除後重新啟動新的容器,還需要我們進入到容器內配置,非常不方便,所以個人不建議此方式。

# 進入到容器內部配置

$ docker run -it centos /bin/sh

sh-4.2# date

wed mar 6 08:43:29 utc 2019

sh-4.2# rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/asia/shanghai /etc/localtime

'/etc/localtime' -> '/usr/share/zoneinfo/asia/shanghai'

sh-4.2# date

wed mar 6 16:43:54 cst 2019

在 k8s 集群裡,也會存在因為時區不一致導致的問題,還記得我之前文章中挖出來的坑 配置 ceph object gateway management frontend 中,因為容器時間不一致,導致的報錯。那麼在 k8s 集群裡,如何解決容器時間不統一的問題呢?方式有很多,最一勞永逸的方式還是上邊,在基礎映象或者服務映象裡面直接配置好。其次我們還可以通過掛載主機時間配置的方式解決,針對此方式,我舉個栗子。

$ cat busy-box-test.yaml

apiversion: v1

kind: pod

metadata:

name: busy-box-test

namespace: default

spec:

restartpolicy: onfailure

containers:

- name: busy-box-test

image: busybox

imagepullpolicy: ifnotpresent

volumemounts:

- name: date-config

mountpath: /etc/localtime

command: ["sleep", "60000"]

volumes:

- name: date-config

hostpath:

path: /etc/localtime

注意:如果主機/etc/localtime已存在且時區正確的話,可以直接掛載,如果本地/etc/localtime不存在或時區不正確的話,那麼可以直接掛載/usr/share/zoneinfo/asia/shanghai到容器內/etc/localtime,都是可行的。

docker k8s修改容器hosts檔案

docker映象本質上是乙個包含了整個作業系統的檔案和目錄的rootfs,使用者製作映象的每一步操作都會生成乙個層,也就是乙個增量的rootfs。docker容器的rootfs由唯讀層,init層和可讀寫層。我們的 etc hosts和 etc resolv.conf等只對當前容器生效的資訊會保留在...

容器內元素float時,容器自動高度的解決方案

先看html 如下 1 div id wrap 2 div id header 3 h1 three colums layout.h1 4div 56 div id content 7 div id main 8 p hello,css html.p 9 p i love this game.p 1...

k8s中解決容器時差問題

解決k8s的pod容器的時差常用的兩種方式 1 通過設定pod 模板中的環境變數 env解決 在pod的模板中新增以下 apiversion v1 kind pod metadata name pod name spec containers name name image image name i...