OpenShift のこと Web ブラウザで全部やってみる


この記事は [OpenShift Advent Calender 2022](https://qiita.com/advent-calendar/2022/openshift) の 15 日目の記事です。

OpenShift の Web Console、便利ですよね。[『OpenShift は GUI でもつ』ー OpenShift Web Console のヒミツ](https://rheb.hatenablog.com/entry/openshift-gui-maniac) でもその便利さが紹介されていました。  
バージョンが上がっていくたび便利になっていて、個人的には v4.11 で [ダークモード](https://docs.openshift.com/container-platform/4.11/release_notes/ocp-4-11-release-notes.html#ocp-4-11-dark-mode) に対応したのも推しポイントです。

# でもやっぱり CLI でやりたくなるよね？

はい、なります。 CLI での操作に慣れてると GUI で作業するより早いですし、ちょっと複雑な作業やトラブルシューティングしようと思うと `kubectl` や `oc` コマンド使いたくなりますよね。

なので普通は CLI を使えるようローカル環境にクライアントツールをダウンロードすることになりますが、バージョンの異なる複数のクラスタを管理してるような場合、ぼくみたいなものぐさは対象の OpenShift クラスタに合わせて CLI ツールのバージョン切り替えをするのが面倒くさかったりします (余談ですが `oc` などの CLI ツールのバージョン切り替えには [asdf](https://asdf-vm.com/) がおすすめです)。  
また、たまたまローカル環境が整ってない PC で一時的にクラスタの操作をしたい場合など、いちいちローカル環境を整える所から始めなければならないのはやはり面倒ですよね。全部 Web ブラウザで完結できたら楽です。

# そんなときには Web Terminal

実は OpenShift には [Web Terminal Operator](https://docs.openshift.com/container-platform/4.11/web_console/odc-about-web-terminal.html) というものがあり、これを OperatorHub からインストールすることで OpenShift Web Console 上から CLI が利用できちゃうのです。  
CLI が Web ブラウザ上から利用できるので、まさにこの記事のタイトルどおり、「OpenShift のこと Web ブラウザで全部」やれます。  

Web Terminal を利用するには OperatorHub から `Web Terminal` と検索し、 Web Terminal Operator をインストールします。

![install-web-terminal-operator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193568/ad073933-b7d2-6cc7-6756-5e50df8c5524.png)

Operator のインストール完了後ブラウザを Reload し、右上に Web Terminal を起動するアイコン 
![terminal-icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193568/46376e52-18e5-e672-9020-208daf9b3e86.png)
が表示されたら Web Terminal を利用できる状態になっています。

![menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193568/a1f26011-4b56-7747-43e3-9c09380ba8cc.png)

# Web Terminal の使い方

Web Terminal のアイコンをクリックすると Web Console の下部に Command line terminal ペインが表示されます。  
Web Console にログインしたユーザが cluster-admin 権限を持つ場合、`openshift-terminal` Namespace 上に Web Terminal を提供する Pod が起動し、しばらく待つと以下のように Terminal 上でコマンドが実行できるようになります。  
cluster-admin 権限を持たないユーザで Web Terminal を起動した場合、最初に Namespace の選択を促す画面が表示され、選択した Namespace 上で Terminal Pod が起動します。

![terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193568/5bba6054-425d-1bee-fa45-3a8df9952a64.png)


ではさっそく Web Terminal を使ってみましょう。

`Type "help" for a list of installed CLI tools` とあるので、まずは `help` と打ってみて利用できる CLI ツールを確認してみます。

```
bash-4.4 ~ $ help
Installed tools:
Command    Version    Name
oc         4.11.2     OpenShift CLI
kubectl    v1.24.1    Kubernetes CLI
kustomize  4.5.7      Kustomize CLI
helm       3.9.0      Helm CLI
kn         1.3.1      KNative CLI
tkn        0.24.0     Tekton CLI
subctl     0.13.0     Submariner CLI
odo        v2.5.1     Red Hat OpenShift Developer CLI
rhoas      0.50.0     Red Hat OpenShift Application Services CLI
virtctl    0.56.0     KubeVirt CLI
jq         1.6        jq

To customize this terminal, see 'wtoctl'
```

なるほど、 `oc` や `kubectl` はもちろん `kustomize` や `helm` といった Kubernetes マニフェストのテンプレートツール、OpenShift Pipelines (Tekton) の CLI ツールである `tkn` など特定の機能向けツールに加え `jq` もデフォルトで利用できるようになっていますね。便利。  
また、特に意識せずとも対象の OpenShift クラスタのバージョン互換の CLI ツールが利用できるようになっています。

help には記載されていませんが、 `vim` や `nano` などのエディタや `git`, `tar`, `curl` など一通りのことをやれるツールはインストール済みとなっています。

試しに `oc get pod` で現在の Namespace で起動している Pod の情報を表示してみます。

```
bash-4.4 ~ $ oc get pod
NAME                                         READY   STATUS    RESTARTS   AGE
workspace5eb6c15861ea4375-65f997dd78-rltkk   2/2     Running   0          32m
```

`oc login` によるユーザ認証を行っていないにもかかわらず Pod の情報が表示できました。  
`oc config get-contexts` を実行するとわかりますが、 Web Terminal では Web Console にログインしたユーザで自動的にログインを行ってくれるようになっています。 Terminal を起動するたびいちいちログインする必要がないのは地味にありがたいですね。  
また、各コマンドの Tab 補完も有効化された状態になっており、最初から補完が効くようになっています。

```
bash-4.4 ~ $ oc config get-contexts 
CURRENT   NAME               CLUSTER                  AUTHINFO   NAMESPACE
*         kshiraka-context   https://172.30.0.1:443   kshiraka   openshift-terminal
```

さらに、 v4.11 からは [複数タブ](https://docs.openshift.com/container-platform/4.11/release_notes/ocp-4-11-release-notes.html#ocp-4-111-developer-perspective) に対応しており、 Web Terminal 上で複数のセッションを起動できるようになっています。  
Command line terminal ペインの上部の `+` を押すことでタブを追加できます。

![terminal-tab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193568/40f9ca07-a11e-fa6f-f981-fdbe918c1d32.png)

# Web Terminal のカスタマイズ

このようにデフォルトのままでもある程度のユースケースには対応出来そうな Web Terminal ですが、 Web Terminal に含まれてないツールを使いたい場合ももちろんあると思います。
試しにコンテナイメージとイメージリポジトリの操作、検査、署名、転送を行う Skopeo のインストールを Web Terminal 上で試みてみます。

Web Terminal を起動するコンテナイメージは [`ubi-minimal`](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/con_understanding-the-ubi-minimal-images_assembly_types-of-container-images) という名前の Red Hat が提供する [Universal Base Image : UBI](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/con_characteristics-of-ubi-images_assembly_types-of-container-images) の最小イメージをベースイメージとしており、通常のパッケージマネージャは利用できず `microdnf` コマンドによりパッケージのインストールを行います。

```
bash-4.4 ~ $ microdnf install skopeo
error: Failed to create: /var/cache/yum/metadata
```

Web Terminal 上で `microdnf install skopeo` を実行してみましたが、エラーとなりました。これはコンテナ上で `microdnf` を root 権限で実行できないためです。どうやら別の方法を考える必要がありそうです。

そういえば `help` を実行した際に `To customize this terminal, see 'wtoctl'` というメッセージが表示されていました。  
この `wtoctl` というコマンドを実行してみましょう。

```
bash-4.4 ~ $ wtoctl
wtoctl is a simple tool for customizing Web Terminals in OpenShift intended to
be used within a running terminal instance.

Configurable fields:
  * image   - the image used for the terminal
  * timeout - the time a Web Terminal may be idle before it is terminated

Available commands:
  * get   - get the current value for a field
  * set   - set the current value for a field
  * reset - reset a field to its default value

Usage:
  wtoctl <command> [options]

Use wtoctl <command> --help for more information about a given command.
Use wtoctl <field> --help for more information about a given field.

To reset all changes and return to a default terminal, execute
  oc delete devworkspace terminal-53jgvl --namespace openshift-terminal
and restart the Web Terminal
```

```
bash-4.4 ~ $ wtoctl image
The image field defines which container image is used to run the Web Terminal.
By default, an image containing common cluster tooling is used, but this can be
extended or replaced with a custom built image to include additional tools or
configuration.

It is recommended to extend the default image (see 'wtoctl get image') when
building a custom tooling image to ensure configuration is correct.

If a misconfigured image is used, the Web Terminal may fail to restart. If this
occurs, the Web Terminal custom resource should be deleted by executing
  oc delete devworkspace terminal-53jgvl --namespace openshift-terminal
```

どうやら `wtoctl get image` で現在使用している Web Terminal のコンテナイメージの情報を取得でき、それをベースイメージとして `microdnf install skopeo` したコンテナイメージを作成後、カスタマイズしたコンテナイメージを指定して `wtoctl set image <image-name>` を実行することで Web Terminal を起動するコンテナイメージを Skopeo インストール済みのイメージに差し替えることができそうです。

```
bash-4.4 ~ $ wtoctl get image
Current image is registry.redhat.io/web-terminal/web-terminal-tooling-rhel8@sha256:b76c2ea5ec2a70c4f9e0e5509b1857f112dece547bc0076feaa3b1782f769bbc
```

ベースとするべきイメージがわかったので、これをベースイメージとして以下のような Dockerfile を作成します。

```Dockerfile
FROM registry.redhat.io/web-terminal/web-terminal-tooling-rhel8@sha256:b76c2ea5ec2a70c4f9e0e5509b1857f112dece547bc0076feaa3b1782f769bbc
USER 0

RUN microdnf install -y \
    # install skopeo
    skopeo && \
    microdnf -y clean all

USER 1001
```

`podman` を使ってコンテナイメージをビルド、イメージレジストリにプッシュします。

```
$ podman build -t quay.io/kshiraka/custom-web-terminal-skopeo:latest .
$ podman push quay.io/kshiraka/custom-web-terminal-skopeo:latest
```

`wtoctl set image` で Web Terminal に使用するコンテナイメージをカスタムイメージに差し替えます。

```
bash-4.4 ~ $ wtoctl set image quay.io/kshiraka/custom-web-terminal-skopeo:latest
Warning: resource devworkspaces/terminal-vmt6yu is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
devworkspace.workspace.devfile.io/terminal-vmt6yu configured
Updated Web Terminal image to quay.io/kshiraka/custom-web-terminal-skopeo:latest. Terminal may restart.
```

すると、上記のようなメッセージが出力され Terminal が再起動します。

再起動後の Terminal で `skopeo` コマンドを実行すると、無事実行でき Skopeo がインストールされたコンテナイメージに変更されていることが確認できました。

```
bash-4.4 ~ $ skopeo --version
skopeo version 1.9.3
```

# アプリケーションの開発を考えると Terminal だけではなく IDE が欲しい

はい、わかります。特に OpenShift の Web Terminal の実体はクラスタ上の Pod なので、基本的にアドホックな環境であり一定期間 (デフォルト 15 分) を過ぎるとタイムアウトするため `git clone` したリポジトリなども消えてしまいます。 `wtoctl set timeout` でタイムアウトまでの時間を伸ばすことも可能ですが、これはつらい。

そんなときは [Red Hat OpenShift Dev Spaces](https://developers.redhat.com/products/openshift-dev-spaces/overview) (以前の名前は Codeready Workspaces) や、そのアップストリームの [Eclipse Che](https://www.eclipse.org/che/) を使うことを検討してみましょう。

OpenShift Dev Spaces / Eclipse Che はいわゆる [GitHub Codespaces](https://github.co.jp/features/codespaces) や [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) と同じ Web IDE で、さまざまなアプリケーションを開発するための環境を Web ブラウザから利用できるようにするプロダクトです。

2022/12/13 に GA したばかりの OpenShift Dev Spaces 3.3 では [Microsoft Visual Studio Code の Open Source 版がデフォルトエディタ](https://access.redhat.com/documentation/en-us/red_hat_openshift_dev_spaces/3.3/html-single/release_notes_and_known_issues/index#enhancement-crw-3420) となり、 JetBrains IntelliJ IDEA Community Edition も Tech Preview として利用可能となっているので慣れ親しんだエディタで開発したい人もある程度違和感なく利用できます。  
vscode プラグインにも対応しており、プラグインをインストールすることで [ペアプログラミング](https://access.redhat.com/documentation/en-us/red_hat_openshift_dev_spaces/3.2/html-single/release_notes_and_known_issues/index#enhancement-crw-3182) にも対応しています。

OpenShift Dev Spaces については Advent Calender の他の記事でも紹介されているので興味のある方は見てもらえればと思います。

- [Red Hat OpenShift Dev SpacesとGitLabを使用してプライベートな開発環境をサクッと構築する](https://qiita.com/shishika/items/2604e070f93ffa3f7a1a)
- [VSCodeなどのモダンなエディタでブラウザ上で開発できる開発環境 Red Hat OpenShift Dev Spaces を 無料でもらっちゃおう](https://qiita.com/loftkun/items/276e115680e75fe23c0c)

これで真の意味で「OpenShift のこと Web ブラウザで全部」できますね。

# Web Terminal Operator はどんな仕組みで動いてるのか

実は Web Terminal も OpenShift Dev Spaces も、また、Web Terminal にもデフォルトでインストールされている [OpenShift Do (odo)](https://odo.dev/) という OpenShift でのアプリケーション開発のための CLI ツールでも、[Devfile](https://devfile.io/) という共通のフォーマットにより構成する環境を定義しています。

Devfile はアプリケーション開発ライフサイクルのさまざまなフェーズで一貫した開発環境を提供することを目指して開発された YAML フォーマットの環境定義ファイルで、CNCF の Sandbox Project となっています。

Web Terminal と OpenShift Dev Spaces はそのバックエンドに Devfile のフォーマットを Kubernetes Custom Resource として解釈する DevWorkspace Operator が動作しており、OpenShift 上で Terminal や Workspace を起動する際に DevWorkspace CR を作成することにより Web Terminal や Workspace の起動を実現しています。

## まとめ

OpenShift の Web Console はバージョンを重ねるごとに高機能になってきており、 Web Terminal Operator や OpenShift Dev Spaces と併せて利用することで Web ブラウザ上でほぼすべての作業が実施できることを紹介してみました。

Web Terminal、地味感ありますが個人的には結構楽しい機能だと思うので、興味があればぜひ自分好みのカスタマイズを楽しんでみてください。