既存RHEL 7サーバをRHEL 8で再セットアップ

Red HatでOpenShiftのサポートをしているid:nekopです。RHEL 8がリリースされたので、いろいろな用途に使っている自分用のお仕事RHEL 7サーバVMをRHEL 8ベースへとお引っ越ししました。

まずはRHEL 8サーバVMを起動して、基本的なツール群をインストールします。VMのブートやsubscription-managerの手順は省きます。

yum install -y pcp-zeroconf pcp-system-tools sos sysstat podman skopeo buildah git lsof strace tcpdump bash-completion

Insightsを有効化しておきます。

yum install -y insights-client
insights-client --register

このサーバで動作しているネットワークサービスはNFS (OpenShiftのNFS PVテスト用), Nexus (Javaアプリをビルドするときのjarファイルのローカルキャッシュ), Container Registry (OpenShiftの外部コンテナレジストリテスト用), ZNC (IRC bouncer), Squid (OpenShiftのプロキシ環境テスト用)です。OpenShiftのサポート業務でこれらが自分のコントロール下にあることで、生産性が大きく向上します。

まずNFSサーバですが、NFSサーバはカーネル空間で動作するため残念ながらコンテナ化できません。普通にセットアップします。

yum install -y nfs-utils
mkdir -p /exports
chown nobody.nobody /exports
chmod 777 /exports
cat <<EOF > /etc/exports
/exports *(rw)
EOF
systemctl enable nfs-server --now
firewall-cmd --add-service nfs
firewall-cmd --runtime-to-permanent

NFSサーバが正しく動作していることを確認します。

mkdir -p /mnt/test
mount $(hostname):/exports /mnt/test
touch /mnt/test/testfile
ls -l /exports
rm /mnt/test/testfile
umount /mnt/test

NFS以外はコンテナにしない理由がないので、基本的に全てコンテナにします。Nexus, Container Registry, ZNCはとりあえずオフィシャルイメージを使います。セキュリティ要件によってはイメージのリビルドを行ったほうが良いでしょう。

以下のような感じでsystemdのunitファイルを記述します。動作ユーザは全て自分のユーザnekop(uid 1000)にしておきます。同様にdocker.io/library/znc, docker.io/library/registry:2も動作させます。

sudo -u nekop mkdir -p /home/nekop/nexus-data
cat <<EOF > /etc/systemd/system/nexus.service
[Unit]
Description=Nexus
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStartPre=-/usr/bin/podman stop nexus
ExecStartPre=-/usr/bin/podman rm nexus
ExecStartPre=/usr/bin/podman pull docker.io/sonatype/nexus
ExecStart=/usr/bin/podman run --name nexus --user 1000:1000 -p 8081:8081 -v /home/nekop/nexus-data:/sonatype-work:Z docker.io/sonatype/nexus
ExecStop=/usr/bin/podman stop nexus

[Install]
WantedBy=multi-user.target
EOF

Squidについてはそのまま使えそうなコンテナが見当たらなかったので、コンテナイメージを作ります。Squidをフォアグラウンドで普通に起動させても良いのですが、今回はお手軽にubi8-initコンテナでコンテナ内systemdで起動する、という方法を採用します。

以下コンテナビルドはRHEL 8上でroot権限での操作です。squidパッケージはRHELのrpmチャネルにあってubiチャネルにはありません。RHELのrpmチャネルにアクセスするためには、RHELホスト上rootでのコンテナビルドが必要です。

podman loginに利用するサービスアカウントのユーザ名とパスワードはRegistry Service Accountsから取得してください。

コンテナ内systemdを利用するためにはsetsebool container_manage_cgroup=on設定が必要です。この設定をしておかないと、コンテナで/sbin/initが起動するけどsystemdが動作せず何も起きない、という結果になります。

podman login registry.redhat.io
podman pull registry.redhat.io/ubi8-init
buildah from --name squid-work registry.redhat.io/ubi8-init
buildah run squid-work dnf install -y squid
buildah run squid-work systemctl enable squid
buildah commit squid-work squid
setsebool container_manage_cgroup=on

他にもubi8-minimalubi8コンテナベースにしてビルドもしてみたのですが、イメージによっては起動確認しようと思ってexecしてコンテナ内からpsコマンドを実行したらpsコマンドが無かったりして少し戸惑いました。podman top squidなどとするとプロセス一覧が取得できるのでそちらで代用できます。

Squidのsystemd unitファイルを作成します。コンテナ内systemdを利用するには--stop-signal SIGRTMIN+3指定が必要なのと、uid指定は削除してデフォルト設定にする必要があります。systemdにはコンテナ内のroot権限が必要となり、uid指定でノーマルユーザを指定するとsystemdが起動しません。

cat <<EOF > /etc/systemd/system/squid.service
[Unit]
Description=Squid
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStartPre=-/usr/bin/podman stop squid
ExecStartPre=-/usr/bin/podman rm squid
ExecStart=/usr/bin/podman run --name squid -p 3128:3128 --stop-signal SIGRTMIN+3 localhost/squid
ExecStop=/usr/bin/podman stop squid

[Install]
WantedBy=multi-user.target
EOF

最後にまとめて起動して、外部接続の許可を行っておしまいです。

systemctl daemon-reload
systemctl enable nexus znc registry squid --now
firewall-cmd --add-service irc
firewall-cmd --add-service squid
firewall-cmd --add-port 5000/tcp
firewall-cmd --add-port 8081/tcp
firewall-cmd --runtime-to-permanent

実際にはマイグレーションにあたってznc.confの設定の見直しをしていたり、既存のデータをrsyncする、DNSのレコードの切り替え、といった雑多な作業が他にも発生していますが、4時間程度で既存のRHEL 7サーバをRHEL 8に移行することができました。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。