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

IBM Cloud Shell は Web ベースのシェル実行環境で IBM Cloud CLI や いくつかのツールが導入されている環境である。
この環境で IBM Cloud Kubernetes Service や Red Hat OpenShift on IBM Cloud などのマネージド Kubernetes 環境を管理する際に kubectl や oc といったツールを利用することになるが、これらはapiserver のバージョンと +1 から -1 までの間のバージョンを使用しないといけない制約がある。一方で IBM Cloud Shell には少し古いバージョンの kubectl しか導入されていないことがあり、そのような場合に新しいバージョンの kubectl を利用できる手順を整理します。

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

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

早速導入されている kubectl について確認します。v1.22.3 が導入されていることが確認できます。ちょっと古めのバージョンですね。
```
user@cloudshell:~$ kubectl version --client=true --output=yaml
clientVersion:
  buildDate: "2021-10-27T18:41:28Z"
  compiler: gc
  gitCommit: c92036820499fedefec0f847e2054d824aea6cd1
  gitTreeState: clean
  gitVersion: v1.22.3
  goVersion: go1.16.9
  major: "1"
  minor: "22"
  platform: linux/amd64

user@cloudshell:~$ which kubectl
/usr/local/bin/kubectl
```

<h2>新しいバージョンの kubectl を導入する</h2>

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

```
USER@cloudshell:~$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0   2190      0 --:--:-- --:--:-- --:--:--  2190
100 47.5M  100 47.5M    0     0  47.5M      0  0:00:01  0:00:01 --:--:-- 55.1M

USER@cloudshell:~$ ls -la
total 48740
drwxrwxrwx  4 root  root     4096 Nov  7 16:53 .
drwxr-xr-x  1 root  root     4096 Nov  7 16:52 ..
-rw-r--r--  1 USER  user      219 Nov  7 16:52 .bash_logout
-rw-r--r--  1 USER  user     4041 Nov  7 16:52 .bashrc
-rw-rw-r--  1 USER  user 49872896 Nov  7 16:53 kubectl
drwxr-xr-x  3 USER  user     4096 Nov  7 16:52 .npm
-rw-------  1 USER  user       14 Nov  7 16:52 .npmrc
-rw-r--r--  1 USER  user      998 Nov  7 16:52 .profile
drwxr-xr-x 14 USER  user     4096 Nov  7 16:52 .pyenv

USER@cloudshell:~$ chmod 755 kubectl

USER@cloudshell:~$ ls -la
total 48740
drwxrwxrwx  4 root  root     4096 Nov  7 16:53 .
drwxr-xr-x  1 root  root     4096 Nov  7 16:52 ..
-rw-r--r--  1 USER  user      219 Nov  7 16:52 .bash_logout
-rw-r--r--  1 USER  user     4041 Nov  7 16:52 .bashrc
-rwxr-xr-x  1 USER  user 49872896 Nov  7 16:53 kubectl
drwxr-xr-x  3 USER  user     4096 Nov  7 16:52 .npm
-rw-------  1 USER  user       14 Nov  7 16:52 .npmrc
-rw-r--r--  1 USER  user      998 Nov  7 16:52 .profile
drwxr-xr-x 14 USER  user     4096 Nov  7 16:52 .pyenv

USER@cloudshell:~$ echo $PATH
/home/USER/.pyenv/shims:/home/USER/.pyenv/bin:/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:~$ export PATH=~:$PATH

USER@cloudshell:~$ echo $PATH
/home/USER:/home/USER/.pyenv/shims:/home/USER/.pyenv/bin:/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 kubectl
~/kubectl

```

<h2>新しい kubectl のバージョンを確認する</h2>

改めて kubectl のバージョンを確認すると、執筆時における最新の安定版である v1.28.3 が利用されていることがわかります。これで新しいバージョンのクラスターも管理できます。

```
USER@cloudshell:~$ kubectl version --client=true --output=yaml
clientVersion:
  buildDate: "2023-10-18T11:42:52Z"
  compiler: gc
  gitCommit: a8a1abc25cad87333840cd7d54be2efaf31a3177
  gitTreeState: clean
  gitVersion: v1.28.3
  goVersion: go1.20.10
  major: "1"
  minor: "28"
  platform: linux/amd64
kustomizeVersion: v5.0.4-0.20230601165947-6ce0bf390ce3

```

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

最新の安定版kubectlを導入するには以下のコマンドを実行します

```
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod 755 kubectl
export PATH=~:$PATH
```

特定のバージョンのkubectlを導入するには以下のコマンドを実行します。以下はv1.26.10の例です。バージョンの文字列を必要とするバージョンのものに置き換えれば所望のバージョンを導入できます。

```
curl -LO "https://dl.k8s.io/release/v1.26.10/bin/linux/amd64/kubectl"
chmod 755 kubectl
export PATH=~:$PATH
```


<h3>参考文献</h3>

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