k8s時區問題解決方案


前幾天在使用k8s中的CronJob時發現了一個很奇怪的問題, 按照官方文檔的demo跑起來是沒有任何問題的,
但是當我想要設置每天一個固定時間點例如12點20執行一個job的時候,到了時間之后無論如何都不會執行。

一開始懷疑是cron表達式寫的有問題,但是經過多次試驗倒是沒問題,然后就想到了時區的問題。

首先我先嘗試使用PodPreset來修改所有容器的時區(在pod 創建時,用戶可以使用 podpreset 對象將特定信息注入 pod 中,這些信息可以包括 secret、 卷、 卷掛載和環境變量)

默認k8s是沒有開啟PodPreset的,開啟PodPreset需要修改master節點上的/etc/kubernetes/manifests/kube-apiserver.yaml文件

1
2
3
首先在CMD末尾添加一個--runtime-config=settings.k8s.io/v1alpha1=true
在--enable-admission-plugins的后面增加一個PodPreset
重啟k8s systemctl restart kubelet

創建一個yml,為所有的pod掛載一個時區的環境變量

1
2
3
4
5
6
7
8
9
10
11
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: tz-env
namespace: unicode-pay
spec:
selector:
matchLabels:
env:
- name: TZ
value: Asia/Shanghai

注意:

  1. Pod Preset是namespace級別的對象,其作用范圍只能是同一個命名空間下容器
  2. matchLabels為空代表選擇所有

此時再次嘗試CronJob之后發現還是不執行,然后進入該命名空間下的其他pod之后查看時間發現也沒問題。

此時想到了雖然把pod的時區更改了,但是k8s調度器可不是按照pod的時間進行調度的,原來此時需要修改的是k8s的時區

再次來到/etc/kubernetes/manifests目錄,使用如下方式修改此目錄下4個k8s的組件的時間

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: time
spec:
containers:
volumeMounts:
- name: config
mountPath: /etc/localtime
readOnly: true
volumes:
- name: config
hostPath:
path: /etc/localtime

重啟k8s,搞定

systemctl restart kubelet


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM