背景說明
使用Dockerfile構建容器鏡像時,若未指定時區配置,那么構建的容器有可能會使用UTC時間。在云容器引擎中使用該容器鏡像構建工作負載時就有可能出現容器實例與云容器引擎的節點時間不一致,相差8小時的現象。
云容器引擎的所有節點統一中國CST時間(UTC+8), 登錄節點執行date -R指令進行查看:
[root@0000000g-wcgp0q8ads ~]# date -R
Sat, 06 Apr 2024 18:37:16 +0800
驗證Pod實例的工作容器當前時間可以使用kubectl指令,例如查看default命名空間下,名為kubia-mannual的pod工作容器時間:
使用kubectl exec指令可查看pod的工作負載容器當前的時間:
[root@0000000g-wcgp0q8ads ~]# kubectl exec kubia-manual -n default -- date -R
Sat, 06 Apr 2024 10:37:18 +0000
工作容器的時間戳時區為+0000,代表使用的是標準UTC時間, 中國CST時間比標準UTC時間多8個小時
解決該問題有兩種方法:
1、構建容器鏡像時配置時區
2、通過云容器引擎控制臺進行配置
構建容器鏡像時配置時區
以Dockerfile方式構建鏡像為例,在鏡像的Dockerfile中增加以下語句:
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
通過云容器引擎控制臺進行配置
云容器控制臺可以通過數據卷的方式,將節點的/etc/localtime文件掛載到Pod的工作容器實例中,以此實現時區信息同步,具體操作步驟如下:
1、登錄云容器引擎控制臺
2、進入【集群】-【工作負載】界面,找到待處理的pod名稱,點擊【全量替換】按鈕 全量替換
3、增加一個主機目錄類型的數據卷,設置主機路徑為/etc/localtime 數據卷
4、為工作容器增加掛載點 掛載點
提交更改后,容器實例會重啟,使用與節點相同的時區配置;
通過云容器引擎創建新的工作負載時,可以使用的操作方法:以數據卷的方式將節點的/etc/localtime掛載到容器實例的/etc/localtime,實現節點與容器實例時間同步。
容器、容器日志時間與節點同步
容器和節點時間同步后,容器的日志時間戳仍可能與節點時間相差8小時。比較典型的應用場景是容器的工作進程為使用tomcat應用。
tomcat應用的日志輸出默認使用UTC時間,即便容器與節點時間已經同步,應用的日志輸出也會相差8小時,該問題需要在構建鏡像階段解決。
1、先獲取基礎tomcat鏡像的catalina.sh腳本
mkdir tmp
docker run --rm tomcat:<tag> -v tmp:/mnt cp /usr/local/tomcat/bin/catalina.sh /mnt/catalina.sh
2、修改catalina.sh腳本的JAVA_OPTSshell變量,添加-Duser.timezone=GMT+08配置項
JAVA_OPTS="$JAVA_OPTS -Djava.protocal.handler.pkgs=org.apache.catalina.webresources -Duser.timezone=GMT+08"
3、使用Dockerfile重建tomcat應用容器鏡像,將修改后的catalina.sh腳本拷貝到構建目錄,然后在Dockerfile中添加下列構建指令
COPY catalina.sh /usr/local/bin/tomcat/bin/catalina.sh