首页 > 其他分享 >使用k8tz优雅的解决pod内的时区问题

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

时间:2022-10-18 09:45:42浏览次数:76  
标签:k8tz nginx2 master io pod root 时区

使用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,nginx2,master,io,pod,root,时区
From: https://www.cnblogs.com/jingzhe2020/p/16801532.html

相关文章

  • 修改k8s集群pod dns(coreDNS)配置
    背景公司访问的域名突然解析有问题了,需要修改nameserver,或者固定下hosts操作参考以下配置修改coredns的configmap(我这里是k8s的dashboard修改的地址是https:/......
  • 选择 podman 的理由, 以及它和 Kubernetes , Docker 的区别
    转载自https://zhuanlan.zhihu.com/p/506265757前言大家好,我是Liangdi,podman4.x版本已经发布了,我也从docker开始向podman迁移,所以是合适的时候写点podma......
  • CocoaPods升级与Ruby升级问题
    使用Homebrew升级Ruby后,替换系统的Ruby参考以下文章:https://mac.install.guide/ruby/13.htmlpod升级问题参考:https://www.it610.com/article/1294593630094303232.htm......
  • 在线时间戳转换工具的坑-同样的时间戳转为北京时间,转换结果受本机时区设置的影响
    背景前不久在写一个时间戳转化方法时偶然发现了,一些在线转化时间戳网站存在一些问题,即同样的时间戳都转为北京时间,转换结果受本机时区设置的影响。比如当前时间戳为:16658......
  • kubernetes学习笔记4-pod
    Pod资源定义​自主式pod资源,很少用到,手动创建的资源,用kubectldelete后不会自动创建,而使用pod控制器管理的才会按照用户期望的重新创建;​资源清单:一级字段(apiVersion|kind|m......
  • Xcode 14新建项目 Pod init失败
    使用Xcode14.0(14A309)新建了一个项目,然后运行Podinit,就报错,[Xcodeproj]Unknownobjectversion(56).(RuntimeError)和can'tmodifyfrozenString(FrozenError)。......
  • linux嵌入式系统修改时区
    一.网址参考1. 修改系统时区/etc/localtime 二.实践1.对/etc/localtime修改软链接,命令如下://1.先判断/etc/localtime是否存在,如果存在,则先删除i......
  • Debian中修改时区
    获取当前系统可用的时区名称timedatectllist-timezones记下符合你要求的时区,以root或者其他有sudo权限的用户身份,运行下面的命令:sudotimedatectlset-timezo......
  • kubernetes核心实战(二)---Pod+ReplicaSet
    3、podPod是可以在Kubernetes中创建和管理的、最小的可部署的计算单元。Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个)容器;这些容器共享存储、网络、以及怎样运行这些......
  • 创建自己的 Cocopod仓库
    创建自己的Cocopod仓库前言在iOS开发中,我们经常会使用到一些第三方库,如AFNetworking、SDWebImage等,一般使用CocoaPods来统一管理。那么如何把自己写的类库上传到......