Apple Silicon搭載MacにシングルノードOpenShiftをインストールする(エージェントベース編)

Red Hatでソリューションアーキテクトをしている田中司恩(@tnk4on)です。

Apple Silicon搭載Mac(以下、ARM Mac)へのOpenShiftのインストールがさらに簡単になりました!前回の記事から短期間での内容更新ですが、動作確認ができたので世界最速で新しいインストール手順をご紹介します!

(いつものお約束。本記事の内容は検証を目的としており、本番環境での使用や公式なサポートを保証するものではありません。)

[前回記事] 本記事でも度々参照しますので合わせて確認してください。 rheb.hatenablog.com

(2023/5/10、追記) 支援付きインストーラーの記事を公開しました! rheb.hatenablog.com

-目次-


エージェントベースのインストール

エージェントベース(Agent-based)のインストールは、OpenShift Container Platform 4.12 でGAになった新しいインストール方法です。支援付きインストーラー(Assisted Installer)の使いやすさをオンプレのインストールに活用することができるインストール方法です。支援付きインストーラーのような対話式のGUIはありませんが、CLIでシンプルに実行ができ、また非接続環境への導入も可能な柔軟性も兼ね備えています。install-config.yamlファイルとagent-config.yamlを使って起動用のエージェントISOを作成し、このISOで起動することでOpenShiftクラスターが自動で作成されます。 今回の記事ではエージェントベースのインストール自体は深く掘り下げませんが、下記の公式ブログで紹介されていますので参考にしてください。

SNO on ARM Mac(エージェントベース)の構成概要

エージェントベースのインストールの場合でもARM Macへのインストールの構成自体はほぼ変わりません。coreos-installerの代わりにopenshift-installをコンテナで実行する用に変更になったくらいです。

構成図

Single Node OpenShift on ARM Mac(Agent-based)のアーキテクチャー
Single Node OpenShift on ARM Mac(Agent-based)のアーキテクチャー

構成の特徴、前提条件、パラメーター一覧

構成の特徴、前提条件、パラメーター一覧は前回の記事を参照してください。

インストール方法

参照するインストールドキュメントは下記をベースとしますが、今回もARM Mac用に様々なカスタマイズを加えています。

第14章 エージェントベースのインストーラーを使用したオンプレミスクラスターのインストール

前回記事と重複する部分は多いですが、agent-config.yamlの修正やopenshift-install用のコンテナのビルドは今回新しく追加された手順です。

Gitリポジトリのクローン

インストールに必要なファイル類のテンプレートを用意しています。下記URLのリポジトリをクローンしてご利用ください。

GitHub - tnk4on/sno-on-arm-mac: Install Single Node OpenShift on Apple Silicon-based Mac (ARM Mac)

git clone https://github.com/tnk4on/sno-on-arm-mac.git
cd sno-on-arm-mac
  • agent-basedディレクトリ配下のファイルを使用します

インストーラーとOpenShift CLIの入手

インストールに必要な openshift-install とクライアントの oc を入手して実行パスに配置します。 今回のインストール方法ではコンテナ内で openshift-installを実行するのでMacに導入するものは直接インストールに関係しませんが、インストール中のログ確認等に使用するので導入しておきましょう。

export OCP_VERSION=4.13.0-rc.2
export ARCH=aarch64
mkdir src
cd src
curl -LO https://mirror.openshift.com/pub/openshift-v4/$ARCH/clients/ocp/$OCP_VERSION/openshift-install-mac.tar.gz
curl -LO https://mirror.openshift.com/pub/openshift-v4/$ARCH/clients/ocp/$OCP_VERSION/openshift-client-mac.tar.gz
tar zxf openshift-install-mac.tar.gz
tar zxf openshift-client-mac.tar.gz
sudo cp openshift-install oc /usr/local/bin/
cd ..
  • OCP_VERSION: 「4.13.0-rc.2」以降を指定します
    • (注意)4.13.0-rc.0ではインストールが完了しません
  • ARCH: ARM Macに対応した「aarch64」を指定します
  • ダウンロードしたアーカイブはsrcディレクトリに一時保存します
  • 実行バイナリの配置先はPATH環境変数であればどこでも可能です

RHCOS ISOの入手

今回はインストールには使用しませんが、agent-config.yamlに記載するストレージデバイス名とNIC名の確認に使用します。

mkdir iso
export ISO_URL=$(openshift-install coreos print-stream-json | grep location | grep $ARCH | grep iso | cut -d\" -f4)
curl -L $ISO_URL -o iso/rhcos-live.iso
  • 一度デバイス名の確認が完了すれば削除してしまって問題ありません

DNSサーバーの実行

前回の記事を参照 - DNSサーバーの実行

Macホストの設定変更

前回の記事を参照 - Macホストの設定変更

RHCOS ISOのテスト起動とデバイス名の確認

前回の記事を参照 - RHCOS ISOのテスト起動とデバイス名の確認

install-config.yamlの更新

ご利用の環境に合わせてinstall-config.yamlの内容を修正します。前回記事との違いはインストール先ディスクの指定が無い点です。*1

agent-based/install-config.yamlのサンプルを展開

apiVersion: v1
baseDomain: home.lab
compute:
- name: worker
  replicas: 0
controlPlane:
  name: master
  replicas: 1
metadata:
  name: sno
networking:
  clusterNetworks:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  machineNetwork:
  - cidr: 192.168.1.0/24
  networkType: OVNKubernetes
  serviceNetwork:
  - 172.30.0.0/16
platform:
  none: {}
pullSecret: '{"auths":...}' 
sshKey: 'ssh-ed25519 AAAA...'

1. プルシークレット

前回の記事を参照 - 1. プルシークレット

2. SSHキー

前回の記事を参照 - SSHキー

agent-config.yamlの更新

今回のインストール方法のポイントとなるセクションです。使用環境に合わせて内容を修正します。

agent-based/agent-config.yamlのサンプルを展開

apiVersion: v1alpha1
kind: AgentConfig
metadata:
  name: sno
rendezvousIP: 192.168.1.40
hosts: 
  - hostname: m1-ocp
    interfaces:
      - name: enp0s1
        macAddress: 6a:75:4d:0c:7e:a5
    rootDeviceHints: 
      deviceName: /dev/vda
    networkConfig: 
      interfaces:
        - name: enp0s1
          type: ethernet
          state: up
          mac-address: 6a:75:4d:0c:7e:a5
          ipv4:
            enabled: true
            address:
              - ip: 192.168.1.40
                prefix-length: 24
            dhcp: false
      dns-resolver:
        config:
          server:
            - 192.168.1.150
      routes:
        config:
          - destination: 0.0.0.0/0
            next-hop-address: 192.168.1.1
            next-hop-interface: enp0s1
            table-id: 254

1. ランデブーIP

rendezvousIP::シングルノード構成なのでOpenShiftノードと同じIPアドレスを設定します

2. ネットワーク設定

  • hostname::OpenShiftノードのホスト名を設定します
  • macAddress: , mac-address::NICのMACアドレスを記載します。RHCOSのテスト起動時や仮想環境アプリで確認してください。2箇所あります。
  • NIC名:確認したNIC名を記載します。3箇所あります。
hosts: 
    interfaces:
      - name: enp0s1
   networkConfig: 
      interfaces:
        - name: enp0s1
            next-hop-interface: enp0s1
  • DNSサーバー:コンテナ実行したDNSサーバーを使用するためARM MacホストのIPアドレスを指定します
      dns-resolver:
        config:
          server:
            - 192.168.1.150
  • next-hop-address::デフォルトゲートウェイのIPアドレスを記載します

3. ルートデバイスヒント

確認したストレージデバイス名を記載します。

    rootDeviceHints: 
      deviceName: /dev/vda
  • ルートデバイスヒントは記載しなくてもインストールが可能ですが、ディスクの検出のプロセスに時間がかかるため記載しておくと時間短縮になります
  • (注意)ストレージの容量は必ず120GB以上にしてください。120GB未満だとディスクが検出されてもインストールが開始されません。

エージェントISO作成用コンテナイメージのビルド

エージェントISOの作成はopenshift-installを使用します。今回はagent-config.yamlに静的IPアドレスの設定を加えており、このネットワークの設定を行うためにNMStateが必要です。RHELなどのLinuxサーバーであればNMStateは簡単にインストールできますが、調べたところMac用はありません。そこでopenshift-installとNMStateが入ったLinuxベースのコンテナイメージを作成し、その中でエージェントISOの作成を行うようにします。

Containerfile

コンテナイメージのビルドに使用するContainerfileは下記の内容になります。

agent-based/Containerfileの内容を展開

# Preparation Build
FROM quay.io/centos/centos:stream9-minimal as prep

# ARG
ARG VERSION

# ENV 
ENV VERSION=${VERSION}
ENV ARCH=aarch64

# Download binary
RUN microdnf install tar gzip -y 
RUN curl -LO https://mirror.openshift.com/pub/openshift-v4/${ARCH}/clients/ocp/${VERSION}/openshift-install-linux.tar.gz
RUN curl -LO https://mirror.openshift.com/pub/openshift-v4/${ARCH}/clients/ocp/${VERSION}/openshift-client-linux.tar.gz
RUN tar xzf openshift-install-linux.tar.gz
RUN tar xzf openshift-client-linux.tar.gz

# Build image
FROM quay.io/centos/centos:stream9-minimal as build

RUN microdnf update -y \
&& microdnf install nmstate -y \
&& microdnf clean all

COPY --from=prep openshift-install /usr/local/bin
COPY --from=prep oc /usr/local/bin

ENTRYPOINT ["/usr/local/bin/openshift-install"]

  • ベースイメージにCentOS 9 Stream minimalを使用します*2
  • ツールのダウンロードと実行用のステージを分けたマルチステージビルドを行います
  • openshift-installの実行の際にocも必要となるのでocも導入します
  • ビルド引数を使用してOpenShiftのバージョンを指定します
  • ENTRYPOINTにopenshift-installの実行を指定します

コンテナのビルド

ビルド引数にOpenShiftのバージョンを指定してビルドを実行します

export OCP_VERSION=4.13.0-rc.2
podman build -f agent-based/Containerfile -t openshift-install --build-arg VERSION=${OCP_VERSION}
podman run -it --rm openshift-install version
  • バージョンが表示されたらコンテナのビルドは成功です
  • タグ名はopenshift-installにしてますが、任意で変更可能です

エージェントISOの作成

インストールディレクトリおよびイメージ、ツール類が格納されるキャッシュディレクトリを作成します。install-config.yamlとagent-config.yamlをインストールディレクトリにコピーし、ビルドしたopenshift-installコンテナイメージを使用してエージェントISOの作成を実行します。

mkdir -p ocp image_cache files_cache
cp agent-based/*.yaml ocp
podman run --privileged --rm \
    -v $PWD:/data \
    -v ./image_cache:/root/.cache/agent/image_cache \
    -v ./files_cache:/root/.cache/agent/files_cache \
    -w /data openshift-install:latest \
     --dir ocp agent create image
  • 初回は元になるISO(image_cache配下に保存される)のダウンロードから開始するので時間がかかります。
  • 2回目以降の実行時はキャッシュを再利用します。キャッシュを検証し、インストーラーのバージョンが更新されていれば再度ダウンロードが行われます。
  • (注意)ISOを作成すると使用したinstall-config.yamlとagent-config.yamlは失われるので、毎回コピーして元ファイルを残すようにしましょう

エージェントISOの作成後のインストールディレクトリとキャッシュディレクトリの構成は下記のようになります

.
├── files_cache
│   ├── agent-tui
│   └── libnmstate.so.1.3.3
├── image_cache
│   └── coreos-aarch64.iso
└── ocp
    ├── .openshift_install.log
    ├── .openshift_install_state.json
    ├── agent.aarch64.iso
    ├── auth
    │   ├── kubeadmin-password
    │   └── kubeconfig
    └── rendezvousIP
  • ocp/.openshift_install.logにエージェントISO作成時のログが作成されます。うまくいかない時はログの内容をチェックしてみてください。

エージェントISOの起動

インストールディレクトリ配下に作成されたagent.aarch64.isoを使用して仮想マシンを起動します。ISO起動後は自動でクラスターのインストールが開始されます。

起動後しばらくすると下記のような画面が表示されます。ネットワークの接続確認にパスするとさらに追加で設定変更するかどうかの選択ができます。事前にagent-config.yamlで設定済みなので変更する必要はありません。そのまま放置すると自動でインストールが継続されます。

エージェントベースインストールのNetworkManager TUI
エージェントベースインストールのNetworkManager TUI

(参考)NetworkManager TUI

エージェントベースインストールの特徴がエージェントISO起動時に出てくるNetworkManager TUIです。ツール自体はRHELでもお馴染みのnmtuiそのものです。設定画面を開いてみるとagent-config.yamlで設定した内容が自動で入力されているのが確認できます。

NetworkManager TUIの接続設定
NetworkManager TUIの接続設定

NetworkManager TUIの接続のアクティベート
NetworkManager TUIの接続のアクティベート

NetworkManager TUIのホスト名の設定
NetworkManager TUIのホスト名の設定

NetworkManager TUIのネットワークステータス
NetworkManager TUIのネットワークステータス

インストール中の自動再起動

インストールの自動実行中、下記のタイミングで再起動が2回行われます。

  • 1回目:ISO起動→ディスクへ書き込み完了後
  • 2回目:Bootstrap開始→Bootstrap完了後

インストール完了の確認

下記のコマンドを実行し、クラスターのインストールが完了したことを確認します。

export KUBECONFIG=ocp/auth/kubeconfig
openshift-install --dir=ocp wait-for install-complete

インストール完了後のログ出力でkubeadminのパスワードを確認できます。

〜省略〜
INFO Install complete!                            
INFO To access the cluster as the system:admin user when using 'oc', run 'export KUBECONFIG=/Users/*****/***/ocp-on-arm-mac/ocp/auth/kubeconfig' 
INFO Access the OpenShift web-console here: https://console-openshift-console.apps.sno.home.lab 
INFO Login to the console with user: "kubeadmin", and password: "BJpWp-8dGqa-XNGoW-vzGfV" 
  • 同じくログに表示されているWebコンソールのURLにアクセスしてOpenShiftを使用開始します

(参考)インストール状況のモニタリング

OpenShiftのインストール実行中、ターミナルウィンドウを複数開き下記のコマンドを利用してログのモニタリングができます。

前回の記事を参照 - (参考)インストール状況のモニタリング

エージェントベースのインストール用に下記のモニタリングコマンドが使えます。

export KUBECONFIG=ocp/auth/kubeconfig
openshift-install --dir=ocp agent wait-for bootstrap-complete
  • wait-for bootstrap-completeはISO起動からBootstrap完了まで

インストールログのサンプルを展開

INFO Waiting for cluster install to initialize. Sleeping for 30 seconds 
〜中略〜
INFO Waiting for cluster install to initialize. Sleeping for 30 seconds 
INFO Cluster is not ready for install. Check validations 
WARNING Cluster validation: The cluster has hosts that are not ready to install. 
WARNING Host m1-ocp validation: Host couldn't synchronize with any NTP server 
WARNING Host m1-ocp: updated status from discovering to insufficient (Host cannot be installed due to following failing validation(s): Host couldn't synchronize with any NTP server) 
INFO Host m1-ocp: updated status from insufficient to known (Host is ready to be installed) 
INFO Cluster is ready for install                 
INFO Cluster validation: All hosts in the cluster are ready to install. 
INFO Preparing cluster for installation           
INFO Host m1-ocp: updated status from known to preparing-for-installation (Host finished successfully to prepare for installation) 
INFO Host m1-ocp: New image status quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:250b5a39dd30e13afcdcefdfa99586811b438c3e6dc9df350f9a4132188d4fe6. result: success. time: 7.04 seconds; size: 438.75 Megabytes; download rate: 65.31 MBps 
WARNING Host's disk /dev/disk/by-path/pci-0000:00:05.0 is slower than the supported speed, and may cause degraded cluster performance (fdatasync duration: 21 ms) 
INFO Host m1-ocp: updated status from preparing-for-installation to preparing-successful (Host finished successfully to prepare for installation) 
INFO Cluster installation in progress             
INFO Host m1-ocp: updated status from preparing-successful to installing (Installation is in progress) 
INFO Host: m1-ocp, reached installation stage Installing: bootstrap 
INFO Host: m1-ocp, reached installation stage Waiting for bootkube 
INFO Bootstrap Kube API Initialized               
INFO Host: m1-ocp, reached installation stage Writing image to disk 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 11% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 24% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 36% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 49% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 61% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 66% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 77% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 88% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 94% 
INFO Host: m1-ocp, reached installation stage Writing image to disk: 100% 
INFO Bootstrap configMap status is complete       
INFO cluster bootstrap is complete                

環境のリセット

インストールに問題があった場合はインストールディレクトリを削除してエージェントISOの作成からやり直します。毎回キャッシュ済みのISOやツール類のチェックは行われるので、キャッシュディレクトリは残しておいて問題ありません。

インストールディレクトリの削除

rm -rf ocp

エージェントISOの再作成

mkdir -p ocp
cp agent-based/*.yaml ocp
podman run --privileged --rm \
    -v $PWD:/data \
    -v ./image_cache:/root/.cache/agent/image_cache \
    -v ./files_cache:/root/.cache/agent/files_cache \
    -w /data openshift-install:latest \
     --dir ocp agent create image

まとめ

前回記事の最後にチラッと紹介したエージェントベースのインストールが早くも使えるようになりました。エージェントISO作成用のコンテナイメージさえ事前に用意しておけばすぐにインストールが開始できます。前回記事のUPIをベースとした手動インストールもかなり手順を簡略化しましたが、今後はこのエージェントベースのみでも十分になりそうです。 前回、今回の記事を活用するとRed Hat公式のARM Macで動作するOpenShift Localのリリース待つまでもなくすぐにお手持ちのM1、M2 MacでOpenShiftを動かせます。さぁ、ARM MacでのOpenShift体験を今すぐ試してみましょう!

*1:どちらかというと通常のUPI用のinstall-config.yamlに戻った状態

*2:残念ながらUBIはNMStateのインストールができなかったため採用を見送りました

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