前提
Developer Sandbox for Red Hat OpenShiftという無償環境を利用してみたので、覚え書きです。
OpenShiftは本来有償のツールですが、Developer Sandboxを利用することで、権限の少なさや環境の保持期限などいくつか制限はあるものの、実際のOpenShiftの操作などを無料で体験することができます。
今回は前半後半に分けて、OpenShiftのSandbox環境を用意する手順と、oc new-appコマンドでGitHubリポジトリ上にあるNode.jsアプリを素早く簡単にデプロイしてみる手順をご紹介します。
おおまかな手順
【前半】Sandbox環境の準備:Red Hat Developer Sandboxにアクセスし、クラスタをセットアップ。
【後半】サンプルNode.jsアプリのデプロイ:GitHub上に公開されているNode.jsアプリをOpenShiftの機能で簡単にデプロイ。
環境
- 利用ツール :Developer Sandbox for Red Hat OpenShift
- クラスターバージョン :4.18.4
- ocバージョン :OpenShift v4.18.4 Windows Client
- ocを利用している環境 :Windows 11のコマンドプロンプトから
- 操作 :oc(OpenShift CLI)を利用したコマンド操作でできるだけ進めますが、必要な手順は別途、Webコンソールを使用していきます。
【前半】Sandbox環境の準備
以下の記事を参考にさせていただきました。基本的に手順はすべて一緒です。画面が少し変化しているものがあったのでスクショ多めでご紹介していきます。
- 事前にRedhatアカウントを作成しておく。
- Sandboxの利用を開始する。以下にアクセスして「無料トライアルを始める」。
Red Hat OpenShift を無料で使い始める | Red Hat
- その後、遷移した画面の「開発者サンドボックス」内でもう一度「無料トライアルを始める」。
- 画面遷移もしくは、以下にアクセスして「Get started」。
Developer Sandbox | OpenShift AI - OpenShift AI | OpenShift
- 画面遷移し、「Got it」。
- 画面遷移して「OpenShift」を「Launch」し、ログイン。
- Webコンソール画が表示されるので、左上から「⚙管理者向け表示」に切り替え。
- 「管理」→「クラスター設定」を開き、自分のOpenShiftクラスタのバージョンを確認。
- 確認したバージョンに対応するOpenShift CLI (oc)を自分のPCにダウンロードし、パスを通す。Windowsの場合の手順は以下を参考にする。
- ocが無事に利用できることを確認。現段階ではまだocでログインしていないため警告が出ます。(今回はコマンドプロンプトでocを利用していくため、以降のコマンドは特に記載がない限りコマンドプロンプトから実行します。)
ocが使えるか確認するコマンドと、出力例
> oc version Client Version: 4.18.4 Kustomize Version: v5.4.2 error: You must be logged in to the server (Unauthorized) - Webコンソールの右上のほうからログインコマンドをコピー、コマンドプロンプトに貼り付けてログイン。
ログインコマンドの例と、出力例> oc login --token=sha256~ABCD_EFG-1234567890 --server=https://api.rm3.7wse.p1.openshiftapps.com:6443 Logged into "https://api.rm3.7wse.p1.openshiftapps.com:6443" as "nishiooi" using the token provided. You have access to the following projects and can switch between them with 'oc project <projectname>': * nishiooi-dev openshift-virtualization-os-images Using project "nishiooi-dev".
【後半】サンプルNode.jsアプリのデプロイ
以下の手順では、コマンド実行後の出力結果なども一緒に載せています。
必要なコマンドだけ簡単に確認したい方はocコマンドだけまとめを見ていただけると早いです。
Node.jsで動作し、CRUDサンプルアプリケーションをOpenshift上でデプロイします。
こちらのGitHubリポジトリを参考にしています。
sclorg/nodejs-ex: node.js example
本来であれば、アプリのデプロイごとにクラスタ上に新しくプロジェクトを作成した方が運用がすっきりするのですが、Sandbox環境の制約により新規のプロジェクト作成はできません。
今回は最初に自動作成されるプロジェクト(例:<username>-dev)上ですべて進めていきます。
- 念のため今指定しているプロジェクトを確認。
> oc project Using project "nishiooi-dev" on server "https://api.rm3.7wse.p1.openshiftapps.com:6443". - Node.jsアプリの動作に必要なPostgres DBを先にデプロイ。
> oc new-app -e POSTGRESQL_USER=luke -e POSTGRESQL_PASSWORD=secret -e POSTGRESQL_DATABASE=my_data centos/postgresql-10-centos7 --name=my-database --> Found container image ecc4d3f (3 years old) from Docker Hub for "centos/postgresql-10-centos7" PostgreSQL 10 ------------- PostgreSQL is an advanced Object-Relational database management system (DBMS). The image contains the client and s erver programs that you'll need to create, run, maintain and access a PostgreSQL DBMS server. Tags: database, postgresql, postgresql10, rh-postgresql10 * An image stream tag will be created as "my-database:latest" that will track this image --> Creating resources ... imagestream.image.openshift.io "my-database" created deployment.apps "my-database" created service "my-database" created --> Success Application is not exposed. You can expose services to the outside world by executing one or more of the commands below: 'oc expose service/my-database' Run 'oc status' to view your app. - 作成されたイメージストリーム、デプロイメント、サービス、ポッドそれぞれと、プロジェクト全体の現況を確認。(※
modelmesh-servingというサービスが表示されていますが、これは環境にデフォルトで用意されているもので、消せない設定になっています。今回やりたいことに干渉しないので気にせずそのままにします。)> oc get is,deploy,svc,po NAME IMAGE REPOSITORY TAGS UPDATED imagestream.image.openshift.io/my-database default-route-openshift-image-registry.apps.rm3.7wse.p1.openshiftapps.com/nishiooi-dev/my-database latest 2 minutes ago NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-database 1/1 1 1 2m9s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/modelmesh-serving ClusterIP None <none> 8033/TCP,8008/TCP,8443/TCP,2112/TCP 157m service/my-database ClusterIP 172.30.155.192 <none> 5432/TCP 2m8s NAME READY STATUS RESTARTS AGE pod/my-database-758cf6b9cc-9s64b 1/1 Running 0 2m9s > oc status Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+ In project nishiooi-dev on server https://api.rm3.7wse.p1.openshiftapps.com:6443 svc/modelmesh-serving (headless) ports 8033, 8008, 8443, 2112 svc/my-database - 172.30.155.192:5432 deployment/my-database deploys istag/my-database:latest deployment #2 running for 2 minutes - 1 pod deployment #1 deployed 2 minutes ago 1 info identified, use 'oc status --suggest' to see details. - Node.jsアプリ本体をデプロイ。
> oc new-app nodejs https://github.com/openshift/nodejs-ex --name=nodejs-app --> Found image 6061449 (5 months old) in image stream "openshift/nodejs" under tag "20-ubi9" for "nodejs" Node.js 20 ---------- Node.js 20 available as container is a base platform for building and running various Node.js 20 applications and frameworks. Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. Tags: builder, nodejs, nodejs20 * The source repository appears to match: nodejs * A source build using source code from https://github.com/openshift/nodejs-ex will be created * The resulting image will be pushed to image stream tag "nodejs-app:latest" * Use 'oc start-build' to trigger a new build --> Creating resources ... imagestream.image.openshift.io "nodejs-app" created buildconfig.build.openshift.io "nodejs-app" created deployment.apps "nodejs-app" created service "nodejs-app" created --> Success Build scheduled, use 'oc logs -f buildconfig/nodejs-app' to track its progress. Application is not exposed. You can expose services to the outside world by executing one or more of the commands below: 'oc expose service/nodejs-app' Run 'oc status' to view your app. - 作成されたイメージストリーム、ビルドコンフィグ、デプロイメント、サービス、ポッドそれぞれと、プロジェクト全体の現況を確認。
> oc get is,bc,deploy,svc,po NAME IMAGE REPOSITORY TAGS UPDATED imagestream.image.openshift.io/my-database default-route-openshift-image-registry.apps.rm3.7wse.p1.openshiftapps.com/nishiooi-dev/my-database latest 11 minutes ago imagestream.image.openshift.io/nodejs-app default-route-openshift-image-registry.apps.rm3.7wse.p1.openshiftapps.com/nishiooi-dev/nodejs-app latest 3 minutes ago NAME TYPE FROM LATEST buildconfig.build.openshift.io/nodejs-app Source Git 1 NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-database 1/1 1 1 11m deployment.apps/nodejs-app 1/1 1 1 4m56s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/modelmesh-serving ClusterIP None <none> 8033/TCP,8008/TCP,8443/TCP,2112/TCP 167m service/my-database ClusterIP 172.30.155.192 <none> 5432/TCP 11m service/nodejs-app ClusterIP 172.30.100.42 <none> 8080/TCP 4m56s NAME READY STATUS RESTARTS AGE pod/my-database-758cf6b9cc-9s64b 1/1 Running 0 16m pod/nodejs-app-1-build 0/1 Completed 0 10m pod/nodejs-app-74975b945f-thkt6 1/1 Running 0 8m35s > oc status Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+ In project nishiooi-dev on server https://api.rm3.7wse.p1.openshiftapps.com:6443 svc/modelmesh-serving (headless) ports 8033, 8008, 8443, 2112 svc/my-database - 172.30.155.192:5432 deployment/my-database deploys istag/my-database:latest deployment #2 running for 11 minutes - 1 pod deployment #1 deployed 11 minutes ago svc/nodejs-app - 172.30.100.42:8080 deployment/nodejs-app deploys istag/nodejs-app:latest <- bc/nodejs-app source builds https://github.com/openshift/nodejs-ex on openshift/nodejs:20-ubi9 deployment #2 running for 3 minutes - 1 pod deployment #1 deployed 5 minutes ago 2 infos identified, use 'oc status --suggest' to see details. -
oc statusコマンドの出力に「2 infos identified, use 'oc status --suggest' to see details.」という文が見えるので詳細を確認。どうやらliveness probeがデフォルトで設定されておらず、手動で定義する必要があったようです。> oc status --suggest Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+ In project nishiooi-dev on server https://api.rm3.7wse.p1.openshiftapps.com:6443 svc/modelmesh-serving (headless) ports 8033, 8008, 8443, 2112 svc/my-database - 172.30.155.192:5432 deployment/my-database deploys istag/my-database:latest deployment #2 running for 23 minutes - 1 pod deployment #1 deployed 23 minutes ago svc/nodejs-app - 172.30.100.42:8080 deployment/nodejs-app deploys istag/nodejs-app:latest <- bc/nodejs-app source builds https://github.com/openshift/nodejs-ex on openshift/nodejs:20-ubi9 deployment #2 running for 15 minutes - 1 pod deployment #1 deployed 16 minutes ago Info: * deployment/my-database has no liveness probe to verify pods are still running. try: oc set probe deployment/my-database --liveness ... * deployment/nodejs-app has no liveness probe to verify pods are still running. try: oc set probe deployment/nodejs-app --liveness ... - liveness probeを設定。
> oc set probe deployment/my-database --liveness --open-tcp=5432 --initial-delay-seconds=30 --timeout-seconds=3 > oc set probe deployment/nodejs-app --liveness --get-url=http://:8080/ --initial-delay-seconds=30 --timeout-seconds=3 - 設定ができたか確認。
> oc describe deployment/my-database Name: my-database (略) Pod Template: Labels: deployment=my-database Annotations: openshift.io/generated-by: OpenShiftNewApp Containers: my-database: Image: centos/postgresql-10-centos7@sha256:f826fcb2983eef2c49e9e9a9d9d61ab403254b50cff85a7caa949fd8474fd558 Port: 5432/TCP Host Port: 0/TCP Liveness: tcp-socket :5432 delay=30s timeout=3s period=10s #success=1 #failure=3 (略) > oc describe deployment/nodejs-app Name: nodejs-app (略) Pod Template: Labels: deployment=nodejs-app Annotations: openshift.io/generated-by: OpenShiftNewApp Containers: nodejs-app: Image: image-registry.openshift-image-registry.svc:5000/nishiooi-dev/nodejs-app@sha256:ffa6078bf399868860b83e40b8adcef9c80c3b1051a02c7f9b657ba3169b10e0 Port: 8080/TCP Host Port: 0/TCP Liveness: http-get http://:8080/ delay=30s timeout=3s period=10s #success=1 #failure=3 (略) > oc status Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+ In project nishiooi-dev on server https://api.rm3.7wse.p1.openshiftapps.com:6443 svc/modelmesh-serving (headless) ports 8033, 8008, 8443, 2112 svc/my-database - 172.30.155.192:5432 deployment/my-database deploys istag/my-database:latest deployment #3 running for 3 minutes - 1 pod deployment #2 deployed about an hour ago deployment #1 deployed about an hour ago svc/nodejs-app - 172.30.100.42:8080 deployment/nodejs-app deploys istag/nodejs-app:latest <- bc/nodejs-app source builds https://github.com/openshift/nodejs-ex on openshift/nodejs:20-ubi9 deployment #3 running for 3 minutes - 1 pod deployment #2 deployed about an hour ago deployment #1 deployed about an hour ago View details with 'oc describe <resource>/<name>' or list resources with 'oc get all'. - ルートを表示しましたが、存在しません。oc exposeをします。
> oc get route No resources found in nishiooi-dev namespace. > oc get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE modelmesh-serving ClusterIP None <none> 8033/TCP,8008/TCP,8443/TCP,2112/TCP 98m my-database ClusterIP 172.30.144.92 <none> 5432/TCP 23m nodejs-app ClusterIP 172.30.233.24 <none> 8080/TCP 22m > oc expose svc/nodejs-app route.route.openshift.io/nodejs-app exposed - ルートをもう一度表示して、
HOST/PORTに表示されているURLからWebアプリにアクセス。今回の例だとnodejs-app-nishiooi-dev.apps.rm3.7wse.p1.openshiftapps.comをブラウザのURLに貼り付ける。> oc get route NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD nodejs-app nodejs-app-nishiooi-dev.apps.rm3.7wse.p1.openshiftapps.com nodejs-app 8080-tcp None - アプリでCRUD操作もできることを確認。
- 作成したリソースを削除し、
service/modelmesh-serving以外全部消えていることを確認。(※本来ならoc new-appコマンドで作成されたアプリリソースはodo app delete <application_name>コマンドで削除することができます。Sandbox環境ではodoコマンドが使えないので、oc deleteコマンドでそれぞれ削除しています。)> oc delete is/my-database deploy/my-database svc/my-database imagestream.image.openshift.io "my-database" deleted deployment.apps "my-database" deleted service "my-database" deleted > oc delete is/nodejs-app bc/nodejs-app deploy/nodejs-app svc/nodejs-app route/nodejs-app imagestream.image.openshift.io "nodejs-app" deleted buildconfig.build.openshift.io "nodejs-app" deleted deployment.apps "nodejs-app" deleted service "nodejs-app" deleted route.route.openshift.io "nodejs-app" deleted > oc get is,bc,deploy,svc,route,po NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/modelmesh-serving ClusterIP None <none> 8033/TCP,8008/TCP,8443/TCP,2112/TCP 131m
あとがき
今回はOpenshiftのSandbox環境を立ち上げ、oc new-app <GitHubのURL>コマンドを使って素早くアプリがデプロイできることを試しました。
下記に実際のocコマンドだけをまとめたので、細かいエラーなどは気にせずとにかくぱぱっと進めてみたいという方はこちらをご確認ください。
ocコマンドだけまとめ
# ログイン
> oc login --token=sha256~XXX --server=https://api.rm3.7wse.p1.openshiftapps.com:6443
# デプロイと、必要な設定の追加
> oc new-app -e POSTGRESQL_USER=luke -e POSTGRESQL_PASSWORD=secret -e POSTGRESQL_DATABASE=my_data centos/postgresql-10-centos7 --name=my-database
> oc new-app nodejs https://github.com/openshift/nodejs-ex --name=nodejs-app
> oc set probe deployment/my-database --liveness --open-tcp=5432 --initial-delay-seconds=30 --timeout-seconds=3
> oc set probe deployment/nodejs-app --liveness --get-url=http://:8080/ --initial-delay-seconds=30 --timeout-seconds=3
# ルートの確認
> oc get route
# デプロイしたリソースを削除
> oc delete is/my-database deploy/my-database svc/my-database
> oc delete is/nodejs-app bc/nodejs-app deploy/nodejs-app svc/nodejs-app route/nodejs-app
> oc get is,bc,deploy,svc,route,po
パイプラインについて
本当は今回、アプリに対してパイプラインを構築し、Gitリポジトリ内に変更があると自動でそれが反映される、、、というようなことも確認したかったのですが、Sandbox環境の制約でパイプラインがうまく構築できなかったので見送りとしました。
もし気になる方は以下▼を見ていただけると嬉しいです!
Pipelineの内容
今回構築したかったパイプラインは以下のようなTask構成を予定していました。
git-clone→s2iorbuidah→openshift-client
参考にしたページはこちらです。
openshift/pipelines-tutorial: A step-by-step tutorial showing OpenShift Pipelines
結論から言うと、s2iとbuidahのタスクがどっちも、権限が足りずできませんでした。
- まず
s2iタスクを使ったパイプラインを実行しましたが、エラーが出て、buildタスクの途中で失敗していました。cloneタスクは無事に成功したようでした。 - 調べているうちに
s2iタスクはサービスアカウントに特権コンテナの実行を許可する必要があるらしいことがわかりました。
s2i - Tekton Hub よりIf you are running on OpenShift, you also need to allow the service account to run privileged containers because OpenShift does not allow containers run as privileged containers by default unless explicitly configured, due to security considerations.(OpenShift 上で実行している場合は、セキュリティ上の理由から、明示的に構成しない限り、OpenShift ではデフォルトでコンテナーを特権コンテナーとして実行できないため、サービスアカウントに特権コンテナーの実行を許可する必要があります。)
- サービスアカウントを作成し、権限を付与しようとしましたが、「
Error from server (Forbidden): clusterrolebindings.rbac.authorization.k8s.io "system:openshift:scc:privileged" is forbidden: User "nishiooi" cannot get resource "clusterrolebindings" in API group "rbac.authorization.k8s.io" at the cluster scope」というエラーが出て、Sandbox環境の権限上の制約がある以上、どうしても特権コンテナの実行許可は出せなさそうだとわかりました。 - また調べていると、
buildahタスクは特に特権コンテナの言及がなかったので、buildahに切り替えてpipelineを構築してみました。
buildah - Tekton Hub -
buildahタスクでもs2iタスクと同様のエラーが出てしまいうまく解決できず、今回は諦めることにしました。
またいつか挑戦してみたいと思います。
ここまでご覧いただきありがとうございました!