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-minimal
やubi8
コンテナベースにしてビルドもしてみたのですが、イメージによっては起動確認しようと思って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に移行することができました。