使用开源工具 k8tz 优雅设置 Kubernetes Pod 时区

容器在主机的内核上运行,并获得时钟,但时区不是来自内核,而是来自用户空间。在大多数情况下,默认使用协调世界时 (UTC)。

697ace6decd63a76022c06c1f6b94d97.png

时区的不一致,会带来很多困扰。即使代码与时区无关,但容器日志与系统日志时间相关联排查问题也会让人头疼。一些应用程序使用机器的时区作为默认时区,并希望用户设置时区。当集群中容器的时区不一致时,管理会很不容易。

k8tz

k8tz是开源项目,请查看:github.com/k8tz/k8tz

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

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

安装

用 Helm 安装 k8tz准入控制器:

helm repo add k8tz https://k8tz.github.io/k8tz/
helm install k8tz k8tz/k8tz --set timezone=Asia/Shanghai

查看 Pod 状态、Mutatingwebhookconfigurations、Service 等资源是否正常:

# kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io  k8tz
NAME   WEBHOOKS   AGE
k8tz   1          31m# kubectl get svc -n  k8tz
NAME   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
k8tz   ClusterIP   10.233.212.11   <none>        443/TCP   31m# kubectl get pod -n  k8tz
NAME                    READY   STATUS    RESTARTS   AGE
k8tz-59bb7f7cbd-5dzmq   1/1     Running   0          31m

测试

现在可以创建 Pod,不需要任何额外配置:

# kubectl run -i -t ubuntu --image=ubuntu:21.04 --restart=OnFailure --rm=true --command date
Defaulted container "ubuntu" out of: ubuntu, k8tz (init)
Wed Jun 15 14:11:53 CST 2022
pod "ubuntu" deleted

此时的 Pod yaml 如下,环境变量 TZ 使用安装时指定的 Asia/Shanghai,以及注入了 initContainers、volumeMounts、volumes 等配置:

apiVersion: v1
kind: Pod
metadata:labels:run: ubuntuname: ubuntunamespace: default
spec:containers:- command:- dateenv:- name: TZvalue: Asia/Shanghaiimage: ubuntu:21.04imagePullPolicy: IfNotPresentname: ubuntuvolumeMounts:- mountPath: /etc/localtimename: k8tzreadOnly: truesubPath: Asia/Shanghai- mountPath: /usr/share/zoneinfoname: k8tzreadOnly: trueinitContainers:- args:- bootstrapimage: quay.io/k8tz/k8tz:0.5.0imagePullPolicy: IfNotPresentname: k8tzvolumeMounts:- mountPath: /mnt/zoneinfoname: k8tzvolumes:- emptyDir: {}name: k8tz

还可以指定 annotations,例如 k8tz.io/timezone=Europe/London选择 pod 的时区:

# kubectl run -i -t ubuntu --image=ubuntu:21.04 --restart=OnFailure --rm=true --command date --annotations k8tz.io/timezone=Europe/London
Defaulted container "ubuntu" out of: ubuntu, k8tz (init)
Wed Jun 15 07:13:42 BST 2022
pod "ubuntu" deleted

或者使用注解 k8tz.io/inject禁用时区注入 Pod :

# kubectl run -i -t ubuntu --image=ubuntu:21.04 --restart=OnFailure --rm=true --command date --annotations k8tz.io/inject=false
Wed Jun 15 06:14:47 UTC 2022
pod "ubuntu" deleted

如果你想使用 hostPath而不是 initContainer方式注入时区配置,可以使用 k8tz.io/strategy注解:

# kubectl run -i -t ubuntu --image=ubuntu:21.04 --restart=OnFailure --rm=true --command date --annotations k8tz.io/strategy=hostPath
Wed Jun 15 14:15:26 CST 2022
pod "ubuntu" deleted

annotations 也可以在命名空间中指定,并影响在命名空间中创建的所有 pod。下面创建一个 test-k8tz namespace 用于测试:

# k create ns test-k8tz
namespace/test-k8tz created# k annotate ns test-k8tz k8tz.io/strategy=hostPath
namespace/test-k8tz annotated# k annotate ns test-k8tz k8tz.io/timezone=Europe/London
namespace/test-k8tz annotated

上面将策略设置为 hostPath 注入方式。因为安装 k8tz 时默认时区已经设置为 Asia/Shanghai,所以这里将 test-k8tz namespace 时区设置为 Europe/London,方便区分。

此时创建的 Pod 不需要加任何注解:

# kubectl run -n test-k8tz  -i -t ubuntu --image=ubuntu:21.04 --restart=OnFailure  --command date
Wed Jun 15 07:19:48 BST 2022

此时创建的 Pod yaml 如下,此时用的是 hostPath 注入方式:

apiVersion: v1
kind: Pod
metadata:labels:run: ubuntuname: ubuntunamespace: test-k8tz
spec:containers:- command:- dateenv:- name: TZvalue: Europe/Londonimage: ubuntu:21.04imagePullPolicy: IfNotPresentname: ubuntuvolumeMounts:- mountPath: /etc/localtimename: k8tzreadOnly: truesubPath: Europe/London- mountPath: /usr/share/zoneinfoname: k8tzreadOnly: truevolumes:- hostPath:path: /usr/share/zoneinfotype: ""name: k8tz

结论

Kubernetes 中的时区问题有多种解决方案,这些解决方案可以手动实现,但在此过程中存在一些挑战和限制。

使用 k8tz可以自动执行该过程,确保系统中所有组件的时区一致,并且所有组件都可以访问有关不同时区的信息。并且无需额外设置或更改现有资源即可工作,即使在节点上没有所需文件时也是如此。

- END -


点个在看集群永保稳定👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04 tp6 的查数据 find、select、findOrEmpty、findOrFail、toArray、selectOrFail、value、column《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

学生信息管理系统小结

ASP.NETAccess 一、登入部分 主界面 Fm new 主界面(); string s1 "ProviderMicrosoft.Jet.OLEDB.4.0;Data Sourcestudent.mdb"; string s2 "select*from 登录信息表 where 用户名" this.ttbName.Text " and 密码 "…

05 tp6 的数据添加 助手函数、 save、insert、strict、replace、insertGetId、insertAll《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

VS2019如何创建C++项目?没有找到空项目(C++)完全解决方案

在使用Visual Studio 2019创建C++空项目时,没有空白项目可选,如下图所示,原因是在安装VS2019时没有选择C++对应的模块。本文讲解如何使用VS2019创建C++空项目,并使用C语言输出Hello World。 运行Visual Studio Installer,点击【修改】。 勾选【使用C++的桌面开发】,点击…

CentOS7.2 忘记root密码解决

CentOS 7 root密码的重置方式和CentOS 6完全不一样&#xff0c;以进入单用户模式修改root密码为例。 1.重启开机按esc&#xff0c;在第一行按e&#xff0c;进行编辑 2.编辑修改两处&#xff1a;ro改为rw,在LANGen_US.UFT-8后面添加init/bin/sh 3.按CtrlX重启&#xff0c;并修改…

android:制作 Nine-Patch 图片

它是一种被特殊处理过的 png 图片&#xff0c;能够指定哪些区域可以被拉伸而 哪些区域不可以。 那么 Nine-Patch 图片到底有什么实际作用呢&#xff1f;我们还是通过一个例子来看一下吧。比如 说项目中有一张气泡样式的图片 message_left.png&#xff0c;如图 3.38 所示。 图 …

08 获取器 withAttr、多连缀、whereRaw、事务、数据集《ThinkPHP6 入门到电商实战》

知识点&#xff1a;获取器 withAttr、多连缀、whereRaw、事务、数据集 文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商…

Chrome 双击关闭标签,新窗口打开新地址,一个插件搞定,安装方便,自带hosts

对&#xff0c;没错&#xff0c;就这它&#xff1a; 下载地址&#xff1a;https://shuax.com/project/greenchrome/ 一、插件安装 下载后&#xff0c;将下载的压缩包解压&#xff0c;根据自己Chreom浏览器是32位还是64位找到对应的 winmm.dll 文件&#xff0c;复制到Chome安装…

C#中的闭包和意想不到的坑

虽然闭包主要是函数式编程的玩意儿&#xff0c;而C#的最主要特征是面向对象&#xff0c;但是利用委托或lambda表达式&#xff0c;C#也可以写出具有函数式编程风味的代码。同样的&#xff0c;使用委托或者lambda表达式&#xff0c;也可以在C#中使用闭包。根据WIKI的定义&#xf…

投票彰显电信合约机诺基亚Lumia 800C受热捧

49元可以做什么&#xff1f;与朋友吃顿便饭、买几包好烟&#xff0c;同时也能参加中国电信Lumia 800C的合约购机计划&#xff0c;其中选择49元是最低套餐&#xff0c;选择并预存600元话费&#xff0c;便可以以2999元购买Lumia 800C。 对于Lumia 800C&#xff0c;它可是新一代诺…

07查询表达式 及 page分页、order 排序《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

基于netty的微服务架构

基于netty的微服务架构 微服务一篇好文章 http://san-yun.iteye.com/blog/1693759 教程 http://udn.yyuap.com/doc/essential-netty-in-action/GETTING%20STARTED/Introducing%20Netty.html netty原理 http://www.infoq.com/cn/articles/netty-server-create netty方面专家 李林…

无人机模拟操控凤凰模拟器(PhoenixRC 5.0)安装及配置图文教程(附凤凰模拟器下载地址)

文章目录 1. 凤凰模拟器简介2. 凤凰模拟器安装及配置图文教程3. 凤凰模拟器下载地址1. 凤凰模拟器简介 凤凰phoenixrc模拟器(航模8合1模拟器)是一款专业的飞行模拟器软件,它是属于航模新手练模拟专用,可模拟大疆无人机,各种穿越机,还有很多固定翼和直升机等等。凤凰模拟操…

NCF 的Dapr应用实例的运行

简介在进行今天的主要内容之前&#xff0c;先带大家了解一下DaprDapr 是一个可移植的、事件驱动的运行时&#xff0c;它使任何开发人员都可以轻松构建在云和边缘上运行的弹性、无状态和有状态的应用程序&#xff0c;并包含语言和开发人员框架的多样性。任何语言&#xff0c;任何…

06 tp6 的数据更新(改)及删除 《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

2020年:风雨兼程,不负韶华,注定是不平凡的一年

时光易逝&#xff0c;岁月不老。2020&#xff0c;发生了太多的惊喜。 文章目录小瑶瑶报到疫情防控&#xff0c;我们是认真的感谢CSDN一路相伴小瑶瑶报到 1月20日&#xff0c;闺女小瑶瑶已超过预产期一周了&#xff0c;决定入院进行手术&#xff0c;次日&#xff0c;手术顺利进…

Python对文件的操作(转)

一、文件对象 我理解的文件对象就是一个接口&#xff0c;通过这个接口对文件进行相关操作。 《Python 核心编程》上说的很晦涩&#xff0c;这里没有深刻理解到&#xff0c;希望有人能解释给我听。>>> f open(demo.txt,r) >>> f <open file demo.txt, mod…

微软发布全新Win11 轻量级系统Validation OS

你可能还不知道&#xff0c;在没有任何公开宣传的情况下&#xff0c;在最近&#xff0c;微软最近发布了一个全新的操作系统 Microsoft Validation OS。根据微软的说法&#xff0c;这是一个轻量级、快速且可自定义的基于 Windows 11 的操作系统。专门为硬件或软件供应商、开发人…

CSDN博客文章阅读模式插件(附源码)

插件地址&#xff1a;https://greasyfork.org/zh-CN/scripts/380667-csdn%E5%8D%9A%E5%AE%A2%E9%98%85%E8%AF%BB%E6%A8%A1%E5%BC%8F%E5%88%87%E6%8D%A2%E6%8F%92%E4%BB%B6 插件安装使用说明请参阅&#xff1a;https://greasyfork.org/zh-CN 浏览器&#xff08;正常&#xff09…

【ArcGIS风暴】ArcGIS tif转jpg:JPEG压缩仅支持8位或16位无符号数据(具有一个或三个波段,且没有色彩映射表)解决方案!

扩展阅读:【ArcGIS风暴】ArcGIS支持的栅格数据格式大全及格式转换案例精解 文章目录 问题描述tif格式和JPEG格式详解ArcGIS软件tif转jpg方法总结问题描述 如下图所示,在ArcGIS中将tif格式的无人机影像数据导出为Jpg格式时,提示:JPEG压缩仅支持8位或16位无符号数据(具有一…