IBM Cloud Shell で新しいバージョンの oc を利用する

以前 IBM Cloud Shell で導入済みの kubectl とは異なるバージョンの kubectl を利用する方法を紹介しました。

https://qiita.com/masaffff/items/08fa7a514dfe60620fd1

今回は同じようにIBM Cloud Shellで別のバージョンの oc コマンドを利用する方法を紹介します。基本的な流れは kubectl の時と同様です。新しいバージョンの oc モジュールをダウンロードし、環境変数を通して利用するだけです。
ただし、 oc バージョン 4.16 以降はベースになる OS が Red Hat Enterprise Linux 9 となっており、その点は注意が必要でした。記事執筆時の Cloud Shell 環境は Red Hat Enterprise Linux 8 をベースとしている模様です。

<h2>IBM Cloud Shell に導入済みの oc</h2>

[IBM Cloud](https://cloud.ibm.com) にログインして [Cloud Shell](https://cloud.ibm.com/shell) にアクセスします。

早速導入されている oc について確認します。v4.13.15 が導入されていることが確認できます。
```
USER@cloudshell:~$ oc version --client=true --output=yaml
clientVersion:
  buildDate: "2023-09-18T22:51:58Z"
  compiler: gc
  gitCommit: 17b7accf8fd25125ce015cf4bea7d3cd3f336317
  gitTreeState: clean
  gitVersion: 4.13.0-202309181427.p0.g17b7acc.assembly.stream-17b7acc
  goVersion: go1.19.10 X:strictfipsruntime
  major: ""
  minor: ""
  platform: linux/amd64
kustomizeVersion: v4.5.7
releaseClientVersion: 4.13.15
```

<h2>新しいバージョンの oc をダウンロードする</h2>

インストール済みの oc を上書きすることはできないので、別の場所に導入してパスを通して利用します。
新しいバージョンの oc のモジュールをダウンロードし、実行できるようにします。いくつかのやり方が考えられますが、oc コマンドの実行時に新しいバージョンが実行されるようにします。
新しいモジュールをダウンロードし、実行用のパーミッションを与え、環境変数にカレントディレクトリを追加します。

<h3>oc version 4.12, 4.14, 4.15を利用したい場合</h3>

oc クライアントのレポジトリの安定バージョンが配置されているディレクトリ [4.12](https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.12/) [4.14](https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.14/) [4.15](https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.15/)にある openshift-client-linux.tar.gz をダウンロードして展開します。
```4.12
curl -LO "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.12/openshift-client-linux.tar.gz"
```
```4.14
curl -LO "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.14/openshift-client-linux.tar.gz"
```
```4.15
curl -LO "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.15/openshift-client-linux.tar.gz"
```

<h3>oc version 4.16, 4.17を利用したい場合</h3> (以降のバージョンもしばらくこちらの方法で利用できるはず)

oc クライアントのレポジトリの安定バージョンが配置されているディレクトリ [4.16](https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.16/) [4.17](https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.17/) にある openshift-client-linux-amd64-rhel8-<バージョン>.tar.gz をダウンロードして展開します。
バージョン4.15までと同じように openshift-client-linux.tar.gz という名称のファイルが存在するのですが、これはベースの OS が RHEL9 となっており、Cloud Shell 環境では稼働させるとエラーが発生します。いずれ Cloud Shell 環境が RHEL9 で稼働するようになった場合には openshift-client-linux.tar.gz をダウンロードして利用すればよいはずです。

```4.16
curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.16/openshift-client-linux-amd64-rhel8-$(curl -sS "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.16/release.txt" | grep "Name:" | grep -o '[3-9]\.[0-9]*\.[0-9]*').tar.gz
```

```4.17
curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.17/openshift-client-linux-amd64-rhel8-$(curl -sS "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.17/release.txt" | grep "Name:" | grep -o '[3-9]\.[0-9]*\.[0-9]*').tar.gz
```

<h2>ダウンロードした新しいバージョンの oc を実行できるようにする</h2>

kubectlのときとは異なり、ダウンロードしたモジュールは圧縮されています。これを解凍し、環境変数に解凍先のパスを追加します。

まずダウンロードしたファイル名を確認します。
```
USER@cloudshell:~$ ls -la
total 67272
drwxr-sr-x 3 USER  user     4096 Dec  2 05:07 .
drwxr-xr-x 1 root  root     4096 Dec  2 03:21 ..
-rw-r--r-- 1 USER  user      219 Dec  2 03:21 .bash_logout
-rw-r--r-- 1 USER  user     3902 Dec  2 03:21 .bashrc
drwxr-sr-x 3 USER  user     4096 Dec  2 03:22 .npm
-rw------- 1 USER  user       14 Dec  2 04:38 .npmrc
-rw-r--r-- 1 USER  user      998 Dec  2 03:21 .profile
-rw-rw-r-- 1 USER  user 68851661 Dec  2 05:06 openshift-client-linux-amd64-rhel8-4.17.5.tar.gz
```
ファイルを解凍し、環境変数とパーミッションを確認し、環境変数の方にカレントディレクトリを追加します。


```
USER@cloudshell:~$ tar xvf openshift-client-linux-amd64-rhel8-4.17.5.tar.gz
README.md
oc
kubectl
USER@cloudshell:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/usr/local/istio/bin:/opt/gradle/gradle-6.0.1/bin:/opt/ant/bin:/opt/maven/bin
USER@cloudshell:~$ ls -la
total 392516
drwxr-sr-x 3 USER  user      4096 Dec  2 05:10 .
drwxr-xr-x 1 root  root      4096 Dec  2 03:21 ..
-rw-r--r-- 1 USER  user       219 Dec  2 03:21 .bash_logout
-rw-r--r-- 1 USER  user      3902 Dec  2 03:21 .bashrc
drwxr-sr-x 3 USER  user      4096 Dec  2 03:22 .npm
-rw------- 1 USER  user        14 Dec  2 04:38 .npmrc
-rw-r--r-- 1 USER  user       998 Dec  2 03:21 .profile
-rw-r--r-- 1 USER  user       950 Oct 25 05:27 README.md
-rwxr-xr-x 2 USER  user 166519320 Oct 25 05:27 kubectl
-rwxr-xr-x 2 USER  user 166519320 Oct 25 05:27 oc
-rw-rw-r-- 1 USER user  68851661 Dec  2 05:06 openshift-client-linux-amd64-rhel8-4.17.5.tar.gz
USER@cloudshell:~$ export PATH=~:$PATH
USER@cloudshell:~$ echo $PATH
/home/USER:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/usr/local/istio/bin:/opt/gradle/gradle-6.0.1/bin:/opt/ant/bin:/opt/maven/bin
USER@cloudshell:~$ which oc
~/oc
```


<h2> 新しい oc のバージョンを確認する </h2>
oc のバージョンを確認すると、執筆時における最新の安定版である v4.17.5 が利用されていることがわかります。実際にはELSの4.14や4.16を使用したいケースが多いかもしれませんが、同様に新しいバージョンを導入できたことが確認できていることと思います。


```
USER@cloudshell:~$ oc version --client=true --output=yaml
clientVersion:
  buildDate: "2024-10-25T05:26:15Z"
  compiler: gc
  gitCommit: dde885f94df59c4816acc36814ffec3b55d4a1ca
  gitTreeState: clean
  gitVersion: 4.17.0-202410241236.p0.gdde885f.assembly.stream.el9-dde885f
  goVersion: go1.22.7 (Red Hat 1.22.7-1.module+el8.10.0+22325+dc584f75) X:strictfipsruntime
  major: ""
  minor: ""
  platform: linux/amd64
kustomizeVersion: v5.0.4-0.20230601165947-6ce0bf390ce3
releaseClientVersion: 4.17.5
```

<h2>まとめ</h2>
これも繰り返しになりますが、 Cloud Shell はセッションが終了すると環境が維持されないので、起動のたびに新しいバージョンに置き換える必要があります。多少面倒ですが必要なバージョンのツールを都度用意しましょう。

各マイナーバージョンに対応した 安定版 oc を導入して使用するには以下のコマンドを実行します。


```4.12
curl -LO "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.12/openshift-client-linux.tar.gz"
tar xvf openshift-client-linux.tar.gz
export PATH=~:$PATH
```
```4.13 (記事執筆時点ではデフォルトバージョンなので独自にDLする必要はない)
curl -LO "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.13/openshift-client-linux.tar.gz"
tar xvf openshift-client-linux.tar.gz
export PATH=~:$PATH
```
```4.14
curl -LO "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.14/openshift-client-linux.tar.gz"
tar xvf openshift-client-linux.tar.gz
export PATH=~:$PATH
```
```4.15
curl -LO "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.15/openshift-client-linux.tar.gz"
tar xvf openshift-client-linux.tar.gz
export PATH=~:$PATH
```
```4.16
curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.16/openshift-client-linux-amd64-rhel8-$(curl -sS "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.16/release.txt" | grep "Name:" | grep -o '[3-9]\.[0-9]*\.[0-9]*').tar.gz
tar xvf openshift-client-linux-amd64-rhel8-$(curl -sS "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.16/release.txt" | grep "Name:" | grep -o '[3-9]\.[0-9]*\.[0-9]*').tar.gz
export PATH=~:$PATH
```
```4.17
curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.17/openshift-client-linux-amd64-rhel8-$(curl -sS "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.17/release.txt" | grep "Name:" | grep -o '[3-9]\.[0-9]*\.[0-9]*').tar.gz
tar xvf openshift-client-linux-amd64-rhel8-$(curl -sS "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.17/release.txt" | grep "Name:" | grep -o '[3-9]\.[0-9]*\.[0-9]*').tar.gz
export PATH=~:$PATH
```


<h2>参考資料</h2>

[IBM Cloud Docs インストール済みのプラグインとツール](https://cloud.ibm.com/docs/cloud-shell?topic=cloud-shell-plugins-tools&locale=ja)

バージョン 4.16 での oc 導入時に見られるエラー
[oc command fails due to missing glibc library](https://access.redhat.com/solutions/7077895)