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が最新のバージョンでした。
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では内部構成が大きく変わったため、別のツールとして提供されたようです。
以下が参考になります。
- https://developers.redhat.com/products/codeready-containers/overview
- https://access.redhat.com/documentation/en-us/red_hat_codeready_containers/
はまったこと
最初は普段使いの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ですね。
セットアップ手順など
以下が参考になります。
- https://cloud.redhat.com/openshift/create/local
- https://access.redhat.com/documentation/en-us/red_hat_codeready_containers/1.24/html/getting_started_guide/index
- https://developers.redhat.com/openshift/command-line-tools
クライアントからCRCで構築したOpenShiftにリモートアクセスするための流れ
- https://rheb.hatenablog.com/entry/crc_remote_connecting
- https://access.redhat.com/documentation/en-us/red_hat_codeready_containers/1.24/html/getting_started_guide/networking_gsg#setting-up-remote-server_gsg
作業ログ
さて、リンクを貼るだけではそっけないので、実際にどのように構築するのかをコマンドを交えて説明します。
動作確認したバージョン
手元の環境では、以下のバージョンで動作を確認しました。
- 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シェル)が表示されます。
ああ、壁紙はネタです。こちらからいただいたもの(オフィシャル)です。
アクセス用のURLをブラウザーで開いてみます。次のようなログイン画面が表示されますので、CLI実行時に最後に現れたユーザーとパスワードを入れてログインします。
あとはCLIでアプリケーションをデプロイしたように、GUIベースでアプリケーションのデプロイが可能になります。ビルドの進捗はアニメーションで表示されるので、わかりやすいと思います。
CodeReady Containersを使うことで、OpenShiftを手元の環境でさくっと動かすことができるのがわかりました。
本格的に使い始めるには、ドキュメントに従って環境構築していく必要があるようです。パブリッククラウドを使っていれば簡単にデプロイ出来そうです。 ベアメタルでのデプロイはKubernetes以上に考えなければならないことが多いので大変そうですが、そのうち試したいと思っています。