问题: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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐