k8tz/k8tz
GitHub: k8tz/k8tz
Kubernetes 时区注入工具,通过 Admission Controller 或 CLI 自动统一 Pod 和 CronJob 的时区配置。
Stars: 517 | Forks: 63
# Kubernetes 时区控制器

[](https://goreportcard.com/report/github.com/k8tz/k8tz)
[](https://codecov.io/gh/k8tz/k8tz)
[](go.mod)
[](CODE_OF_CONDUCT.md)
[](https://opensource.org/licenses/Apache-2.0)

`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)

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工具, 子域名突变, 容器化, 提示注入, 日志审计, 时区管理, 时间同步, 服务端, 自动化运维, 请求拦截, 集群管理