在Kubernetes集群运行的容器默认会使用UTC时间,即与北京时间会有8小时的时差,下面将给出几种方案解决容器与宿主机时区不一致问题。

通过volumes将时区文件挂到Pod中

apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
volumeMounts:
- name: timezone
mountPath: /etc/localtime
volumes:
- name: timezone
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai

查看容器的时区

[root@master k8s-list]# kubectl exec -it busybox -- date
Tue Apr 13 10:59:40 CST 2021

通过定制Dockfile修改时区

vim Dockerfile

FROM busybox
RUN rm -rf /etc/localtime
COPY localtime /etc/localtime

查看容器的时区

[root@master k8s-list]# docker exec -it busybox sh
/ # date
Tue Apr 13 11:18:06 CST 2021

通过环境变量修改时区

并不是适用所有容器

apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
env:
- name: TZ
value: Asia/Shanghai

查看容器的时区

[root@master k8s-list]# kubectl exec -it nginx -- date
Tue Apr 13 11:28:50 CST 2021

通过拷贝时区文件到容器

还可以通过拷贝时区文件到容器中来修改时区,但是这种方式有个不好的地方,就是删除容器重新创建,还需要我们再次进入容器内修改

# 拷贝宿主机时区文件到容器
kubectl cp /usr/share/zoneinfo/Asia/Shanghai busybox:/etc/localtime
[root@master k8s-list]# kubectl exec -it busybox -- date
Tue Apr 13 15:06:03 CST 2021

还可以实现批量修改

# 批量修改命名空间下的所有pod的时区
for i in $(kubectl get pods |grep -v 'NAME' |awk '{print $1}');do kubectl cp /usr/share/zoneinfo/Asia/Shanghai $i:/etc/localtime;done
[root@master k8s-list]# kubectl exec -it nfs-client-provisioner-5f4d4ddf87-9b69q -- date
Tue Apr 13 15:10:39 CST 2021
[root@master k8s-list]# kubectl exec -it nginx -- date
Tue Apr 13 15:10:42 CST 2021
[root@master k8s-list]# kubectl exec -it busybox -- date
Tue Apr 13 15:10:47 CST 2021