前幾天在使用k8s中的CronJob時發現了一個很奇怪的問題, 按照官方文檔的demo跑起來是沒有任何問題的,
但是當我想要設置每天一個固定時間點例如12點20執行一個job的時候,到了時間之后無論如何都不會執行。
一開始懷疑是cron表達式寫的有問題,但是經過多次試驗倒是沒問題,然后就想到了時區的問題。
首先我先嘗試使用PodPreset來修改所有容器的時區(在pod 創建時,用戶可以使用 podpreset 對象將特定信息注入 pod 中,這些信息可以包括 secret、 卷、 卷掛載和環境變量)
默認k8s是沒有開啟PodPreset的,開啟PodPreset需要修改master節點上的/etc/kubernetes/manifests/kube-apiserver.yaml文件
1 |
首先在CMD末尾添加一個--runtime-config=settings.k8s.io/v1alpha1=true |
創建一個yml,為所有的pod掛載一個時區的環境變量
1 |
apiVersion: settings.k8s.io/v1alpha1 |
注意:
- Pod Preset是namespace級別的對象,其作用范圍只能是同一個命名空間下容器
- matchLabels為空代表選擇所有
此時再次嘗試CronJob之后發現還是不執行,然后進入該命名空間下的其他pod之后查看時間發現也沒問題。
此時想到了雖然把pod的時區更改了,但是k8s調度器可不是按照pod的時間進行調度的,原來此時需要修改的是k8s的時區
再次來到/etc/kubernetes/manifests目錄,使用如下方式修改此目錄下4個k8s的組件的時間
1 |
apiVersion: v1 |
重啟k8s,搞定
systemctl restart kubelet