OpenShift 4 - 设置集群节点和Pod容器的时间和时区

1 篇文章 0 订阅
1 篇文章 0 订阅

OpenShift 4.x HOL教程汇总
说明:本文已经在OpenShift 4.6环境中验证

OpenShift的时间和时区

在OpenShift集群中,节点的系统服务和容器中的应用在使用时间的时候分别会用到节点的系统时间时区和Container的时间和时区,本文说明节点和容器内时间和时区的特性。

节点和容器的时间

在OpenShift集群中节点是通过时间服务器同步时间的。如何OpenShift集群可以连接外网,可以使用外部时间服务同步时间。如果无法访问外网,则需要自己在内网搭建时间服务,OpenShift 4目前只支持Chrony作为时间服务器。运行在节点中的系统级服务以及运行在节点CRI-O中的Pod和Container都使用该节点的系统时间。基于的Chrony的时间同步可以在安装OpenShift集群的时候设置,也可以在安装集群后通过MachineConfigOperator设置。
在这里插入图片描述

节点和容器的时区

在OpenShift集群中所有节点的缺省时区会使用“UTC”(Universal Time Coordinated - 协调世界时或世界统一时间)作为时区。而节点中运行的所有Pod及其容器缺省也都使用UTC作为时区。如果使用UTC时区,其时间和中国标准时间相差8小时,即中国的时间为UTC+8。
在这里插入图片描述
如上图示例,OpenShift集群节点在和时间服务器同步时间的时候是不会同步时区的,而只会将各自节点的时间换算成UTC时间然后再进行同步。所以即便Chrony时间服务器的时区设为例如“Asia/Shanghai”,OpenShift集群节点在同步的时候缺省也会使用“UTC”时区。同样所有运行在Pod中的Container在运行的时候缺省使用的也是UTA时间。如果需要修改OpenShift节点和Container的时区,可以通过本文以下方式手动修改。

节点时间同步

要同步OpenShift集群节点的时间,需要使用MachineConfigOperator运行对应的MachineConfig配置。我们可以在安装OpenShift集群的时候设置使用的Chrony服务,也可在安装完OpenShift集群后设置,但无论何时配置OpenShift用到的Chrony,都需要先准备MachineConfigOperator用到的MachineConfig配置文件,只不过在安装OpenShift集群阶段安装过程会自动运行MachineConfig配置文件;而在完成OpenShift集群安装后再配置Chrony,需要手动通过MachineConfigOperator运行MachineConfig配置文件。

准备MachineConfig配置文件

  1. 设置Chrony时间服务的访问域名。
$ CHRONY_HOST=chrony.example.internal
  1. 生成Chrony同步配置文件
$ cat << EOF >> chroney.conf 
server ${CHRONY_HOST} iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
EOF
  1. 运行以下命令,对配置文件进行base64编码,然后查看生成的字符创。
$ CHRONEY_BASE64=$(base64 -w 0 chroney.conf)
$ echo $CHRONEY_BASE64
c2VydmVyIG5mcy5leGFtcGxlLmludGVybmFsIGlidXJzdApkcmlmdGZpbGUgL3Zhci9saWIvY2hyb255L2RyaWZ0Cm1ha2VzdGVwIDEuMCAzCnJ0Y3N5bmMKbG9nZGlyIC92YXIvbG
  1. 执行命令,创建master节点的Chrony配置文件99_masters-chrony-configuration.yaml
$ cat << EOF > ./99_masters-chrony-configuration.yaml
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: master
  name: masters-chrony-configuration
spec:
  config:
    ignition:
      config: {}
      security:
        tls: {}
      timeouts: {}
      version: 3.1.0
    networkd: {}
    passwd: {}
    storage:
      files:
      - contents:
          source: data:text/plain;charset=utf-8;base64,${CHRONEY_BASE64}
        mode: 420
        overwrite: true
        path: /etc/chrony.conf
  osImageURL: ""
EOF
  1. 执行命令,创建master节点的Chrony配置文件99_workers-chrony-configuration.yaml
$ cat << EOF > ./99_workers-chrony-configuration.yaml
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: worker
  name: workers-chrony-configuration
spec:
  config:
    ignition:
      config: {}
      security:
        tls: {}
      timeouts: {}
      version: 3.1.0
    networkd: {}
    passwd: {}
    storage:
      files:
      - contents:
          source: data:text/plain;charset=utf-8;base64,${CHRONEY_BASE64}
        mode: 420
        overwrite: true
        path: /etc/chrony.conf
  osImageURL: ""
EOF

在安装OpenShift集群过程中同步节点时间

在OpenShift的BareMetal的安装过程中可以在创建manifests目录和相关文件后,将上一节生成的“masters-chrony-configuration.yaml”和“99_workers-chrony-configuration.yaml”覆盖由以下“openshift-install create manifests 。。。”命令生成的缺省文件。

$ openshift-install create manifests --dir ${IGN_PATH}
$ tree ${IGN_PATH}/openshift/
openshift/
├── 99_kubeadmin-password-secret.yaml
├── 99_openshift-cluster-api_master-user-data-secret.yaml
├── 99_openshift-cluster-api_worker-user-data-secret.yaml
├── 99_openshift-machineconfig_99-master-ssh.yaml
├── 99_openshift-machineconfig_99-worker-ssh.yaml
└── openshift-install-manifests.yaml

在安装OpenShift集群过程后同步节点时间

  1. 执行命令,向OpenShift提交修改节点配置的MachineConfig。
$ oc apply -f 99_masters-chrony-configuration.yaml
$ oc apply -f 99_workers-chrony-configuration.yaml
  1. 查看节点更新情况,下面可以看到正在逐个更新j集群中的2个worker节点的配置。
$ oc get nodes -l node-role.kubernetes.io/worker -w
NAME                                              STATUS                     ROLES    AGE   VERSION
ip-10-0-155-228.ap-southeast-1.compute.internal   Ready                      worker   8d    v1.19.0+d59ce34
ip-10-0-190-239.ap-southeast-1.compute.internal   Ready,SchedulingDisabled   worker   8d    v1.19.0+d59ce34
ip-10-0-190-239.ap-southeast-1.compute.internal   Ready,SchedulingDisabled   worker   8d    v1.19.0+d59ce34
ip-10-0-190-239.ap-southeast-1.compute.internal   Ready,SchedulingDisabled   worker   8d    v1.19.0+d59ce34
ip-10-0-190-239.ap-southeast-1.compute.internal   Ready                      worker   8d    v1.19.0+d59ce34
ip-10-0-190-239.ap-southeast-1.compute.internal   Ready                      worker   8d    v1.19.0+d59ce34
ip-10-0-190-239.ap-southeast-1.compute.internal   Ready                      worker   8d    v1.19.0+d59ce34
ip-10-0-155-228.ap-southeast-1.compute.internal   Ready                      worker   8d    v1.19.0+d59ce34
ip-10-0-155-228.ap-southeast-1.compute.internal   Ready,SchedulingDisabled   worker   8d    v1.19.0+d59ce34
ip-10-0-155-228.ap-southeast-1.compute.internal   Ready,SchedulingDisabled   worker   8d    v1.19.0+d59ce34
ip-10-0-155-228.ap-southeast-1.compute.internal   Ready,SchedulingDisabled   worker   8d    v1.19.0+d59ce34
ip-10-0-155-228.ap-southeast-1.compute.internal   Ready                      worker   8d    v1.19.0+d59ce34
ip-10-0-155-228.ap-southeast-1.compute.internal   Ready                      worker   8d    v1.19.0+d59ce34
  1. Node除了可自动同步外,还可执行以下操作进行手动时间同步
$ oc debug node/<WORKER_NODE>
sh-4.4# chroot /host
sh-4.4# chronyc -4 -n sources
210 Number of sources = 3
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ 202.73.57.106                 2   7   377    17  +4126us[+4126us] +/-   85ms

设置时区

由于OpenShift的节点和容器缺省使用的都是UTC时区,如果要使用其它时区,需要手动设置时区属性。

设置集群节点时区

可以用以下三种方法登录登录到OpenShift节点的CoreOS操作系统中,修改系统级的时区属性。

  • 通过命令行,使用debug进入node节点,然后切换到root。
$ oc debug node <NODE-NAME> 
# chroot /host
  • 在OpenShift 4.5以上版本,可使用Console进入node节点,然后切换到root。
    在这里插入图片描述
  • 用安装过程中的证书进入node节点。
$ ssh -i <ID_FILE> core@<OPENSHIFT_NODE_HOST_NAME>

登录后使用以下命令查看当前时区、列出可用时区,然后设置系统的时区。

# ls -l /etc/localtime
# timedatectl
               Local time: Sun 2020-12-30 07:32:24 UTC
           Universal time: Sun 2020-12-30 07:32:24 UTC
                 RTC time: Sun 2020-12-30 07:32:23
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
          
# timedatectl list-timezones
# sudo timedatectl set-timezone Asia/Shanghai
# timedatectl
               Local time: Sun 2020-12-30 15:35:15 CST
           Universal time: Sun 2020-12-30 07:35:15 UTC
                 RTC time: Sun 2020-12-30 07:35:15
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

可以看到当设置完系统时区后,显示的系统时间数值会变化,但是考虑到时区的不同,因此其绝对时间不会变化。
当系统时区变化后,所有用到系统时间的日志将使用新的时间+时区记录日志数据。

设置容器时区

在Container运行的时候缺省使用的也是以UTC为基准的时间+时区的体系。如果我们希望用本地时间+时区的体系,可用以下不同的方式告诉运行容器。

  • 在Dockerfile中设置时区环境。
FROM postgres:10
ENV TZ="Asia/Shanghai"
RUN date
  • 运行容器的时候,通过环境变量指定容器使用的时区
docker run <IMAGE:TAG> -e TZ=Asia/Shanghai 
  • 运行容器的时候将系统时区目录映射到容器的时区目录上。
$ docker run -v /etc/localtime:/etc/localtime <IMAGE:TAG>
  • 在OpenShift的DeploymentConfig中设置时区
$ oc set env dc/<DC_NAME> Asia/Shanghai

参考

https://access.redhat.com/solutions/2567961
https://access.redhat.com/solutions/4906341
https://access.redhat.com/solutions/3635441
https://github.com/coreos/ignition/blob/spec2x/doc/configuration-v2_0.md
https://jaosorior.dev/2019/modifying-node-configurations-in-openshift-4.x/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值