pod内时间时区与宿主机不一致

原因:pod内默认时区是UTC,宿主机时区是CST

解决方式:

一,如果仅仅是运行一个jar文件,可以使用如下命令:

 java  -jar  -Duser.timezone=GMT+08  xxx.jar

在k8s的Deployment文件中,加入上述JVM启动参数:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: xxxx
  namespace: dev
  labels:
    app: xxxx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xxxx
  template:
    metadata:
      labels:
        app: xxxx
    spec:
      containers:
        - name: xxxx
          image: xxxx
          command:
            - java
            - '-jar'
            - '-server'
            - '-Duser.timezone=GMT+08'  #这里指定时区
            - /xxx.jar

这种方式简单,但是只能针对这个java应用设定时区,其他应用的时区还是pod的时区

二,通过环境变量设定pod的时区

apiVersion: v1
kind: Pod
metadata:
  name: xxx
spec:
  containers:
  - name: xxx
    image: xxx
    env:
    - name: TZ     #时区设置的key
      value: Asia/Shanghai #时区设置的value

三,通过修改pod的配置文件中的时区与宿主机一致

思想:让pod使用宿主机的时区文件

时区的配置存储在两个文件中:/etc/timezone 和 /etc/localtime ,分别介绍一下这两个文件,如果不想关心这两个文件存的是啥,不想知道为什么要这么修改,直接看③就行

① /etc/timezone 是个文本文件,内容如下:

就是记录了使用哪个时区

②/etc/localtime并不是一个文件,而是一个软连接:

/etc/localtime所链接的这个文件是个什么文件呢?

由于系统中所有的时区文件都存储在/usr/share/zoneinfo下,其中中国的时区位于Asia目录下的Shanghai 文件中,如下图:

所以配置系统的时区,就是配置/etc/localtime这个软连接所指向的时区文件;

要修改pod的时区,就要修改/etc/timezone 和 /etc/localtime;

③ 修改pod的时区

有两种方式都可以修改pod的时区:

一是在通过Dockerfile制作镜像时,通过RUN 命令运行shell命令来修改:

FROM centos
      
RUN rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
      
# 构建容器镜像
$ docker build -t centos7-date:test -f Dockerfile.date .
      
$ docker run -it centos7-date:test /bin/sh
sh-4.2# date
Wed Mar  6 17:40:01 CST 2019

即执行如下3个命令:

rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

&& echo "Asia/Shanghai" > /etc/timezone

注意RUN后面的脚本是在容器内部执行的,所有它修改的是容器中的文件,

第一条命令:先删除原有的软连接/etc/localtime;

第二条命令:重新建立新的软连接/etc/localtime,让其指向 /usr/share/zoneinfo/Asia/Shanghai

第三条命令:将 /etc/timezone的内容修改为Asia/Shanghai

这种方式仅适用于自己制作的镜像,但是有时候我们是使用别人制作好的镜像,所以有局限性;

二是将宿主机的两个时区文件映射到容器中(这种我没有实际验证过)

apiVersion: v1
kind: Pod
metadata:
  name: time
spec:
  containers:
  - name: time
    image: nginx
    volumeMounts:
      - name: localtime
        mountPath: /etc/localtime
      - name: timezone
        mountPath: /etc/timezone
  volumes:
    - name: localtime
      hostPath:
        path: /usr/share/zoneinfo/Asia/Shanghai
    - name: timezone
      hostPath:
        path: /etc/timezone

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要连接到运行在Pod所在的宿主机上,可以使用`kubectl`工具的`exec`命令结合`nsenter`命令。具体步骤如下: 1. 首先,使用以下命令获取Pod的名称和所在的Node节点名称: ``` kubectl get pod <pod-name> -o wide ``` 其中,`<pod-name>`是要连接的Pod的名称。 2. 然后,使用以下命令在Node节点上启动一个临时的容器,并通过`nsenter`命令进入到该容器中: ``` kubectl run -it --rm debug --image=busybox --restart=Never --overrides='{ "spec": { "nodeName": "<node-name>" } }' -- nsenter -t 1 -m -u -n -i sh ``` 其中,`<node-name>`是第1步中获取到的Node节点名称。 此命令将在Node节点上启动一个名为`debug`的容器,并在其中运行`nsenter`命令。`nsenter`命令将进入到宿主机的命名空间中,使你能够访问宿主机的文件系统和进程等。 3. 最后,使用以下命令进入到Pod所在的网络命名空间中: ``` chroot /host nsenter -t $(docker inspect --format '{{.State.Pid}}' <pod-name>) -n sh ``` 其中,`<pod-name>`是要连接的Pod的名称。 此命令将在宿主机的命名空间中启动一个新的`nsenter`命令,并进入到Pod所在的网络命名空间中。在该命名空间中,你可以访问Pod的网络接口和相关的进程等。 注意:执行该操作需要具备足够的权限,并且可能会对Pod宿主机的正常运行产生影响,因此在执行前请仔细考虑。如果没有足够的经验和知识,请勿轻易尝试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值