问题:docker 容器默认会采用utc时区,所以K8s所起容器会比当前时间慢八个小时。
解决:通过Pod Preset预设置时区环境变量或挂载宿主机时间
1.配置设置时区的Pod Preset
对应的Pod Preset对象创建文件如下:
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: allow-tz-env
spec:
selector:
matchLabels:
env:
- name: TZ
value: Asia/Shanghai
这里需要注意的地方是,一定需要写selector…matchLabels,但是matchLabels为空,标示应用于所有容器,这个正式我们所期望的
kubectl apply -f allow-tz-env.yaml
经测试发现时区是改变了,时间并没有改变,并不一定好使。
2.挂载/etc/localtime的podpreset
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: allow-localtime
namespace: spinnaker
spec:
selector:
matchLabels:
volumeMounts:
- mountPath: /etc/localtime
name: localtime
volumes:
- name: localtime
hostPath:
path: etc/localtime
网上好多资料都是这么做的,但遇到了坑:
经测试,容器时间确实改为当地时间。但是出现了另一个问题,容器apt-get 安装东西的时候会报tzdate冲突的错误,造成无法安装环境。任意容器里执行
root@gpupotal-backenddev-v096-vhs7l:/# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 27 Apr 26 2018 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC
会发现容器自动会创建软连接/etc/localtime -> /usr/share/zoneinfo/Etc/UTC。直接挂在/etc/localtime 到容器里/etc/localtime会有一定冲突。所以自己采用了另一方案如下:
3.挂载/usr/share/zoneinfo的podpreset
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: allow-localtime
namespace: spinnaker
spec:
selector:
matchLabels:
volumeMounts:
- mountPath: /usr/share/zoneinfo/Etc/UTC
name: localtime
volumes:
- name: localtime
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
总结:经测试,这个方案还是对未安装tzdate的镜像容器有问题,所以需要在base镜像里先安装tzdate覆盖原来的镜像,再挂载宿主机时间进去。剩下的只需要在每个namespace下创建相应的podPreset即可把所有容器的时间改为当地时间。
参考:https://blog.csdn.net/yunqiinsight/article/details/82703796