一、操作场景
默认时间不支持直接以集群为单位进行修改,但可在单个容器内进行修改。这篇提供了容器内时区不一致问题的多种解决方案,请选择合适的方案进行操作:
·方案1:Dockerfile 中创建时区文件(推荐)
·方案2:挂载主机时区配置到容器
二、操作环境
这篇中所有操作步骤均在 TKE 集群节点上完成,相关操作环境如下所示,请根据实际情况结合文档解决问题:
| 角色 | 地域 | 配置 | 操作系统 | Kubernetes 版本信息 |
| 节点 | 华南地区(广州) | CPU:1核内存:1GB带宽:1Mbps系统盘:50GB(普通云硬盘) | CentOS Linux 7(Core) | 1.16.3 |
三、问题定位
1. 参考 使用标准登录方式登录 Linux 实例(推荐),登录目标节点。
2. 执行以下命令,查看本地时间。
date
返回结果如下:
3. 依次执行以下命令,查看容器内 CentOS 系统默认时区。
docker run -it centos /bin/sh
date
返回结果如下:
对比发现,本地时间与容器内时区不一致。
4. 执行以下命令,退出容器。
exit
四、方案1:Dockerfile 中创建时区文件(推荐)
在构建基础镜像或在基础镜像的基础上制作自定义镜像时,在 Dockerfile 中创建时区文件即可解决单一容器内时区不一致问题,且后续使用该镜像时,将不再受时区问题困扰。
1. 执行以下命令,新建 Dockerfile.txt 文件。
vim Dockerfile.txt
2. 按 i 切换至编辑模式,写入以下内容,配置时区文件。
FROM centosRUN rm -f /etc/localtime \\&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \\&& echo "Asia/Shanghai" > /etc/timezone
3. 按 Esc,输入 :wq,保存文件并返回。
4. 执行以下命令,构建容器镜像。
docker build -t centos7-test:v1 -f Dockerfile.txt .
返回结果如下:
5. 依次执行以下命令,启动容器镜像并查看容器内时区。
date
docker run -it centos7-test:v1 /bin/sh
date
此时,容器内时区已与本地时间一致。如下:
6. 执行以下命令,退出容器。
exit
五、方案2:挂载主机时区配置到容器
解决容器内时区不一致问题,还可以通过挂载主机时间配置到容器的方式进行解决。该方式可以在容器启动时进行设置,也可以在 YAML 文件中使用主机路径挂载数据卷到容器。
六、容器启动时挂载主机时间配置到容器
挂载主机时间到容器内覆盖配置时,有以下两种选择:
·方式1:挂载本地 /etc/localtime:需确保该主机时区配置文件存在且时区正确。
·方式2:挂载本地 /usr/share/zoneinfo/Asia/Shanghai:当本地 /etc/localtime 不存在或者时区不正确时,可选择直接挂载该配置文件。
请根据实际情况,选择以下方式,进行挂载主机时间配置到容器:
方式1方式2挂载本地 /etc/localtime:1. 依次执行以下命令,查看本地时间并挂载本地 /etc/localtime 到容器内。 datedocker run -it -v /etc/localtime:/etc/localtime centos /bin/shdate返回结果如下所示,容器内时区已与本地时间一致:
2. 执行以下命令,退出容器。 exit挂载本地 /usr/share/zoneinfo/Asia/Shanghai:1. 依次执行以下命令,查看本地时间并挂载本地 /usr/share/zoneinfo/Asia/Shanghai 到容器内。 datedocker run -it -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime centos /bin/shdate返回结果如下所示,容器内时区已与本地时间一致:
2. 执行以下命令,退出容器。 exit
七、YAML 文件使用主机路径挂载数据卷到容器
本节内容以 mountPath:/etc/localtime 为例,介绍在 YAML 文件中如何通过数据卷挂载主机时区配置到容器内,解决容器内时区不一致的问题。
1. 在节点上执行以下命令,创建 pod.yaml 文件。
vim pod.yaml
2. 按 i 切换至编辑模式,写入以下内容。
apiVersion: v1kind: Podmetadata: name: test namespace: defaultspec: restartPolicy: OnFailure containers: – name: nginx image: nginx-test imagePullPolicy: IfNotPresent volumeMounts: – name: date-config mountPath: /etc/localtime command: ["sleep", "60000"] volumes: – name: date-config hostPath: path: /etc/localtime
3. 按 Esc,输入 :wq,保存文件并返回。
4. 执行以下命令,新建该 Pod。
kubectl create -f pod.yaml
返回结果如下:
5. 依次执行以下命令,查看该容器内时区。
date
kubectl exec -it test — date
返回结果如下所示,与本地系统时区一致即为成功: