k8tz/k8tz

GitHub: k8tz/k8tz

Kubernetes 时区注入工具,通过 Admission Controller 或 CLI 自动统一 Pod 和 CronJob 的时区配置。

Stars: 517 | Forks: 63

# Kubernetes 时区控制器 ![构建工作流状态](https://img.shields.io/github/actions/workflow/status/k8tz/k8tz/go.yaml?branch=master) [![Go 报告卡](https://img.shields.io/badge/go%20report-A+-brightgreen.svg?style=flat)](https://goreportcard.com/report/github.com/k8tz/k8tz) [![codecov](https://codecov.io/gh/k8tz/k8tz/branch/master/graph/badge.svg?token=3HEoptX1C0)](https://codecov.io/gh/k8tz/k8tz) [![Go 版本](https://img.shields.io/github/go-mod/go-version/k8tz/k8tz)](go.mod) [![贡献者公约](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) [![许可证](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) ![k8tz Logo](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/ab32ccb9f9133857.png) `k8tz` 是一个 kubernetes admission controller 和 CLI 工具,用于将时区注入到 Pod 和 CronJob 中[^1]。 容器不会从主机继承时区,只能访问来自内核的时钟。大多数镜像的默认时区是 UTC,但这并不能保证,不同的容器可能会有不同的时区。使用 `k8tz`,可以轻松地以最小的代价自动标准化 Pod 和 Namespace 中的选定 时区。 ## 功能 :zap: 协调集群和/或 Namespace 中所有 Pod 的时区(默认强制使用 UTC) :zap: 标准化集群中所有 Pod 的 [tzdata](https://www.iana.org/time-zones) 版本 :zap: 不需要在镜像或节点中安装 [tzdata](https://www.iana.org/time-zones) :zap: 通过 [Helm values](charts/k8tz/README.md#values) 和 [Annotations](#annotations) 轻松配置 :zap: 用于手动时区注入的 [CLI 工具](#cli) :zap: 支持 Kubernetes 1.16+ 和 OpenShift 4.X 了解更多:[Timezone in Kubernetes With k8tz](https://medium.com/@yonatankahana/timezone-in-kubernetes-with-k8tz-fdefca785238) ## 安装 Admission Controller (Helm) ![简短演示](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/0ecbc0e288133914.gif) tl;dr: ``` helm repo add k8tz https://k8tz.github.io/k8tz/ helm install k8tz k8tz/k8tz --set timezone=Europe/London ``` 在图表 [README](charts/k8tz/README.md) 中了解更多信息。 ## CLI `k8tz` 可以用作命令行工具,将时区注入到 yaml 文件中,或者集成到另一个不想使用 admission controller 自动化的部署脚本中。 ### 示例 你可以通过文件到文件的方式处理 `test-pod.yaml`,或者直接通过管道传给 `kubectl`: ``` # 到文件 k8tz inject --strategy=hostPath test-pod.yaml > injected-test-pod.yaml # 或直接到 kubectl k8tz inject --timezone=Europe/London test-pod.yaml | kubectl apply -f - ``` 或者你可以注入到当前 Namespace 中所有现有的 Deployment: ``` kubectl get deploy -oyaml | k8tz inject - | kubectl apply -f - ``` 注意:注入过程是幂等的;你可以多次执行,也可以在使用 CLI 注入的同时使用 admission controller。后续的注入不会产生任何影响。 ### 下载 GitHub Release 你可以通过下载预编译的二进制文件来安装 k8tz 二进制文件并使用它 ``` wget -c https://github.com/k8tz/k8tz/releases/download/v0.19.0/k8tz_0.19.0_linux_amd64.tar.gz -O - | tar xz chmod +x k8tz ./k8tz version ``` 然后使用以下命令将其安装到你的 `$PATH` 中: ``` sudo install k8tz /usr/local/bin/k8tz ``` ### Go Install 如果你已经安装了 `go`,可以使用以下命令安装 `k8tz`: ``` go install github.com/k8tz/k8tz@latest ``` ### 使用 Docker 你可以直接从 Docker 使用 k8tz,以下是一些示例: ``` docker run -i quay.io/k8tz/k8tz --help cat test-pod.yaml | docker run -i quay.io/k8tz/k8tz inject -tPortugal - | kubectl create -f kubectl get deploy -oyaml | docker run -i quay.io/k8tz/k8tz inject - | kubectl apply -f ``` ### 从源代码构建 你可以通过简单地运行以下命令,自行从源代码构建 `k8tz` 二进制文件: ``` make compile ``` 创建的二进制文件将位于 `build/k8tz`,你可以使用以下命令将其安装到你的 PATH 中: ``` make TARGET=/usr/local/bin install ``` 要卸载,请使用 `sudo rm -v /usr/local/bin/k8tz`。 ## 注入策略 时区信息使用时区信息格式文件(`TZif`,[RFC-8536](https://datatracker.ietf.org/doc/html/rfc8536))定义。时区数据库包含 `TZif` 文件,这些文件代表全球许多地区的本地时间。要设置容器的时区,容器内的 `/etc/localtime` 应指向代表请求时区的有效 `TZif` 文件。在大多数镜像中,这些文件默认不存在,因此我们需要通过挂载到 `/etc/localtime` 使其在容器内部可用。 目前有两种实现策略: ### 使用 **hostPath** 如果这些文件(位于 `/usr/share/zoneinfo` 下)存在于集群的每个节点上(这是用户的责任),则可以使用 `hostPath` 卷将所需的 `TZif` 文件提供给 Pod。如果主机上缺少所需的时区,Pod 将卡在 `PodInitializing` 状态并且无法启动。 ### 使用引导程序 **initContainer** 另一种通常更安全的解决方案是向 Pod 注入 `initContainer`(引导镜像),并使用共享的 `emptyDir` 卷提供所需的 `TZif` 文件。这是 k8tz 的默认方法。 ## Annotations 控制器的行为可以通过 `Pod` 和/或 `Namespace` 对象上的 Annotations 进行更改。如果在两者中都指定了相同的 Annotation,则 `Pod` 的 Annotation 值将生效。 | Annotation | 描述 | 默认值 | |--------------------|------------------------------------------------------------------------|-----------------| | `k8tz.io/inject` | 决定 k8tz 是否应该注入时区 | `true` | | `k8tz.io/timezone` | 决定应该使用什么时区,例如:`Africa/Addis_Ababa` | `UTC` | | `k8tz.io/strategy` | 决定使用什么注入策略,即:`hostPath`/`initContainer` | `initContainer` | ## 路线图 - [X] 支持 `StatefulSet` 注入 - [X] 支持 `CronJob` 注入 - [ ] 更好的查找 Pod 所有者 Annotation 的方法 - [X] 在 OpenShift 上测试并记录安装过程 - [X] 实现 `make install` 以便从源代码更轻松地安装 - [X] 为 Helm 添加 VERBOSE 标志 - [X] 为 webhook 编写详细日志 - [X] 为 Helm chart 单独编写 README [^1]: CronJob 的时区仅在 kubernetes >=1.24.0-beta.0 且启用了 [`CronJobTimeZone`](https://github.com/kubernetes/enhancements/blob/aad71056d33eccf3845b73670106f06a9e74fec6/keps/sig-apps/3140-TimeZone-support-in-CronJob/README.md) feature gate 时才可用。
标签:Admission Controller, CronJob, DevOps工具, EVTX分析, Go, Helm Chart, NIDS, OpenShift, Pod注入, Ruby工具, 子域名突变, 容器化, 提示注入, 日志审计, 时区管理, 时间同步, 服务端, 自动化运维, 请求拦截, 集群管理