k8s-timezone-config について
Kubernetes環境でPod内アプリの時刻をサンパウロ時間に設定するためのガイドです。HelmやDeployment、StatefulSetの設定例、確認方法、注意点を扱います。
主な機能
- 01TZによるコンテナのタイムゾーン設定
- 02HelmとKubernetesリソースの設定
- 03Pod内時刻の確認
- 04CronJobのタイムゾーン制約の説明
- 05イメージとアプリ固有の注意点
活用シーン
- 01Pod内アプリのローカル時刻表記の統一
- 02Pod内の複数コンテナへの時刻設定
- 03UTCのままのアプリ時刻のトラブルシューティング
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ julianobarbosa/ claude-code-skills --skill k8s-timezone-configインストール後、Claude Code で/k8s-timezone-configを入力して読み込まれたか確認します。
詳細
Kubernetes Pod のタイムゾーン設定
組織のインフラストラクチャで標準とするタイムゾーン: America/Sao_Paulo
問題
Kubernetes の Pod は、デフォルトで UTC で動作します。ログやアプリケーションのタイムスタンプには、ブラジルの現地時間(-0300)ではなく、+0000 のオフセットが表示されます。
解決方法
コンテナーの仕様に TZ 環境変数を追加します。
実装パターン
1. Helm の値(extraEnv パターン)
extraEnv をサポートする Helm チャートの場合:
# In values.yaml
extraEnv:
- name: TZ
value: America/Sao_Paulo
2. 複数のコンテナー
デプロイメントに複数のコンテナー(例:API サーバー+フロントエンド)がある場合は、すべてのコンテナーに TZ を追加します。
apiServer:
extraEnv:
- name: TZ
value: America/Sao_Paulo
frontend:
extraEnv:
- name: TZ
value: America/Sao_Paulo
3. Kubernetes の生のデプロイメント
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
env:
- name: TZ
value: America/Sao_Paulo
4. StatefulSet
apiVersion: apps/v1
kind: StatefulSet
spec:
template:
spec:
containers:
- name: app
env:
- name: TZ
value: America/Sao_Paulo
確認
デプロイ後、タイムゾーンが正しく設定されていることを確認します。
# Check pod logs for timestamp offset
# Before: 2026-01-13T11:37:06 +0000
# After: 2026-01-13T08:37:06 -0300
# Or exec into pod
kubectl exec -it <pod-name> -n <namespace> -- date
# Should show: Mon Jan 13 08:37:06 -03 2026
タイムゾーンの設定が必要な一般的なアプリケーション
| アプリケーション | 設定場所 | 備考 |
|---|---|---|
| Dependency-Track | apiServer.extraEnv + frontend.extraEnv | 両方のコンテナーに TZ が必要です |
| Grafana | env または extraEnvVars | 単一コンテナー |
| Loki | extraEnv | ログのタイムスタンプに影響します |
| Prometheus | server.env | アラートのタイムスタンプに影響します |
| DefectDojo | extraEnv | Django アプリ |
| PostgreSQL | primary.extraEnvVars | データベースのタイムスタンプ |
重要な注意事項
- 再起動が必要です:TZ の変更を反映するには、Pod を再起動する必要があります
- すべてのコンテナーが対象です:サイドカーも含め、Pod 内のすべてのコンテナーに TZ を設定します
- Init コンテナー:タイムスタンプをログに記録する場合は、Init コンテナーにも TZ を設定します
- Cron ジョブ:Kubernetes の CronJob スケジュールは常に UTC です。TZ が影響するのはコンテナーレベルの時刻のみです
組織の GitOps ワークフロー
argo-cd-helm-values/kube-addons/<service>/<cluster>/values.yamlの values.yaml を編集します- すべてのコンテナーに TZ 環境変数を追加します
- コミットしてプッシュします(ArgoCD が自動同期します)
- 新しいタイムゾーンで Pod が再起動することを確認します
参考情報
- IANA タイムゾーンデータベース:
America/Sao_Paulo= UTC-3(2019 年以降、夏時間なし) - Linux の TZ 変数:
/usr/share/zoneinfo/America/Sao_Pauloを使用します
注意点
TZ環境変数が影響するのはアプリケーションレベルのタイムスタンプのみです。kubectl logsのタイムスタンプには影響しません(これらは UTC のまま動作するコンテナーランタイムから取得されます)。Pod 内部の時刻がサンパウロ時間になった後も、kubelet のタイムスタンプは+0000のままです。- Pod の
TZに関係なく、CronJob のschedule:は常に UTC です。0 8 * * *のスケジュールは、ブラジリア時間(BRT)の 08:00 ではなく、05:00 に実行されます。CronJob 自体にspec.timeZone: America/Sao_Pauloを指定する(K8s 1.27 以降)か、UTC オフセットを手動で計算してください。 - Distroless イメージと scratch イメージには
/usr/share/zoneinfoがありません。そのため、TZ=America/Sao_Pauloを指定しても、警告なしに UTC にフォールバックします。tzdata を同梱するベースイメージを使用するか、configMap/volume を介してマウントしてください。 - 古いチャートでは、Init コンテナーはメインコンテナーの
TZを継承しません。Init コンテナーの仕様にも個別に設定しないと、マイグレーションのログは UTC のままです。 - Java アプリでは、TZ に加えて JAVA_OPTS に
-Duser.timezone=America/Sao_Pauloが必要です。ディストリビューションによっては、JVM は環境変数ではなく、独自のプロパティを参照します。 - PostgreSQL の
TZ環境変数が設定するのは OS の時刻であり、データベースのtimezone設定ではありません。now()によるサーバーのタイムスタンプには、引き続きpostgresql.confの値が使われます。両方を設定してください。
コメント
Markdown 対応