背景
最近在开发时发现由于RD在打镜像时没有注意时区问题,有一些镜像的时区不是东八区,导致业务逻辑出现异常(登录token失效、数据库创建时间不正常)。因此需要同步k8s pod的时区。
解决办法
有2个办法可以解决这个问题:
- 修改打镜像的Dockerfile,正确处理时区问题
- 部署应用时,单独读取主机的“/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检查时区,确认时区问题已经修复了。