kubernetes容器时间问题一般分为2种:
kubectl get pods
或kubectl describe
里看到的START TIME
、CREATED AT
显示的不是北京时间(CST / Asia/Shanghai)。- 容器内部的日志时间 与中国时间不一致。
这两个问题需要分别解决:
1. Kubernetes Deployment 显示时间不是中国时间
- Kubernetes 控制面(
kube-apiserver
、kubectl
)默认使用 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