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

目录
  • 使用k8tz优雅的解决pod内的时区问题
  • 1.问题简介
  • 2.k8tz
  • 3.安装k8t
  • 4.注入策略
  • 坑和解决办法
    • 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

到此这篇关于使用k8tz优雅的解决pod内的时区问题的文章就介绍到这了,更多相关k8tz时区问题解决内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pod调度将 Pod 指派给节点

    目录 一.系统环境 二.前言 三.pod的调度 3.1 pod的调度概述 3.2 pod自动调度 3.2.1 创建3个主机端口为80的pod 3.3 使用nodeName 字段指定pod运行在哪个节点 3.4 使用节点标签nodeSelector指定pod运行在哪个节点 3.4.1 查看标签 3.4.2 创建标签 3.4.3 通过标签控制pod在哪个节点运行 3.5 使用亲和性与反亲和性调度pod 3.5.1 使用硬策略requiredDuringSchedulingIgnoredDuringE

  • 静态pod 创建使用示例详解

    目录 一.系统环境 二.前言 三.静态pod 3.1 何为静态pod 3.2 创建静态pod 3.2.1 使用--pod-manifest-path指定静态pod目录 3.2.2 静态pod默认目录/etc/kubernetes/manifests 一.系统环境 服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64

  • pod污点taint 与容忍度tolerations详解

    目录 一.系统环境 二.前言 三.污点taint 3.1 污点taint概览 3.2 给节点添加污点taint 四.容忍度tolerations 4.1 容忍度tolerations概览 4.2 设置容忍度tolerations 一.系统环境 服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64 Kubernete

  • 云原生技术kubernetes调度单位pod的使用详解

    k8s中的最小调度单位---pod 之前的文章中,我们对k8s能够解决的问题做了简单介绍,简单来说,它解决的问题是容器的编排与调度,它的核心价值在于:运行在大规模集群的任务之间,实际上存在着各种各样的关系,这些关系的处理,才是任务编排和系统管理最困难的地方,k8s就是为了这个问题而生的. 这句话比较难理解,我们从已有的知识入手,抽丝剥茧,慢慢理解它.我们已经知道,容器的本质是一个进程,它包含三个部分: 如果说容器是云环境的一个进程,那么你可以将k8s理解成云环境中的一个操作系统. 在一个操作系统

  • k8s 中的 service 如何找到绑定的 Pod 及实现 Pod 负载均衡的方法

    目录 k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 前言 endpoint kube-proxy userspace 模式 iptables ipvs kernelspace 服务发现 环境变量 DNS 总结 参考 k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 前言 Service 资源主要用于为 Pod 对象提供一个固定.统一的访问接口及负载均衡的能力. service 是一组具有相同 label pod 集合的抽

  • 详解kubelet 创建pod流程代码图解及日志说明

    目录 正文 kubernetes调度pod简介 kubelet 创建pod代码及图解说明 kubelet 简介 kubelet创建及启动pod流程 kubelet 创建pod代码调用图解 kubelet 创建pod详细说明 kubelet 调用cri说明 kubelet创建pod整体架构图 kubelet创建pod日志说明 正文 本文将从如下方面介绍kubelet创建pod的过程 kubernetes调度pod简介 kubelet 创建pod代码图解说明 (本文重点) kubelet 调用cri

  • 如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码.  但是ping mysql所在服务器却很快!  想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果反向解析不顺畅, 估计就会延迟很多,  给人的感觉是连接速度N慢!)     在网上搜索了下解决办法, 发现有两种:   一. 两边机器配置的resolve.conf不一样, 把resolve.conf配置成速度比较快的DNS就OK 二. 把mysql配置中的

  • 解决webview内的iframe中的事件不可用的问题

    最近做Android的Webview开发,使用iframe中嵌入了很多页面,嵌入的页面却不可用,最后发现是 webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return super.shouldOverrideUrlLoading(view, url); } 不要覆写 shouldOverride

  • Golang时间处理中容易踩的坑分析解决

    目录 简介 类型 时区 小心有坑 时间解析的使用场景 时间操作 获取当前时间 时区设置 时间格式化(时间类型转字符串) 时间类型转时间戳 时间戳转时间类型 时间字符串转时间类型 时间计算 获取时间类型具体内容 时间加减 时间间隔(耗时) 时间取整(向上取整向下取整) 拓展 json时间转换 简介 在各个语言之中都有时间类型的处理,因为这个地球是圆的(我仿佛在讲废话),有多个时区,每个时区的时间不一样,在程序中有必要存在一种方式,或者说一种类型存储时间,还可以通过一系列的方法转换成不同国家的时间.

  • MySQL5.7中的sql_mode默认值带来的坑及解决方法

    在正常项目开发过程中,如果MySQL版本从5.6升级到5.7版本.作为DBA在考虑数据库版本升级带来的影响时,一般会有几个注意点: sql_mode optimizer_switch 本文主要内容是MySQL升级到5.7版本之后,由于默认的 sql_mode 值带来的坑以及对应的解决方案. 案例一:ONLY_FULL_GROUP_BY 问题描述 MySQL版本从5.6升级至5.7之后,部分SQL执行报错,报错信息如下: ERROR 1055 (42000): Expression #3 of X

  • 分享mysql的current_timestamp小坑及解决

    目录 mysql的current_timestamp小坑 报错 我的方案 mysql5.5.23 current_timestamp问题 原版说明 解决办法 mysql的current_timestamp小坑 报错 Incorrect table definition;there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause 网上的答案基本如下,但是就是没有具体解决 方

  • Android 弹出软键盘所遇到的坑及解决方法

    demo下载 重要代码: //1.此layout作为最外层的layout: //2.设置需要调整的view: setAdjustView(View view); //3.如果需要控制输入框的显示与隐藏,可以实现OnInputViewVisibleListener接口: public class SoftInputAdjustLayout extends RelativeLayout { private static final String TAG = SoftInputAdjustLayout

  • 解决Mac下使用python的坑

    操作系统:macOS High Sierra 10.13.3 Python3.6 因为此版本自带python2.7,就下载并安装了anaconda2的版本,结果使用的时候系统自带的python和anaconda里的python冲突,也就是装包的时候只在一处装了,另一处却不能使用.因此要配置环境变量,替代到系统自带的版本. python2.7总会发生中文字体乱码的情况,果断放弃,准备使用anaconda3. 1.安装anaconda3 在官网下载,并安装,直接都是下一步. 2.修改环境变量 在命令

  • 浅谈vue引入css,less遇到的坑和解决方法

    在使用vux开发手机页面时,引入vux的公共样式less一直报错,通过各种百度,Google都没有解决,走了很多弯路.最后才发现钻牛角尖了,可以换一种方法引入. 1.报错的使用:在App中 @ ./~/css-loader?{"minimize":false,"sourceMap":false}!./~/vux/src/styles/reset. less 3:10-115 @ ./~/css-loader?{"minimize":false,&

  • 基于IOS端微信分享失效的踩坑及解决方法

    最近的一个公众号是基于vue的spa应用,在接入微信分享和微信语音的时候出现了:在Android上一切正常,但是在ios端调用wx.config的时候总是失败,去翻了官方文档也并没有找到解决方案,最后在测试中发现是因为初始化的时候传入的URL的问题.具体过程如下: 微信config接口配置,官方文档如下: 所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支

随机推荐