配置容器时区
应用场景
在容器化应用中,容器默认使用UTC(协调世界时)时区。由于CCI采用Serverless架构,底层计算节点对用户透明,用户无法像使用传统CCE节点那样,通过挂载宿主机(Node)的/etc/localtime文件来同步宿主机时区。
如果您的业务需要使用特定的本地时区(如中国标准时间Asia/Shanghai),建议根据镜像类型选择以下两种方式之一进行配置:
- 方式一:设置TZ环境变量(推荐):适用于大多数标准镜像(如CentOS、Ubuntu、Nginx、Java等),配置简单,支持控制台图形化或YAML操作。
- 方式二:挂载ConfigMap:适用于精简镜像(如Alpine、Distroless等),此类镜像内部可能缺少时区数据文件,需手动挂载。
方式一:设置TZ环境变量 (推荐)
绝大多数通用镜像(包含tzdata包)都支持通过环境变量TZ来定义时区。
- 场景一:新建工作负载
- 登录云容器实例 CCI2.0控制台。
- 左侧导航栏中选择“负载管理 > 无状态负载”,在页面单击“创建工作负载”。
- 添加基础配置。具体操作请参见通过控制台创建无状态负载。
- 添加容器配置。
- 单击“添加容器”。
- 填写基本信息。单击“下一步”。
- 在“高级设置”的“环境变量”页签。
- 单击“添加环境变量”。
- 类型:自定义
- 变量名称:TZ
- 变量/变量引用:Asia/Shanghai(其他更多目标时区,请参见附录:常用时区参数参考)。
- 完成后续配置并创建。
- 场景二:已有工作负载
对于CCI环境中已运行的工作负载,或者需要进行批量配置时,推荐通过“编辑YAML”方式快速追加配置。
- 在工作负载列表中,单击操作列的“编辑YAML”。
- 在YAML编辑器中,搜索关键字“image”,找到您的业务容器配置部分(通常包含image和name字段)。
- 在目标容器的配置下,添加或修改env字段。
... spec: template: spec: containers: - name: app-container image: nginx:latest # --- 添加以下env配置 --- env: - name: TZ value: Asia/Shanghai # ----------------------- ...
- 如果配置后时间仍为UTC,说明您的镜像是Alpine等精简版,请使用方式二。
- 修改环境变量会触发工作负载的滚动升级,旧实例将被销毁,新实例启动后配置即生效。
方式二:挂载ConfigMap(适用于精简镜像)
如果您的镜像极度精简(例如纯Go二进制镜像或某些未预装tzdata的Alpine镜像),容器内可能不存在/usr/share/zoneinfo目录,此时设置环境变量无效,必须将外部的时区文件挂载进去。
- 操作环境已配置ccictl命令行工具。
- 操作环境为Linux系统(具备/usr/share/zoneinfo目录)。
- 创建ConfigMap。
使用 ccictl 命令行,直接将本地的时区文件创建为 ConfigMap。
(以创建上海时区配置为例)# 语法:ccictl create configmap <名称> --from-file=<Key>=<本地文件路径> -n <命名空间> ccictl create configmap timezone-config --from-file=localtime=/usr/share/zoneinfo/Asia/Shanghai -n namespace
- 挂载到工作负载
通过YAML编辑工作负载,将该ConfigMap挂载到容器的/etc/localtime。
YAML示例... spec: template: spec: containers: - name: app-container image: alpine:latest volumeMounts: - name: tz-vol mountPath: /etc/localtime subPath: localtime # [关键]必须使用subPath,否则会覆盖/etc目录下的其他文件 readOnly: true volumes: - name: tz-vol configMap: name: timezone-config ...
验证方法
配置完成后,请按照以下步骤验证时区是否生效:
- 等待工作负载状态变为“运行中”。
- 使用 ccictl 进入容器终端。
ccictl exec -it <Pod名称> -n <命名空间>
- 执行date -R命令。
date -R
- 预期结果:输出时间应包含对应的时区偏移量(类似如下所示+0800)
Fri, 27 Oct 2023 10:00:00 +0800
附录:常用时区参数参考
TZ环境变量的值遵循IANA时区标准,格式为区域/城市。请根据实际情况进行选择。
| 区域 | 常用城市/标准 | TZ变量值 | 说明 |
|---|---|---|---|
| 通用 | UTC | UTC | 默认值。 |
| 中国 | 上海 | Asia/Shanghai | 中国标准时间(CST)。不建议使用Asia/Beijing(非标准路径)。 |
| 北美 | 纽约 | America/New_York | 美国东部时间。注意大小写。 |
| 洛杉矶 | America/Los_Angeles | 美国西部时间。 | |
| 欧洲 | 伦敦 | Europe/London | 英国时间。 |
| 柏林 | Europe/Berlin | 欧洲中部时间。 | |
| 亚太 | 东京 | Asia/Tokyo | 日本标准时间。 |
| 新加坡 | Asia/Singapore | 新加坡时间。 |
常见问题
为什么我设置了Asia/Beijing时区不生效?
Linux标准的时区数据库中,中国标准时间的规范标识符是Asia/Shanghai。虽然部分发行版兼容Asia/Beijing,但在大多数容器镜像中仅存在Asia/Shanghai。请始终使用Asia/Shanghai。
为什么修改了YAML中的TZ变量后,业务没有立即生效?
修改环境变量会触发滚动升级。请等待旧Pod终止、新Pod状态变为“运行中”后再进行验证。
为什么在Alpine镜像中设置TZ环境变量无效?
Alpine默认不包含tzdata包,无法解析时区字符串。建议在构建镜像时添加RUN apk add --no-cache tzdata,或使用ConfigMap挂载方式。