蛮子哥 蛮子哥
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • ArgoCD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

蛮子哥

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • ArgoCD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • ansible系列文章

  • Kubernetes笔记

    • 安装篇-kubeadm
    • k8s入门
    • k8s安装篇二进制
    • k8s面试题
    • kubernetes(k8s)yaml文件详解
    • k8s报错小结
    • Kubernetes 安装配置ingress controller
    • cka考试真题
    • ingress配置证书
    • cka考试作业
    • k8s部署java项目
    • jenkins脚本式流水线部署k8s项目实例一
    • helm v3安装并创建例子
    • 使用helm将本地部署文件上传到harbor chart上
    • helm公共仓库创建
    • helm适应minio作为私有仓库
    • helm release使用说明
    • kubernetes核心概念
    • kubectl使用技巧
    • kubernetes卷的几种类型
    • kubernetes安全框架
    • 云原生-什么是HPA和PDB、VPA
    • k8s部署php项目示例
    • 配置kubeconfig 文件访问 Kubernetes 集群
    • configmap配置的几种方式
    • k8s配置go服务
    • k8s部署java项目
    • kubernetes部署prometheus监控
    • kubernetes部署elk日志系统
    • kubernetes环境devops流水线
    • kubernetes高阶技能必备的工具
    • deployment中使用configmap、secret的方式
    • 业务pod 飘移pending排查分析
    • debian 12安装kubernetes
    • istio入门
    • kubernetes证书续签到100年
    • kubernetes网络模式
    • etcd的备份和还原
    • Kubernetes 安装和配置 NFS 存储卷
    • VictoriaLogs集群采集Kubernetes Pod日志
    • 解决容器时区问题
      • 背景
      • 方案一:指定 TZ 环境变量
      • 方案二:Dockerfile 里设置时区
      • 方案三:挂载主机时区配置到容器(不推荐)
      • 方法四:手动强制注入配置并重启
        • 1. 手动注入环境变量(最保底方案,100%生效)
        • 2. 手动触发 Pod 重启(兜底操作)
      • helm安装操作
        • 使用 values.yaml 文件(推荐生产环境)
    • 日志采集操作示例
    • operator 部署 VictoriaMetrics
  • elk

  • jenkins

  • GitLabCI_CD

  • AI编程

  • 提示词

  • ArgoCD

  • 专题
  • Kubernetes笔记
蛮子哥
2025-05-24
目录

解决容器时区问题

# 背景

业务程序在使用时间的时候(比如打印日志),没有指定时区,使用的系统默认时区,而基础镜像一般默认使用 UTC 时间,程序输出时间戳的时候,就与国内的时间相差 8 小时,如何使用国内的时间呢?本文教你如何解决。

# 方案一:指定 TZ 环境变量

很多编程语言都支持 TZ 这个用于设置时区的环境变量,可以在部署工作负载的时候,为容器指定该环境变量,示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - name: app
          image: app
          env:
            - name: TZ
              value: Asia/Shanghai
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 方案二:Dockerfile 里设置时区

下面给出在一些常见的基础镜像里设置时区的示例:

#ubuntu
FROM ubuntu:latest

RUN apt update -y && \
  DEBIAN_FRONTEND="noninteractive" apt -y install tzdata
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
  dpkg-reconfigure -f noninteractive tzdata
#alpine
FROM alpine:latest

# 安装 tzdata,复制里面的时区文件后删除 tzdata,保持精简
RUN apk add --no-cache tzdata && \
  cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
  apk del tzdata && \
  echo "Asia/Shanghai" > /etc/timezone
  
#centos
FROM centos:latest

RUN rm -f /etc/localtime \
  && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  && echo "Asia/Shanghai" > /etc/timezone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 方案三:挂载主机时区配置到容器(不推荐)

最后一种思路是将 Pod 所在节点的时区文件挂载到容器内 /etc/localtime,这种方式对 Pod 有一定侵入性,而且依赖主机内时区配置,在不得已的情况下不推荐使用。

下面是 YAML 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - name: app
          image: app
          volumeMounts:
            - name: tz
              mountPath: /etc/localtime
      volumes:
        - name: tz
          hostPath:
            path: /etc/localtime
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 方法四:手动强制注入配置并重启

既然 Helm 没能把配置传递到 Pod,我们现在直接操作 Kubernetes 对象来达到目的。

# 1. 手动注入环境变量(最保底方案,100%生效)

这是解决此类问题最直接、最可靠的方法。我们直接修改运行中的 StatefulSet 或 Deployment,把 TZ=Asia/Shanghai 这个环境变量写进去。

请按顺序执行以下命令:

第一步:查看有哪些资源需要修改 集群版 VictoriaLogs 通常包含 vlstorage (StatefulSet)、vlinsert 和 vlselect (Deployment) 等组件。先用命令确认一下:

bash

kubectl get statefulset,deployment -n $NAMESPACE | grep vlc
1

第二步:为每个资源注入环境变量 你需要对列出的每个资源(如 vlc-vlstorage, vlc-vlinsert, vlc-vlselect)执行类似的操作。

  • 如果资源是 StatefulSet(如 vlstorage):

    bash

    kubectl set env statefulset/vlc-vlstorage -n $NAMESPACE TZ=Asia/Shanghai
    
    1
  • 如果资源是 Deployment(如 vlinsert/vlselect):

    bash

    kubectl set env deployment/vlc-vlinsert -n $NAMESPACE TZ=Asia/Shanghai
    kubectl set env deployment/vlc-vlselect -n $NAMESPACE TZ=Asia/Shanghai
    
    1
    2

为什么这个操作会重启? 当你使用 kubectl set env 修改环境变量时,这直接改变了 Pod 的模板定义。Kubernetes 检测到这个变化后,会立即触发这些 Pod 的滚动更新。

# 2. 手动触发 Pod 重启(兜底操作)

如果上面 set env 命令执行后,Pod 还是没有反应(极少数情况),我们可以通过强制删除来重启。

执行滚动重启(推荐,无中断):

bash

# 根据你实际的资源类型选择
kubectl rollout restart statefulset/vlc-vlstorage -n $NAMESPACE
kubectl rollout restart deployment/vlc-vlinsert -n $NAMESPACE
kubectl rollout restart deployment/vlc-vlselect -n $NAMESPACE
1
2
3
4

或者,直接删除 Pod(有短暂中断,但最彻底):

bash

# 删除后,Kubernetes 会立即自动重建新的 Pod
kubectl delete pod --all -n $NAMESPACE
1
2

# helm安装操作

# 使用 values.yaml 文件(推荐生产环境)

创建一个 values.yaml 文件,包含所有配置:

# values.yaml
vlstorage:
  persistentVolume:
    storageClassName: nfs-csi
    size: "100Gi"
  retentionPeriod: "30d"
  replicaCount: 3
  # 时区配置 - 方法一
  env:
    TZ: "Asia/Shanghai"
  # 时区配置 - 方法二(备用)
  extraVolumes:
    - name: localtime
      hostPath:
        path: /etc/localtime
  extraVolumeMounts:
    - name: localtime
      mountPath: /etc/localtime
      readOnly: true

vlinsert:
  image:
    registry: docker.1ms.run
  env:
    TZ: "Asia/Shanghai"
  extraVolumes:
    - name: localtime
      hostPath:
        path: /etc/localtime
  extraVolumeMounts:
    - name: localtime
      mountPath: /etc/localtime
      readOnly: true

vlselect:
  image:
    registry: docker.1ms.run
  env:
    TZ: "Asia/Shanghai"
  extraVolumes:
    - name: localtime
      hostPath:
        path: /etc/localtime
  extraVolumeMounts:
    - name: localtime
      mountPath: /etc/localtime
      readOnly: true

vmauth:
  enabled: true

global:
  image:
    registry: docker.1ms.run
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

然后使用以下命令安装:

helm install vlc ./victoria-logs-cluster-0.0.20.tgz \
  --namespace $NAMESPACE \
  --timeout 15m \
  --values values.yaml
1
2
3
4

参考链接 (opens new window)

微信 支付宝
上次更新: 2026/05/25, 09:30:42

← VictoriaLogs集群采集Kubernetes Pod日志 日志采集操作示例→

最近更新
01
VictoriaLogs集群采集Kubernetes Pod日志
05-24
02
kubernetes证书续签到100年
05-04
03
istio入门
04-29
更多文章>
Theme by Vdoing | Copyright © 2019-2026 | 点击查看十年之约 | 鄂ICP备2024072800号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式