はじめに
OpenShift4.x以降で採用しているRed Hat Enterprise Linux CoreOS(RHCOS)はこちらに記載のあるように、OpenShift Container Platform ノードへの直接の変更は推奨されません
。RHCOSはMachineConfigで管理されているため、設定変更を行う場合はMachineConfigで設定変更を行う必要があり、Red Hat社のマニュアルにはDay-2運用としてChronyの設定変更の例が記載されています。
本記事ではこちらの設定変更を実際に検証してみた記録を記載します。
環境
OCPバージョン:4.3.19
ノード構成:Master x3台、Worker x3台(ESXi上にベアメタルインストール方式で構成)
※すべてのノードをRHCOSで構成
やってみた
設定変更前の状態
RHCOSのデフォルト状態ではChronydサービスは起動しており、chrony.confも設定されています。
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.rhel.pool.ntp.org iburst
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Enable hardware timestamping on all interfaces that support it.
# hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
# minsources 2
# Allow NTP client access from local network.
# allow 192.168.0.0/16
# Serve time even if not synchronized to a time source.
# local stratum 10
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
# log measurements statistic
事前準備
設定変更のためにはMachineConfigのマニフェストを作成します。
マニフェストファイル内にはChrony.confファイルコンテンツをbase64でエンコードしたものを記載する必要があり、事前にChrony.confファイルの中身をエンコードします。
今回は下記2点を追加で設定します。
・NTPサーバー:server 10.0.80.11
・slew設定:leapsecmode slew
エンコードするファイルを事前に作成しておきます。今回は下記catコマンドでエンコードを実行しました。マニュアルでは設定に必要な部分のみ抜粋して書かれていますが、今回は折角なのでデフォルトのconfファイルに追記する形で設定してみます。
$ cat << EOF | base64
> # Use public servers from the pool.ntp.org project.
> # Please consider joining the pool (http://www.pool.ntp.org/join.html).
> server 10.0.80.11
> pool 2.rhel.pool.ntp.org iburst
>
> # Record the rate at which the system clock gains/losses time.
> driftfile /var/lib/chrony/drift
>
> # Allow the system clock to be stepped in the first three updates
> # if its offset is larger than 1 second.
> makestep 1.0 3
>
> # Enable kernel synchronization of the real-time clock (RTC).
> rtcsync
>
> # Enable hardware timestamping on all interfaces that support it.
> #hwtimestamp *
>
> # Increase the minimum number of selectable sources required to adjust
> # the system clock.
> #minsources 2
>
> # Allow NTP client access from local network.
> #allow 192.168.0.0/16
>
> # Serve time even if not synchronized to a time source.
> #local stratum 10
>
> # Specify file containing keys for NTP authentication.
> keyfile /etc/chrony.keys
>
> # Get TAI-UTC offset and leap seconds from the system tz database.
> leapsectz right/UTC
>
> # Specify directory for log files.
> logdir /var/log/chrony
>
> # Select which information is logged.
> #log measurements statistic
> leapsecmode slew
> EOF
IyBVc2UgcHVibGljIHNlcnZlcnMgZnJvbSB0aGUgcG9vbC5udHAub3JnIHByb2plY3QuCiMgUGxl
YXNlIGNvbnNpZGVyIGpvaW5pbmcgdGhlIHBvb2wgKGh0dHA6Ly93d3cucG9vbC5udHAub3JnL2pv
aW4uaHRtbCkuCnNlcnZlciAxMC4wLjgwLjExCnBvb2wgMi5yaGVsLnBvb2wubnRwLm9yZyBpYnVy
c3QKCiMgUmVjb3JkIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBzeXN0ZW0gY2xvY2sgZ2FpbnMvbG9z
c2VzIHRpbWUuCmRyaWZ0ZmlsZSAvdmFyL2xpYi9jaHJvbnkvZHJpZnQKCiMgQWxsb3cgdGhlIHN5
c3RlbSBjbG9jayB0byBiZSBzdGVwcGVkIGluIHRoZSBmaXJzdCB0aHJlZSB1cGRhdGVzCiMgaWYg
aXRzIG9mZnNldCBpcyBsYXJnZXIgdGhhbiAxIHNlY29uZC4KbWFrZXN0ZXAgMS4wIDMKCiMgRW5h
YmxlIGtlcm5lbCBzeW5jaHJvbml6YXRpb24gb2YgdGhlIHJlYWwtdGltZSBjbG9jayAoUlRDKS4K
cnRjc3luYwoKIyBFbmFibGUgaGFyZHdhcmUgdGltZXN0YW1waW5nIG9uIGFsbCBpbnRlcmZhY2Vz
IHRoYXQgc3VwcG9ydCBpdC4KI2h3dGltZXN0YW1wICoKCiMgSW5jcmVhc2UgdGhlIG1pbmltdW0g
bnVtYmVyIG9mIHNlbGVjdGFibGUgc291cmNlcyByZXF1aXJlZCB0byBhZGp1c3QKIyB0aGUgc3lz
dGVtIGNsb2NrLgojbWluc291cmNlcyAyCgojIEFsbG93IE5UUCBjbGllbnQgYWNjZXNzIGZyb20g
bG9jYWwgbmV0d29yay4KI2FsbG93IDE5Mi4xNjguMC4wLzE2CgojIFNlcnZlIHRpbWUgZXZlbiBp
ZiBub3Qgc3luY2hyb25pemVkIHRvIGEgdGltZSBzb3VyY2UuCiNsb2NhbCBzdHJhdHVtIDEwCgoj
IFNwZWNpZnkgZmlsZSBjb250YWluaW5nIGtleXMgZm9yIE5UUCBhdXRoZW50aWNhdGlvbi4Ka2V5
ZmlsZSAvZXRjL2Nocm9ueS5rZXlzCgojIEdldCBUQUktVVRDIG9mZnNldCBhbmQgbGVhcCBzZWNv
bmRzIGZyb20gdGhlIHN5c3RlbSB0eiBkYXRhYmFzZS4KbGVhcHNlY3R6IHJpZ2h0L1VUQwoKIyBT
cGVjaWZ5IGRpcmVjdG9yeSBmb3IgbG9nIGZpbGVzLgpsb2dkaXIgL3Zhci9sb2cvY2hyb255Cgoj
IFNlbGVjdCB3aGljaCBpbmZvcm1hdGlvbiBpcyBsb2dnZWQuCiNsb2cgbWVhc3VyZW1lbnRzIHN0
YXRpc3RpYwpsZWFwc2VjbW9kZSBzbGV3Cg==
[core@worker01 ~]$
エンコードされた文字列をマニフェストファイルのsource
部分に記載します。(改行部分は手動で改行を削除しています。)マニフェストファイルはマニュアルに記載されたものを使用しました。
[user01@bastion yaml]$ cat 99_worker-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: 2.2.0
networkd: {}
passwd: {}
storage:
files:
- contents:
source: data:text/plain;charset=utf-8;base64,IyBVc2UgcHVibGljIHNlcnZlcnMgZnJvbSB0aGUgcG9vbC5udHAub3JnIHByb2plY3QuCiMgUGxlYXNlIGNvbnNpZGVyIGpvaW5pbmcgdGhlIHBvb2wgKGh0dHA6Ly93d3cucG9vbC5udHAub3JnL2pvaW4uaHRtbCkuCnNlcnZlciAxMC4wLjgwLjExCnBvb2wgMi5yaGVsLnBvb2wubnRwLm9yZyBpYnVyc3QKCiMgUmVjb3JkIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBzeXN0ZW0gY2xvY2sgZ2FpbnMvbG9zc2VzIHRpbWUuCmRyaWZ0ZmlsZSAvdmFyL2xpYi9jaHJvbnkvZHJpZnQKCiMgQWxsb3cgdGhlIHN5c3RlbSBjbG9jayB0byBiZSBzdGVwcGVkIGluIHRoZSBmaXJzdCB0aHJlZSB1cGRhdGVzCiMgaWYgaXRzIG9mZnNldCBpcyBsYXJnZXIgdGhhbiAxIHNlY29uZC4KbWFrZXN0ZXAgMS4wIDMKCiMgRW5hYmxlIGtlcm5lbCBzeW5jaHJvbml6YXRpb24gb2YgdGhlIHJlYWwtdGltZSBjbG9jayAoUlRDKS4KcnRjc3luYwoKIyBFbmFibGUgaGFyZHdhcmUgdGltZXN0YW1waW5nIG9uIGFsbCBpbnRlcmZhY2VzIHRoYXQgc3VwcG9ydCBpdC4KI2h3dGltZXN0YW1wICoKCiMgSW5jcmVhc2UgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHNlbGVjdGFibGUgc291cmNlcyByZXF1aXJlZCB0byBhZGp1c3QKIyB0aGUgc3lzdGVtIGNsb2NrLgojbWluc291cmNlcyAyCgojIEFsbG93IE5UUCBjbGllbnQgYWNjZXNzIGZyb20gbG9jYWwgbmV0d29yay4KI2FsbG93IDE5Mi4xNjguMC4wLzE2CgojIFNlcnZlIHRpbWUgZXZlbiBpZiBub3Qgc3luY2hyb25pemVkIHRvIGEgdGltZSBzb3VyY2UuCiNsb2NhbCBzdHJhdHVtIDEwCgojIFNwZWNpZnkgZmlsZSBjb250YWluaW5nIGtleXMgZm9yIE5UUCBhdXRoZW50aWNhdGlvbi4Ka2V5ZmlsZSAvZXRjL2Nocm9ueS5rZXlzCgojIEdldCBUQUktVVRDIG9mZnNldCBhbmQgbGVhcCBzZWNvbmRzIGZyb20gdGhlIHN5c3RlbSB0eiBkYXRhYmFzZS4KbGVhcHNlY3R6IHJpZ2h0L1VUQwoKIyBTcGVjaWZ5IGRpcmVjdG9yeSBmb3IgbG9nIGZpbGVzLgpsb2dkaXIgL3Zhci9sb2cvY2hyb255CgojIFNlbGVjdCB3aGljaCBpbmZvcm1hdGlvbiBpcyBsb2dnZWQuCiNsb2cgbWVhc3VyZW1lbnRzIHN0YXRpc3RpYwpsZWFwc2VjbW9kZSBzbGV3Cg==
verification: {}
filesystem: root
mode: 420
path: /etc/chrony.conf
osImageURL: ""
[user01@bastion yaml]$
補足:今回の設定変更対象はWorkerノードとするため、labelsをmachineconfiguration.openshift.io/role: worker
としています。
設定変更実行
設定変更はoc applyを実行するだけです。
[user01@bastion yaml]$ oc apply -f 99_worker-chrony-configuration.yaml
machineconfig.machineconfiguration.openshift.io/masters-chrony-configuration configured
すると、workers-chrony-configuration
のMachineConfigが作成されます。また、変更対象となるすべてのWorkerノードが順に再起動され、設定が反映されます。(単なる設定変更が実施されるのではなく、再起動なのですね、、
[user01@bastion yaml]$ oc get machineconfig
NAME GENERATEDBYCONTROLLER IGNITIONVERSION CREATED
00-master 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
00-worker 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
01-master-container-runtime 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
01-master-kubelet 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
01-worker-container-runtime 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
01-worker-kubelet 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
99-master-b62d53f3-f01b-45db-bf9c-f2228f1cdc65-registries 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
99-master-ssh 2.2.0 101d
99-worker-c96a560d-6953-4d70-a321-8d43cae3a8bc-registries 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
99-worker-ssh 2.2.0 101d
workers-chrony-configuration 2.2.0 26m
rendered-master-902818e7360d666fc9a140101b0a6228 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 94m
rendered-master-fd0702da4866293bf21172d5ba14c529 5c8eeddacb4c95bbd7f95f89821208d9a1f82a2f 2.2.0 101d
rendered-worker-0f807566dcebf01f1169cad15d3cf85a 5c8eeddacb4c95bbd7f95f89821208d9a1f82a2f 2.2.0 101d
rendered-worker-136c8880147989c2456a580e19202e99 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 6m9s
rendered-worker-591e8da73a09c481fc269d0c0e6761f3 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 26m
rendered-worker-6ceb0f184f744f41ecbfc3131a0b2e29 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 94m
[user01@bastion yaml]$
[user01@bastion yaml]$ oc get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready master 101d v1.16.2
master02 Ready master 101d v1.16.2
master03 Ready master 101d v1.16.2
worker01 Ready,SchedulingDisabled worker 101d v1.16.2
worker02 Ready worker 101d v1.16.2
worker03 Ready worker 82d v1.16.2
[user01@bastion yaml]$
反映確認
再起動後、workerノードの設定を確認すると、設定が反映され、Chronydも起動していることを確認できました。
[core@worker01 ~]$ systemctl status chronyd.service
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-06-17 13:27:59 UTC; 2min 20s ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Process: 1343 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
Process: 1326 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 1334 (chronyd)
Tasks: 1
Memory: 2.7M
CPU: 29ms
CGroup: /system.slice/chronyd.service
└─1334 /usr/sbin/chronyd
Jun 17 13:27:59 localhost systemd[1]: Starting NTP client/server...
Jun 17 13:27:59 localhost chronyd[1334]: chronyd version 3.5 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +SECHASH +IPV6 +DEBUG)
Jun 17 13:27:59 localhost chronyd[1334]: Frequency 0.000 +/- 1000000.000 ppm read from /var/lib/chrony/drift
Jun 17 13:27:59 localhost chronyd[1334]: Using right/UTC timezone to obtain leap second data
Jun 17 13:27:59 localhost systemd[1]: Started NTP client/server.
[core@worker01 ~]$
[core@worker01 ~]$
[core@worker01 ~]$ cat /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 10.0.80.11
pool 2.rhel.pool.ntp.org iburst
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Enable hardware timestamping on all interfaces that support it.
# hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
# minsources 2
# Allow NTP client access from local network.
# allow 192.168.0.0/16
# Serve time even if not synchronized to a time source.
# local stratum 10
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
# log measurements statistic
leapsecmode slew
[core@worker01 ~]$
これで、Chrony.confの設定変更は完了。
考察
(せっかくなので、もう少し実験を)
上記の設定変更の挙動から、MachineConfigのマニフェストによる設定変更は、対象ファイルを下記条件で作成するものと思われます。
- ファイルがある場合:マニフェストの設定によるファイルに置き換えられる
- ファイルがない場合:ファイルが新規作成される
試してみた
既存ファイルが有る場合はChrony.confの例で確認できたので、ファイルがない場合の挙動を確認するため、/tmpにhelloocp.txt
ファイルを作ることができるかを確認してみました。
- 設定前の状態
[core@worker01 ~]$ ls -l /tmp/
total 0
drwxrwxrwt. 12 root root 4096 Jun 17 14:16 .
drwxr-xr-x. 12 root root 253 Jun 17 12:02 ..
drwx------. 3 root root 17 Jun 17 13:48 systemd-private-d57205d43a1c4f5eab3203207234df41-chronyd.service-LMUaXG
drwx------. 2 root root 6 Jun 17 13:40 vmware-root_1300-2999591912
drwx------. 2 root root 6 Jun 17 13:48 vmware-root_1315-4282367513
drwx------. 2 root root 6 Jun 17 13:07 vmware-root_1324-2999460814
drwx------. 2 root root 6 Jun 17 12:03 vmware-root_1335-4256479628
[core@worker01 ~]$
helloocp.txt(内部にHello OCP MachineConfig
と記載)ファイルを作成するマニフェストを作成します。
[user01@bastion yaml]$ cat << EOF | base64
> Hello OCP MachineConfig
> EOF
SGVsbG8gT0NQIE1hY2hpbmVDb25maWcK
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: worker
name: workers-tmp-configuration
spec:
config:
ignition:
config: {}
security:
tls: {}
timeouts: {}
version: 2.2.0
networkd: {}
passwd: {}
storage:
files:
- contents:
source: data:text/plain;charset=utf-8;base64,SGVsbG8gT0NQIE1hY2hpbmVDb25maWcK
verification: {}
filesystem: root
mode: 420
path: /tmp/helloocp.txt
osImageURL: ""
設定反映
[user01@bastion yaml]$ oc apply -f 99_worker-tmp-configuration.yaml
machineconfig.machineconfiguration.openshift.io/workers-tmp-configuration created
[user01@bastion yaml]$
[user01@bastion yaml]$ oc get machineconfig
NAME GENERATEDBYCONTROLLER IGNITIONVERSION CREATED
00-master 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
00-worker 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
01-master-container-runtime 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
01-master-kubelet 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
01-worker-container-runtime 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
01-worker-kubelet 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
99-master-b62d53f3-f01b-45db-bf9c-f2228f1cdc65-registries 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
99-master-ssh 2.2.0 101d
99-worker-c96a560d-6953-4d70-a321-8d43cae3a8bc-registries 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 101d
99-worker-ssh 2.2.0 101d
rendered-master-902818e7360d666fc9a140101b0a6228 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 138m
rendered-master-fd0702da4866293bf21172d5ba14c529 5c8eeddacb4c95bbd7f95f89821208d9a1f82a2f 2.2.0 101d
rendered-worker-0f807566dcebf01f1169cad15d3cf85a 5c8eeddacb4c95bbd7f95f89821208d9a1f82a2f 2.2.0 101d
rendered-worker-136c8880147989c2456a580e19202e99 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 50m
rendered-worker-1a3ebb2b3ff0a34fe81542045c565f8b 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 38m
rendered-worker-591e8da73a09c481fc269d0c0e6761f3 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 71m
rendered-worker-6ceb0f184f744f41ecbfc3131a0b2e29 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 138m
rendered-worker-d60f6cddd83acd025ace5d197eed703c 860382c905f4358418c6513a9ab55fdd6dcc4f2d 2.2.0 3s
workers-chrony-configuration 2.2.0 38m
workers-tmp-configuration 2.2.0 7s
[user01@bastion yaml]$
- 設定反映後
[core@worker01 ~]$ ls -l /tmp/
total 0
drwxrwxrwt. 13 root root 4096 Jun 17 14:19 .
drwxr-xr-x. 12 root root 253 Jun 17 12:02 ..
-rw-r--r--. 1 root root 24 Jun 17 14:18 helloocp.txt
drwx------. 3 root root 17 Jun 17 14:19 systemd-private-7818b026582947e8bba2e848a1addab1-chronyd.service-D2P0GM
drwx------. 2 root root 6 Jun 17 13:40 vmware-root_1300-2999591912
drwx------. 2 root root 6 Jun 17 13:48 vmware-root_1315-4282367513
drwx------. 2 root root 6 Jun 17 14:19 vmware-root_1316-2966037952
drwx------. 2 root root 6 Jun 17 13:07 vmware-root_1324-2999460814
drwx------. 2 root root 6 Jun 17 12:03 vmware-root_1335-4256479628
[core@worker01 ~]$ cat /tmp/helloocp.txt
Hello OCP MachineConfig
→ /tmp/hellopcp.txt
ファイルが作成されていることを確認!
まとめ
- MachineConfig設定によりRHCOSの設定変更ができることを確認しました。
- Masterノード用、Workerノード用の設定が別れており、それぞれ
oc apply
で設定反映すると、ノードが順次再起動され、設定が反映されていくようです。 - 既存のファイルがある場合(Chrony.confの場合はこちら)はファイルが置き換えられ、既存ファイルがない場合は新規作成されます。
さいごに
RHCOSの設定変更ができるかを聞かれることが多いですが、マニュアルに記載された方法によりChronyの設定変更ができることは確認できました。他の設定項目が変更可能かはサポートに要確認かと思いますが、今回の検証結果から、ファイルで設定しているものについてはできそうな気がします。
実際に試される場合は、サポート含め確認の上検証ください。