仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

CodeReady Containersを使ったOpenShiftの評価

OpenShiftはベースにKubernetesを使っているとはいえ、様々な製品が組み合わされたコンテナーの統合環境であり、いざ使おうと思うとセットアップするのはなかなか難しいのが事実です。

Kubernetesをちょっと試すためのツールとしてminikubeがあったように、OpenShiftにはMinishiftというツールがありました(というと過去形みたいに取られますが、現在も存在します)。

OpenShiftはバージョン4.xで、買収したCoreOSが持っていた様々な技術ベースに移行しました。設計が刷新されたOpenShift 4.xをさくっと試せるツールがCodeReady Contanersになり、Minishiftは引き続きOpenShift 3.xをさくっと作成するツールとして存在し続けますが、これから触るならOpenShift 4.xの方がいいと思います。執筆日時点ではOpenShift 4.7.2が最新のバージョンでした。

japan.zdnet.com

CodeReady Containersの存在はもうずっと前から知っていました。ただ、必要なスペックがminikubeやMinishiftと比べると、重量級なので試せていませんでした。最近、会社から新しいマシンを買ってもらったので、試してみることにしました。

OSとスペック

OS

  • Microsoft Windowsの場合はWindows 10 Fall Creators Update (version 1709) 以降をサポート。Home Editionはサポートされない
  • macOSの場合はmacOS 10.14 Mojave以降をサポート。
  • Linuxの場合は Red Hat Enterprise Linux/CentOS 7.5以降もしくは8.0以降をサポート。Debian/Ubuntuは公式サポートではないが動くらしい。

ハードウェアスペック

CodeReady Containersは次の仮想マシンが快適に動くレベルのスペックを要求します。Laptopで動かすとなるとメモリーがネックのような気がします。

  • 4 virtual CPUs (vCPUs)
  • 9 GB of free memory
  • 35 GB of storage space

CodeReady Containersとは

OpenShift 4.x以降をシングルのマシンで実行するツールです。Minishiftというツールがありましたが、これはOpenShift 3.xを実行するためのツールです。 OpenShift 4.xでは内部構成が大きく変わったため、別のツールとして提供されたようです。

以下が参考になります。

はまったこと

最初は普段使いのMacでCodeReady Containersを使おうと思っていました。普段使いのMacはCore i9に16GBメモリ、1TB SSD搭載のMacBook Pro 16インチモデルです。macOS Catalinaを使っていますが、要件の範囲内です。

一見スペックには問題ないのですが、メモリーの要件を満たせずなかなか動きませんでした。普段使いのクライアントだとブラウザーだ、SlackだDocker for macだなどと、複数のアプリケーションが同時並行で動いているのもざらです。

おかしいなと思ってアクティビティモニターでメモリーの状態を見たら、「物理メモリー 16GB、 使用済みメモリー 12.5GB」という状態でした。当然ながら使用済みメモリーは状況に応じて変動します。9GBメモリーのVMなぞ動いたらあっという間にスワップします。

というわけでLaptopでの実行を諦めて、Linuxで動かすことにしました(確認したところ、既にスワップとして1.1GB使われていたりします。高速なSSDが実装されているので、あまり遅さは感じませんが)。

ちなみに、これがLinuxで稼働中の状態です。動かしている環境はメモリー32GBを実装しているモデルです。(1024*32) * 30%で計算すると、9830MBです。9GBどころかほぼ10GBですね。

f:id:virtualtech:20210402173208p:plain

セットアップ手順など

以下が参考になります。

クライアントからCRCで構築したOpenShiftにリモートアクセスするための流れ

作業ログ

さて、リンクを貼るだけではそっけないので、実際にどのように構築するのかをコマンドを交えて説明します。

動作確認したバージョン

手元の環境では、以下のバージョンで動作を確認しました。

  • CodeReady Containers 1.24.0
  • CentOS 8.3
  • CentOS 7.9

ドキュメントを見ると書かれているのですが、VPNを張った状態で環境構築すると名前解決に失敗するそうなので、完全に切った状態で実行した方が良さそうです。ある意味これも注意ポイントです。

CodeReady Containersとシークレットのダウンロード

以下にアクセスします。Red Hatアカウントが必要です。CRCツールとシークレットをダウンロードしておきます。今回はLinuxでの実行を想定するため、CodeReady ContainersのLinux版をダウンロードしました。

CodeReady Containersはxz形式で圧縮されているため、次のコマンドで展開します。crcコマンドは以降ユーザー権限で実行するため、任意のユーザーで展開しておいてください。

[ytooyama@crcdemo ~]$ tar Jxfv crc-linux-amd64.tar.xz 

以降は基本的には任意のユーザーでコマンドを実行します。管理権限が必要な時のみroot権限で実行するようにします。 RHEL/CentOSなどはrootユーザーでは/usr/local/binにパスが通っておらず、その配下に展開したバイナリーはCLIで実行できません(フルパスでは実行できる)。

[root@crcdemo ~]# /usr/local/bin/crc version
CodeReady Containers version: 1.24.0+5f06e84b
OpenShift version: 4.7.2 (embedded in executable)

[root@crcdemo ~]# crc version
bash: crc: コマンドが見つかりませんでした...

crcコマンドはユーザー権限で実行するため今回は必要ありませんが、必要に応じてvisudoを実行したあと、secure_pathにパスを追加します。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

初期セットアップ

コマンドを実行すると、CodeReady Containersの実行に必要なLinux KVM環境とか必要なもののセットアップが行われます。 コンテナーの中でdnsmasqサービスが実行されて、それにより.testingドメインの名前解決ができます。

[ytooyama@crcdemo ~]$ crc setup

全て完了後に再度コマンドを実行すると、システム要件が満たされているか確認できます。

[ytooyama@crcdemo ~]$ crc setup
INFO Checking if running as non-root              
INFO Checking if podman remote executable is cached 
INFO Checking if admin-helper executable is cached 
INFO Checking minimum RAM requirements            
INFO Checking if Virtualization is enabled        
INFO Checking if KVM is enabled                   
INFO Checking if libvirt is installed             
INFO Checking if user is part of libvirt group    
INFO Checking if libvirt daemon is running        
INFO Checking if a supported libvirt version is installed 
INFO Checking if crc-driver-libvirt is installed  
INFO Checking if systemd-networkd is running      
INFO Checking if NetworkManager is installed      
INFO Checking if NetworkManager service is running 
INFO Checking if /etc/NetworkManager/conf.d/crc-nm-dnsmasq.conf exists 
INFO Checking if /etc/NetworkManager/dnsmasq.d/crc.conf exists 
INFO Checking if libvirt 'crc' network is available 
INFO Checking if libvirt 'crc' network is active  
INFO Checking if CRC bundle is extracted in '$HOME/.crc' 
INFO Checking if /home/ytooyama/.crc/cache/crc_libvirt_4.7.2.crcbundle exists 
Setup is complete, you can now run 'crc start' to start the OpenShift cluster

CodeReady ContainersによるOpenShiftのセットアップ

次のコマンドでOpenShiftを実行します。pull-secretはCreate an OpenShift cluster(Local)でダウンロードできるファイルを指定します。

[ytooyama@crcdemo ~]$ crc start -p pull-secret

しばらく待つと、このようなメッセージが出力されます(kubeadminのパスワードは自動生成です)。

Started the OpenShift cluster.

The server is accessible via web console at:
  https://console-openshift-console.apps-crc.testing

Log in as administrator:
  Username: kubeadmin
  Password: E56a5-HXyuR-UWfIa-zYtAG

Log in as user:
  Username: developer
  Password: developer

Use the 'oc' command line interface:
  $ eval $(crc oc-env)
  $ oc login -u developer https://api.crc.testing:6443

クラスターにログイン

Kubernetesと異なり、OpenShiftはユーザーとロールが厳格に設定されています。 kubeadminユーザーはクラスターの管理ができます。developerはアプリケーションの展開のためのユーザーであり、その権限でクラスター管理はできないように設定されます(権限分離がしっかりしている)。

クラスターにログインしてCLI操作してみましょう。

[ytooyama@crcdemo ~]$ eval $(crc oc-env)
[ytooyama@crcdemo ~]$ oc login -u kubeadmin https://api.crc.testing:6443
Logged into "https://api.crc.testing:6443" as "kubeadmin" using existing credentials.

You have access to 61 projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "default".
[ytooyama@crcdemo ~]$ oc get no
NAME                 STATUS   ROLES           AGE   VERSION
crc-rsppg-master-0   Ready    master,worker   14d   v1.20.0+5fbfd19

[ytooyama@crcdemo ~]$ oc get svc
NAME         TYPE           CLUSTER-IP   EXTERNAL-IP                            PORT(S)   AGE
kubernetes   ClusterIP      10.217.4.1   <none>                                 443/TCP   14d
openshift    ExternalName   <none>       kubernetes.default.svc.cluster.local   <none>    14d

[ytooyama@crcdemo ~]$ oc get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                                 STORAGECLASS   REASON   AGE
pv0001   100Gi      RWO,ROX,RWX    Recycle          Bound       openshift-image-registry/crc-image-registry-storage                           13d
pv0002   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 13d
...

ocコマンドはおおよそalias kubectl="oc"です。最新版でデプロイしたところ、Kubernetes 1.20相当になるようです。

OpenShift Do(odo)を使ってコンテナーアプリケーションを実行してみる

OpenShift Do(odo)というCLIツールがあるので、これを使ってOpenShift プロジェクトおよびアプリケーションを作成してみます。 まずはツールのインストールから。

[root@crcdemo ~]# curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-linux-amd64 -o /usr/local/bin/odo
[root@crcdemo ~]# chmod +x /usr/local/bin/odo

OpenShift Do(odo) CLIでクラスターにログインします。アプリケーションのデプロイをするのでdeveloperアカウントでログインします。

[ytooyama@crcdemo ~]$ odo login -u developer -p developer

まずはプロジェクトを作成します。

[ytooyama@crcdemo ~]$ odo project create sample-app

アプリケーションディレクトリーを用意します。

[ytooyama@crcdemo ~]$ mkdir sample-app
[ytooyama@crcdemo ~]$ cd sample-app

ODO CLIを使用してサンプルアプリケーションのデプロイを行います。

[ytooyama@crcdemo ~]$ odo create nodejs --git https://github.com/openshift/nodejs-ex --s2i
[ytooyama@crcdemo ~]$ odo url create --port 8080
[ytooyama@crcdemo ~]$ odo push

デプロイしたアプリケーションのエンドポイントを確認します。

[ytooyama@crcdemo sample-app]$ odo url list
W0401 21:48:14.183000    9662 asm_amd64.s:1373] Unable to clean up cache directory: open /tmp/odohttpcache: permission denied
Found the following URLs for component nodejs-cphm
NAME                 STATE      URL                                                         PORT     SECURE     KIND
nodejs-cphm-8080     Pushed     http://nodejs-cphm-8080-app-sample-app.apps-crc.testing     8080     false      route

curlやw3mなどを使って、デプロイしたアプリケーションにアクセスしてみます。

[ytooyama@crcdemo sample-app]$ w3m http://nodejs-cphm-8080-app-sample-app.apps-crc.testing
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Welcome to your Node.js application on OpenShift
...
≪ ↑ ↓ Viewing <Welcome to OpenShift>

デスクトップ環境を入れて、OpenShiftを操作してみようと思います。 まずはGNOMEのインストールから。以下を参考に実施。 https://zero-config.com/centos/gnome-0001.html

[ytooyama@crcdemo ~]$ sudo LANG=C yum groupinstall "GNOME Desktop"

コンソールで以下を実行してXサーバーを起動します。本来はシステムデフォルトのランレベルの設定をするなどをやるのですが、今回はそちらが目的ではないため説明は省略します。

[ytooyama@crcdemo ~]$ startx

コマンドを実行すると、Linuxのデスクトップ環境(GNOME Classicシェル)が表示されます。

f:id:virtualtech:20210402144640j:plain

ああ、壁紙はネタです。こちらからいただいたもの(オフィシャル)です。

アクセス用のURLをブラウザーで開いてみます。次のようなログイン画面が表示されますので、CLI実行時に最後に現れたユーザーとパスワードを入れてログインします。

f:id:virtualtech:20210402145158j:plain

あとはCLIでアプリケーションをデプロイしたように、GUIベースでアプリケーションのデプロイが可能になります。ビルドの進捗はアニメーションで表示されるので、わかりやすいと思います。

f:id:virtualtech:20210402150540j:plain

CodeReady Containersを使うことで、OpenShiftを手元の環境でさくっと動かすことができるのがわかりました。

本格的に使い始めるには、ドキュメントに従って環境構築していく必要があるようです。パブリッククラウドを使っていれば簡単にデプロイ出来そうです。 ベアメタルでのデプロイはKubernetes以上に考えなければならないことが多いので大変そうですが、そのうち試したいと思っています。