日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pod Preset玩转K8S容器时区自动配置

發布時間:2024/8/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pod Preset玩转K8S容器时区自动配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

緣由

默認的情況,在K8S里啟動一個容器,該容器的設置的時區是UTC0,但是對于很多客戶而言,其主機環境并不在UTC0。例如中國客戶在UTC8。如果不把容器的時區和主機主機設置為一致,則在查找日志等時候將非常不方便,也容易造成誤解。但是K8S以及Docker容器沒有一個簡便的設置/開關在系統層面做配置。都需要我們從單個容器入手做設置,具體方法如下:

純Docker的時區設置方式

Docker引擎提供了兩種設置方式,分別是通過環境變量以及掛載主機文件方式來完成

方式一:設置容器的時區環境變量

先看看沒有設置前,容器的情況:

docker run -it --rm centos date cat /etc/localtime

從輸出可以看出,容器和主機差了8個時區

我們通過環境變量的方式來改變容器的時區:

docker run -it --rm -e "TZ=Asia/Shanghai" centos date cat /etc/localtime

從輸出可以看出,雖然沒有改變對應的localtime文件,但是容器和主機的時區是一致的了。

方式二:掛載主機的時區文件到容器中

docker run -it --rm -v /etc/localtime:/etc/localtime centos date cat /etc/localtime

從輸出可以看出,容器和主機的時區是一致的了,而且使用了本機的時區文件。

Kubernetes的時區設置方式

在K8S中,可以參考Docker的方式進行設置

通過環境變量設置

apiVersion: v1 kind: Pod metadata:name: pod-env-tz spec:containers:- name: ngximage: nginx:latestimagePullPolicy: IfNotPresentenv:- name: TZvalue: Asia/Shanghai

通過掛載主機時區文件設置

apiVersion: v1 kind: Pod metadata:name: pod-vol-tz spec:containers:- name: ngximage: nginx:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: tz-configmountPath: /etc/localtimereadOnly: truevolumes:- name: tz-confighostPath:path: /etc/localtime

這里引出了一個問題,難道每次每個容器都要做這樣的配置才可以么?可否在系統層面設置,而無需在對應yaml文件體現呢?不然yaml文件將過于啰嗦。答案是使用K8S的特性Pod Preset來控制容器啟動前先配置好對應時區環境變量,或者掛載主機文件。下面我們通過配置環境變量的方式說明,掛載文件是類似的,就不重復了。

通過Pod Preset預設置時區環境變量

激活Pod Preset

Pod Preset目前還是alpha階段,默認是沒有激活的,所以需要通過以下步驟激活:

咱們以阿里云的Kubernetes服務為例(如果還沒有,可以嘗試一下,一鍵就可以開通,還免費哦)。阿里云的Kubernetes服務的master組件(API Server, Scheduler, Controller)都是通過Static Pod的方式用Kubelet啟動,所以需要更改對應的yaml來激活Pod Preset:

編輯/etc/kubernetes/manifests/kube-apiserver.yaml,

  • 在-runtime-config增加settings.k8s.io/v1alpha1=true
  • 在--admission-control增加PodPreset`

保存后kubelet會自動重啟kube-apiserver組件。我們需要同時更改3臺機器的master才可以。在期間你將收到類似以下的告警,在api server重啟成功后會自動恢復

驗證配置成功

  • 確保api server已經恢復,如果恢復將收到如下通知信息:

  • kubectl可以查詢Pod Preset。在開關沒有開啟成功前,是無法調用以下命令的
kubectl get podpresets

配置設置時區的Pod Preset

對應的Pod Preset對象創建文件如下:

apiVersion: settings.k8s.io/v1alpha1 kind: PodPreset metadata:name: allow-tz-env spec:selector:matchLabels:env:- name: TZvalue: Asia/Shanghai

這里需要注意的地方是,一定需要寫selector...matchLabels,但是matchLabels為空,標示應用于所有容器,這個正式我們所期望的

kubectl apply -f allow-tz-env.yaml kubectl get podpresets

可以得到創建成功的Pod Preset列表:

以普通的方式創建容器,但是環境變量被Pod Preset注入了

apiVersion: v1 kind: Pod metadata:name: pod-no-tz spec:containers:- name: ngximage: nginx:latestimagePullPolicy: IfNotPresent

進入容器看看對應的環境變量:

從輸出可以看出,容器已經被默認配置了時區的環境變量,對應的時區是Asia/Shanghai

小結

至此,我們就完成了容器的時區的"自動"配置了。Pod Preset的預設功能還是非常便利的,目前這塊還在演進中,但是已經能大大簡化了相關的管理工作,將這些配置從開發者手中解脫出來,變成系統管理配置。

需要注意的是,Pod Preset是namespace級別的對象,其作用范圍只能是同一個命名空間下容器。

給社區的建議

建議Kubernetes社區可以在kubelet的啟動參數重,增加一個開關,用來設置容器的默認時區,畢竟這個是很常見的實踐


原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的Pod Preset玩转K8S容器时区自动配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。