k8s同步pod的时区


背景

最近在开发时发现由于RD在打镜像时没有注意时区问题,有一些镜像的时区不是东八区,导致业务逻辑出现异常(登录token失效、数据库创建时间不正常)。因此需要同步k8s pod的时区。

解决办法

有2个办法可以解决这个问题:

  1. 修改打镜像的Dockerfile,正确处理时区问题
  2. 部署应用时,单独读取主机的“/etc/localtime”文件,即创建pod时同步时区。

方案1的好处是,不需要修改集群的配置,一劳永逸的解决问题。但是缺点是需要修改Dockerfile,需要重新打镜像。

方案2的好处是,不需要重新打镜像,pod直接读取宿主机的时区。但是缺点是每个pod都要设置。(老的pod删掉即可)

经过讨论,最终采用方案2。

操作步骤

首先添加一个PodPreset配置:

podpreset-default.yaml

apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset 
metadata: 
    name: allow-tz-env
    namespace: default
spec:
    selector: 
      matchLabels: 
    env:
      - name: TZ
        value: Asia/Shanghai

之后使用kubectl应用这个文件。

kubectl apply -f podpreset-default.yaml

最后使用kubectl delete po杀掉已有的的pod。

待新的pod启动起来之后,进入相关pod,使用date检查时区,确认时区问题已经修复了。