目錄
- 使用k8tz優(yōu)雅的解決pod內(nèi)的時區(qū)問題
- 1.問題簡介
- 2.k8tz
- 3.安裝k8t
- 4.注入策略
- 坑和解決辦法
- 1.helm安裝失敗
- 2.查看時間的順序
使用k8tz優(yōu)雅的解決pod內(nèi)的時區(qū)問題
1.問題簡介
容器在主機的內(nèi)核上運行,并獲得時鐘,但時區(qū)不是來自內(nèi)核,而是來自用戶空間。在大多數(shù)情況下,默認(rèn)使用協(xié)調(diào)世界時 (UTC)。 時區(qū)的不一致,會帶來很多困擾。即使代碼與時區(qū)無關(guān),但容器日志與系統(tǒng)日志時間相關(guān)聯(lián)排查問題也會讓人頭疼。一些應(yīng)用程序使用機器的時區(qū)作為默認(rèn)時區(qū),并希望用戶設(shè)置時區(qū)。當(dāng)集群中容器的時區(qū)不一致時,管理會很不容易。
2.k8tz
k8tz開源地址: https://github.com/k8tz/k8tz
k8tz
是一個 Kubernetes 準(zhǔn)入控制器和一個將時區(qū)注入 Pod 的 CLI 工具。可以用作手動工具來自動轉(zhuǎn)換 Deployment 和 Pod 可以作為準(zhǔn)入控制器安裝并使用注釋來完全自動化創(chuàng)建 Pod 的過程。
k8tz
可以使用hostPath
的方式,或者將emptyDir
注入initContainer
并用 TZif(時區(qū)信息格式) 文件填充卷。然后將emptyDir
掛載到 Pod 每個容器的 /etc/localtime
和 /usr/share/zoneinfo
。為了確保所需的時區(qū)有效,它向所有容器添加了 TZ
環(huán)境變量。
3.安裝k8t
#官方提供的helm部署方式 helm repo add k8tz https://k8tz.github.io/k8tz/ helm install k8tz k8tz/k8tz --set timezone=Asia/Beijing ###除了helm安裝官方還提供了其它方式,可以查看官方文檔。 #查看 Pod 狀態(tài)、Mutatingwebhookconfigurations、Service 等資源是否正常: [root@master ~]# kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io NAME WEBHOOKS AGE k8zt-k8tz 1 2m [root@master ~]# kubectl get all -n k8tz NAME READY STATUS RESTARTS AGE pod/k8zt-k8tz-7559df766-zlxdz 1/1 Running 0 2m36s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/k8zt ClusterIP 10.68.247.230 <none> 443/TCP 2m36s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/k8zt-k8tz 1/1 1 1 2m36s NAME DESIRED CURRENT READY AGE replicaset.apps/k8zt-k8tz-7559df766 1 1 1 2m36s
4.注入策略
官方提供了三種策略:hostpath、initcontainer、annotations
這里主要講annotations方式
#annotations主要有三個鍵值對 #k8tz.io/inject: true/false 是否禁止注入,當(dāng)注入時區(qū)操作和禁止注入同時存在時,注入時區(qū)的優(yōu)先級會高于禁止注入 #k8tz.io/timezone: Asia/Beijing 注入時區(qū),時區(qū)選擇根據(jù)自己需求 #k8tz.io/strategy: hostpath/initcontainer 提供了掛載本地文件和init容器兩種方式 #測試 #部署一個測試ng [root@master k8tz]# cat ng1.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 [root@master k8tz]# date Mon Oct 10 15:02:41 CST 2022 [root@master k8tz]# kubectl exec -it nginx-7fb7fd49b4-xm5wr sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # date Mon Oct 10 07:02:54 UTC 2022 ##添加注釋 k8tz.io/timezone: Asia/Beijing [root@master k8tz]# cat ng2.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx2 annotations: k8tz.io/timezone: Asia/Beijing spec: replicas: 1 selector: matchLabels: app: nginx2 template: metadata: labels: app: nginx2 spec: containers: - name: nginx2 image: nginx:alpine ports: - containerPort: 80 [root@master k8tz]# date Mon Oct 10 15:06:14 CST 2022 [root@master k8tz]# kubectl exec -it nginx2-67b5db4568-zhps7 sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # date Mon Oct 10 07:06:25 UTC 2022 #查看nginx2的啟動流程,可以看到先啟動了一個k8tz的init容器 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 111s default-scheduler Successfully assigned default/nginx2-67b5db4568-zhps7 to 192.168.130.176 Normal Pulled 111s kubelet Container image "quay.io/k8tz/k8tz:0.8.0" already present on machine Normal Created 111s kubelet Created container k8tz Normal Started 111s kubelet Started container k8tz Normal Pulled 110s kubelet Container image "nginx:alpine" already present on machine Normal Created 110s kubelet Created container nginx2 Normal Started 110s kubelet Started container nginx2 ##annotations 也可以在命名空間中指定,并影響在命名空間中創(chuàng)建的所有 pod。下面創(chuàng)建一個 test namespace 用于測試: #因為k8tz默認(rèn)會對新創(chuàng)建的pod更改時區(qū)所以這里測試用了shanghai和之前的beijing做區(qū)分 [root@master ~]# kubectl create ns test [root@master ~]# kubectl annotate ns test k8tz.io/strategy=hostPath namespace/test annotated [root@master ~]# kubectl annotate ns test k8tz.io/timezone=Asia/Shanghai namespace/test annotated #可以看到新創(chuàng)建的nginx2的時區(qū)為shanghai Name: nginx2-67b5db4568-9zjpb Namespace: test Priority: 0 Node: 192.168.130.176/192.168.130.176 Start Time: Mon, 10 Oct 2022 15:26:35 +0800 Labels: app=nginx2 pod-template-hash=67b5db4568 Annotations: k8tz.io/injected: true k8tz.io/timezone: Asia/Shanghai Status: Running
坑和解決辦法
1.helm安裝失敗
#有時候會因為網(wǎng)絡(luò)問題導(dǎo)致安裝失敗 Error: failed to download "k8tz/k8tz" (hint: running `helm repo update` may help) #可以先helm拉到本地再安裝,多嘗試幾次安裝也可 [root@master root]# helm install k8zt --set timezone=Asia/Beijing k8tz-0.8.0.tgz NAME: k8zt LAST DEPLOYED: Mon Oct 10 14:46:55 2022 NAMESPACE: default STATUS: deployed REVISION: 1
2.查看時間的順序
查看pod時區(qū)時一定要在安裝k8tz之前操作,安裝k8tz時會默認(rèn)添加時區(qū)給新創(chuàng)建的pod自動添加k8tz.io/timezone