使用k8tz解决pod内的时区问题(坑的解决)

本站所有内容来自互联网收集,仅供学习和交流,请勿用于商业用途。如有侵权、不妥之处,请第一时间联系我们删除!Q群:迪思分享

免费资源网 – https://freexyz.cn/
目录使用k8tz优雅的解决pod内的时区问题1.问题简介2.k8tz3.安装k8t4.注入策略坑和解决办法1.helm安装失败2.查看时间的顺序

使用k8tz优雅的解决pod内的时区问题

1.问题简介

容器在主机的内核上运行,并获得时钟,但时区不是来自内核,而是来自用户空间。在大多数情况下,默认使用协调世界时 (UTC)。 时区的不一致,会带来很多困扰。即使代码与时区无关,但容器日志与系统日志时间相关联排查问题也会让人头疼。一些应用程序使用机器的时区作为默认时区,并希望用户设置时区。当集群中容器的时区不一致时,管理会很不容易。

2.k8tz

k8tz开源地址:https://github.com/k8tz/k8tz

k8tz是一个 Kubernetes 准入控制器和一个将时区注入 Pod 的 CLI 工具。可以用作手动工具来自动转换 Deployment 和 Pod 可以作为准入控制器安装并使用注释来完全自动化创建 Pod 的过程。

k8tz 可以使用hostPath的方式,或者将emptyDir 注入initContainer并用 TZif(时区信息格式) 文件填充卷。然后将emptyDir挂载到 Pod 每个容器的 /etc/localtime和 /usr/share/zoneinfo。为了确保所需的时区有效,它向所有容器添加了 TZ环境变量。

3.安装k8t

#官方提供的helm部署方式 helm repo add k8tz https://k8tz.github.io/k8tz/ helm install k8tz k8tz/k8tz –set timezone=Asia/Beijing ###除了helm安装官方还提供了其它方式,可以查看官方文档。 #查看 Pod 状态、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 是否禁止注入,当注入时区操作和禁止注入同时存在时,注入时区的优先级会高于禁止注入 #k8tz.io/timezone: Asia/Beijing 注入时区,时区选择根据自己需求 #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 也可以在命名空间中指定,并影响在命名空间中创建的所有 pod。下面创建一个 test namespace 用于测试: #因为k8tz默认会对新创建的pod更改时区所以这里测试用了shanghai和之前的beijing做区分 [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 #可以看到新创建的nginx2的时区为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安装失败

#有时候会因为网络问题导致安装失败 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时区时一定要在安装k8tz之前操作,安装k8tz时会默认添加时区给新创建的pod自动添加k8tz.io/timezone

免费资源网 – https://freexyz.cn/


© 版权声明
THE END
★喜欢这篇文章吗?喜欢的话,麻烦动动手指支持一下!★
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容