kubernetes容器时间

半兽人 发表于: 2025-08-01   最后更新时间: 2025-08-01 14:33:50  
{{totalSubscript}} 订阅, 30 游览

kubernetes容器时间问题一般分为2种:

  1. kubectl get podskubectl describe 里看到的 START TIMECREATED AT 显示的不是北京时间(CST / Asia/Shanghai)。
  2. 容器内部的日志时间 与中国时间不一致。

这两个问题需要分别解决:

1. Kubernetes Deployment 显示时间不是中国时间

  • Kubernetes 控制面(kube-apiserverkubectl)默认使用 UTC 时间
  • kubectl 的输出总是 UTC,无法通过 Deployment 配置改变。

解决方法:

  • 只影响显示,不影响容器运行。
  • 想在本地看到北京时间,可以在 kubectl 命令加上时区转换:
kubectl get pods -o custom-columns=NAME:.metadata.name,CREATED:".metadata.creationTimestamp" \
| while read name created; do
  if [[ "$created" != "CREATED" ]]; then
    echo "$name  $(TZ='Asia/Shanghai' date -d "$created" '+%Y-%m-%d %H:%M:%S')"
  else
    echo "$name  CREATED"
  fi
done

或者直接用 kubectl get events --sort-by=.metadata.creationTimestamp + 本地脚本转换。

2. 容器内部时间不是中国时间

  • 容器镜像默认使用 UTC。
  • 日志、应用程序时间也会显示为 UTC。

解决方法:

方法1:启动容器时设置时区

在 Deployment 的 spec.template.spec.containers 中加:

env:
  - name: TZ
    value: Asia/Shanghai

大部分基于 glibc 的镜像会自动切换时区。

方法2:挂载宿主机的时区文件

如果镜像是 alpine 或轻量镜像,可能需要挂载 /etc/localtime

      volumeMounts:
        - name: tz-config
          mountPath: /etc/localtime
          readOnly: true
      volumes:
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai

这样容器里的时间和宿主机一致。

方法3:基础镜像直接设置时区

在 Dockerfile 中写:

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

然后重新构建镜像。

推荐实践

  • K8s 系统时间显示 UTC 是正常的,不必改。
  • 应用容器内部时间建议设置为 Asia/Shanghai,否则日志和实际时间对不上。

完整的Yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: nginx:1.25 # 这里换成你的镜像
          ports:
            - containerPort: 80

          # 方法1:设置时区环境变量
          env:
            - name: TZ
              value: Asia/Shanghai

          # 方法2:挂载宿主机时区文件
          volumeMounts:
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
      volumes:
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
更新于 2025-08-01

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章