使用开源工具 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,一经查实,立即删除!

相关文章

Android WebView 在内部打开链接,捕获错误

webView.setWebViewClient(new WebViewClient() {Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;//ture为在webview中打开}});webView.setWebChromeClient(new WebChromeClient() {Overridepublic void onReceiv…

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 密码 "…

ArcGIS实验教程——实验三十:地图注记与标注(标注转注记)用法案例详解

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 实验目录 一、实验描述二、地图标注1. 标注工具2. 标注属性默认设置3. 标注分类4. 多属性字段标注5. 标注转换6. 显示地图提示三、地图文档注记1. 注记组2. 创建地图文档注记3. 编辑地图文档注记一…

Android之实现多桌面图标app入口进入不同的页面,像2个独立运行的app一样,互不干扰。

1、需求 Android实现2个图标app入口进入不同的页面,一个图标点击进去主app页面,一个图标点击直接进入app页面的里面一个子页面,两个图标功能点击效果独立,不能乱跳,副桌面图标然后返回也是直接返回,不能先返回到本地,就是感觉像2个独立运行的app一样,互不干扰。 问题:…

启动obiee

启动obiee:1.启动数据库第一步&#xff1a;打开Oracle监听$ lsnrctl start第二步&#xff1a;使用sysdab角色登录sqlplussqlplus / as sysdba第三步&#xff1a;启动数据库SQL> startup 2.启动WebLogic&#xff1a;nohup /home/oracle/obiee11g/user_projects/domains/bifou…

ASP.NET中IsPostBack详解

1、IsPostBack介绍Page.IsPostBack是一个标志&#xff1a;当前请求是否第一次打开。 调用方法为&#xff1a;Page.IsPostBack或者IsPostBack或者this.IsPostBack或者this.Page.IsPostBack&#xff0c;它们都等价。  1)当通过IE的地址栏等方式打开一个URL时是第一次打开, 当通…

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

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

利用bat修复office文件图标

如果电脑上安装了office&#xff0c;再安装wps&#xff0c;卸载wps后office文件图标会丢失。利用下边的代码&#xff0c;另存为bat文件&#xff0c;运行后可以快速修复图标问题。 rem 修复office文件默认图标.bat:: office图标文件路径&#xff0c;请根据自己电脑上的安装目录设…

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之解决NestedScrollView嵌套RecyclerView部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部

1、问题 NestedScrollView嵌套Recyclerview部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部 部分布局大致如下 <androidx.core.widget.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent…

词法分析程序的功能

词法分析程序的功能其实就是对所输入的字段进行词法分析任务&#xff0c;对用户的源程序从左到右进行扫描&#xff0c;按照语言的词法规则识别各类单词&#xff0c;并产生相应单词的属性字&#xff0c;并随之显现出来&#xff0c;成为词法分析程序的功能 转载于:https://www.cn…

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安装…

【ArcGIS遇上Python】从入门到精通系列之第二章:ArcGIS Python基本语法基础速递

Python的语法和其它编程语言的语法有所不同,编写Python程序之前需要对语法有所了解,才能编写规范的Python程序。本篇介绍Python标识符的同时,也讨论了Python变量的声明和赋值。通过本章的学习,将对python的数据类型、操作符、变量与赋值、代码块及缩进对齐、控制结构、函数…

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

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

C语言试题五十八之请编写函数fun,:计算并输出下列多项式的值(sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n! )

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写函数…

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

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