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

文章目录

  • OpenShift的时间和时区
    • 节点和容器的时间
    • 节点和容器的时区
  • 节点时间同步
    • 准备MachineConfig配置文件
    • 在安装OpenShift集群过程中同步节点时间
    • 在安装OpenShift集群过程后同步节点时间
  • 设置时区
    • 设置集群节点时区
    • 设置容器时区
  • 参考

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: mastername: masters-chrony-configuration
spec:config:ignition:config: {}security:tls: {}timeouts: {}version: 3.1.0networkd: {}passwd: {}storage:files:- contents:source: data:text/plain;charset=utf-8;base64,${CHRONEY_BASE64}mode: 420overwrite: truepath: /etc/chrony.confosImageURL: ""
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: workername: workers-chrony-configuration
spec:config:ignition:config: {}security:tls: {}timeouts: {}version: 3.1.0networkd: {}passwd: {}storage:files:- contents:source: data:text/plain;charset=utf-8;base64,${CHRONEY_BASE64}mode: 420overwrite: truepath: /etc/chrony.confosImageURL: ""
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
# timedatectlLocal time: Sun 2020-12-30 07:32:24 UTCUniversal time: Sun 2020-12-30 07:32:24 UTCRTC time: Sun 2020-12-30 07:32:23Time zone: UTC (UTC, +0000)
System clock synchronized: yesNTP service: activeRTC in local TZ: no# timedatectl list-timezones
# sudo timedatectl set-timezone Asia/Shanghai
# timedatectlLocal time: Sun 2020-12-30 15:35:15 CSTUniversal time: Sun 2020-12-30 07:35:15 UTCRTC time: Sun 2020-12-30 07:35:15Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yesNTP service: activeRTC 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/

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

  1. OpenShift 4 - 在集群节点用crictl对Pod/Image/Container进行操作

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 查看crictl命令的配置文件 用crictl命令操作Pod/Image/C ...

  2. OpenShift 4 - 用KubeletConfig和ContainerRuntimeConfig分别修改集群节点的Kubelet和cri-o的配置

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 Kubelet.KubeletConfig和KubeletConfigCon ...

  3. OpenShift 4 - 利用 File Integrity Operator 实现对集群节点进行入侵检测

    <OpenShift / RHEL / DevSecOps 汇总目录> 说明:本文已经在OpenShift 4.9环境中验证 文章目录 File Integrity Operator 功能 ...

  4. OpenShift 4 - 集群节点日志和API审计日志策略

    <OpenShift / RHEL / DevSecOps 汇总目录> 说明:本文已经在OpenShift 4.8 环境中验证 文章目录 集群节点日志 集群节点日志类型 收集集群节点日志 ...

  5. 读懂这一篇,集群节点不下线

    作者 | 声东  阿里云售后技术专家 导读:排查完全陌生的问题.完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战.今天借这篇文章,跟大家分析一例这样的问题.排查过程中,需要理解一些自己完 ...

  6. Kubernetes从懵圈到熟练:读懂这一篇,集群节点不下线

    排查完全陌生的问题,完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战.今天借这篇文章,跟大家分析一例这样的问题.排查过程中,需要理解一些自己完全陌生的组件,比如systemd和dbus. ...

  7. 如何优雅地关闭Kubernetes集群中的Pod

    原文标题:Gracefully Shutting Down Pods in a Kubernetes Cluster 发布时间:Jan 26, 2019 原文链接:https://blog.grunt ...

  8. 安装calico网络插件后K8s集群节点间通信找不到主机路由(no route to host)

    安装calico网络插件后K8s集群节点间通信找不到主机路由(no route to host) 背景:k8s安装calico网络插件后master节点ping不通其它node节点,但可以ping通外 ...

  9. 3、kubeadm部署Kubernetes 网络插件flannel、Calico、weave 并设置集群角色

    Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展. Kubernetes不仅支持Docker,还支持Rocket,这是另一种容器技术. 使用Kubern ...

最新文章

  1. 教你如何防范远程桌面协议(RDP)的安全威胁
  2. 【错误记录】Android Studio 编译报错 ( cannot open this project, please retry with version 4.2 or newer. )
  3. 【深度学习】重新思考BatchNorm中的 “Batch”
  4. Windows 10怎么了?
  5. iOS-如何返回某个字符串的拼音助记码
  6. 『电子书』分享一波码农必备编程开发类书籍[转]
  7. 工作线程AfxBeginThread的使用
  8. android主题资源,使用 Theme Editor 设计应用主题背景
  9. RADIUS实验(802.1x)
  10. 页面调用微信扫一扫功能
  11. 桌面无计算机 win10,win10雨木林风系统桌面无计算机图片的处理办法
  12. Spark SQL 快速入门系列(六)Spark SQL 访问 JDBC
  13. 代码报错 Uncaught TypeError: Converting circular structure to JSON
  14. Java问题——can not be represented as java.sql.Date 错误解决
  15. 电影《当幸福来敲门》英语台词
  16. 激光多普勒振动测量技术简述
  17. 她二本科毕业,拿到阿里年薪40万offer!经验都记录在这几个公众号日记中
  18. Candy Crush Soda 赏析
  19. 机房如何防止雷电攻击?手把手教你
  20. 一份超级实用的勒索病毒自救指南

热门文章

  1. android studio 多个项目管理,Android Studio之同一应用创建多个Activity(一)
  2. wxpython textctrl_如何从wxpython中的textctrl接受值
  3. 年底圣诞促销,商家必备节日大促psd分层海报模板
  4. 音乐社交娱乐教育APP Makeapp Wireframe Kit
  5. UI素材模板|app ui界面的导航设计都有哪些?
  6. 刚入门的UI设计师,需要懂的图标设计规范?
  7. websocket python unity_Unity中Websocket的简单使用
  8. 一只青蛙跳向三个台阶_青蛙跳台阶问题的三种解法
  9. python所有变量更新_python更新全局变量
  10. Python GUI 截图小工具 实例Demo