Rancher Desktop を始める

この記事は[スタンバイ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/stanby)の5日目の記事です。
昨日は[@ocome](https://qiita.com/ocome)さんの[『SilhouetteからPAC4Jに乗り換えてついでにOpenID Connectを使う』](https://qiita.com/ocome/items/99393a30bcc40871bb50)でした。

この記事ではRancher DesktopをMacにインストールして触ってみた感想を書きます。


# TL;DR

* Rancher Desktopは簡単にインストールできる
* Kubernetesのバージョン切り替えも簡単にできて便利
* nerdctl面白い

# Rancher Desktop とは

OSSのデスクトップアプリケーションで、デスクトップ上でKubernetesの作成管理ができます。
macとwinで動くようですが、M1のmacには[現在非対応](https://github.com/rancher-sandbox/rancher-desktop/blob/main/docs/installing.md)なようです。（執筆時点）

公式：[Rancher Desktop: Kubernetes and container management on the desktop](https://rancherdesktop.io/)

Github：[rancher-sandbox/rancher-desktop: Kubernetes and container management to the desktop](https://github.com/rancher-sandbox/rancher-desktop)


デスクトップでKubernetesを作成できるツールといえば、[Docker Desktop](https://www.docker.com/products/docker-desktop)や[kind](https://kind.sigs.k8s.io/)や[minikube](https://minikube.sigs.k8s.io/docs/)が有名ですが、それらに新たな選択肢が加わりました。

公式を見ると、VM上にcontainerdを動かして、その上にkubernetes環境を作成するようです。


（以下の図は、[Rancher Desktop: Kubernetes and container management on the desktop](https://rancherdesktop.io/)からの引用です。）
![スクリーンショット 2021-11-20 11.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/f035c8da-3a81-542a-9a73-8050bf975bee.png)

# インストールしてみる

では、[公式手順](https://github.com/rancher-sandbox/rancher-desktop/blob/main/docs/installing.md)に従ってインストールしてみましょう！
環境は以下の通りです。

* macOS Big Sur 11.6  
* CPU 2.4 GHz 8コアIntel Core i9 
* MEM 64GB  

## zipファイルのダウンロード

[リリースページ](https://github.com/rancher-sandbox/rancher-desktop/releases)からzipファイルをダウンロードします。

zipを解凍して出てきたファイルを実行します。

![スクリーンショット 2021-11-20 11.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/d9e2049d-a36e-e807-4d0d-366fb08b4000.png)

## アプリケーションの起動

起動するとKubernetesのバージョンを聞かれます。とりあえず執筆時点の最新v1.21.6で行きます。

![スクリーンショット 2021-11-20 11.59.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/7418f631-a75b-833d-6fee-d57fece26a23.png)

初回はイメージのダウンロード等で時間がかかる模様

![スクリーンショット 2021-11-20 12.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/ad1039de-d281-9a45-3a06-4bb904704993.png)

準備完了するとこのようになります。

![スクリーンショット 2021-11-20 12.08.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/07dbb965-a0ed-a622-6389-c9e07a0308f6.png)

この段階でローカルの `~/.kube/config`にRancher Desktopのコンテンツが追記され、向き先も変更されています。

```shell
$ kubectl config current-context
rancher-desktop
```

# 触ってみる

## 起動直後の状態

nodeは1つ

```shell
$ kubectl get node -A
NAME                   STATUS   ROLES                          AGE   VERSION
lima-rancher-desktop   Ready    builder,control-plane,master   22m   v1.21.6+k3s1
```

Podは以下の通り、まあ普通ですね（普通とは）

```shell_session
$ kubectl get pod -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   local-path-provisioner-5ff76fc89d-nb74z   1/1     Running     0          22m
kube-system   metrics-server-86cbb8457f-pmg5f           1/1     Running     0          22m
kube-system   coredns-7448499f4d-7scfw                  1/1     Running     0          22m
kube-system   helm-install-traefik-crd-skdgx            0/1     Completed   0          22m
kube-system   svclb-traefik-68c5m                       2/2     Running     0          22m
kube-system   helm-install-traefik-lxpmd                0/1     Completed   1          22m
kube-system   traefik-97b44b794-xzrkz                   1/1     Running     0          22m
kube-image    builder-jwbd4                             2/2     Running     0          21m
```

## Kubernetesのバージョンを切り替える

Rancher Desktopの特徴として、「kubernetesのバージョンを簡単に切り替えられる」というのがあります。
コンソールから選択するだけです。

![スクリーンショット 2021-11-20 13.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/92f49ac2-d012-e471-45df-1e91c5d373d7.png)

試しに、v1.21.6からv1.20.6にしてみます。選択してしばらく待つだけで簡単に切り替わります。

![スクリーンショット 2021-11-20 13.16.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/c5f0acb5-233c-347d-896e-d8ea66dc164f.png)


```bash
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:34:20Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.6+k3s1", GitCommit:"df033fa248bc2c9f636e4c0ff2b782cb8edbbf10", GitTreeState:"clean", BuildDate:"2021-11-04T00:25:14Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/amd64"}
## 変更後
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:34:20Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.6+k3s1", GitCommit:"8d0432824a9fd9474b67138b7630c33f285d332f", GitTreeState:"clean", BuildDate:"2021-04-16T19:04:44Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}
WARNING: version dif

```

これはアップデートの検証に便利そうですね。


## Kubernetes環境をリセットする

『あーもう！1回環境消しちゃいたい！』そんな時ありませんか？

コンソールからボタン1つで環境をリセットできます。

![スクリーンショット 2021-11-20 13.43.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/1011bd07-789d-2572-2866-19b78f438425.png)

## nerdctlを使う

[ドキュメント](https://github.com/rancher-sandbox/rancher-desktop/blob/main/docs/images.md)を読むとこんな一文があります。

> Rancher Desktop provides the ability to build, push, and pull images via the NERDCTL project.
Note, nerdctl is put into the path automatically. This occurs during the installer on Windows, and upon first run on macOS.

（意訳：Rancher DesktopはNERDCTLを使ってイメージのbuild/push/pull機能を提供するよ。nerdctlは自動で入ってpathも通ってるよ。これはWinはインストーラがやって、macはアプリの初回起動時に行われるよ）

nerdctlはcontainerd向けに作られた、コンテナの操作ツールです。containerd用のdockerコマンドと考えてください。（公式：[containerd/nerdctl: contaiNERD CTL - Docker-compatible CLI for containerd, with support for Compose](https://github.com/containerd/nerdctl)）

nerdctlはdockerコマンドと同じUI/UXを考えて作られています。試しにnginxコンテナを動かしてみましょう。

```bash
$ nerdctl run -d -p 9999:80 nginx
55e7859991c3c9de0fc17b0e07bad7a0abb6d3819a68e9a32d937e19ca3eda11
```

起動を確認してみましょう。ブラウザには親の顔より見た画面が。

![スクリーンショット 2021-11-20 14.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/6334cca6-c2a9-ce7d-41ef-0e7b33b9fc95.png)

nerdctlコマンドでコンテナの状態を確認。

```bash
$ nerdctl ps
CONTAINER ID    IMAGE                             COMMAND                   CREATED           STATUS    PORTS                   NAMES
55e7859991c3    docker.io/library/nginx:latest    "/docker-entrypoint.…"    15 minutes ago    Up        0.0.0.0:9999->80/tcp
```

dockerコマンドでは起動を確認できません。

```bash
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

nerdctlにはnamespaceの概念があり、今回の環境では以下のようなnamespaceができてます。

```bash
$  nerdctl namespace list
NAME        CONTAINERS    IMAGES    VOLUMES
buildkit    0             0         0
default     1             1         0
k8s.io      19            22        0
```

先ほど作ったnginxは`default`というnamespaceにいます。

```bash
$ nerdctl  --namespace default ps
CONTAINER ID    IMAGE                             COMMAND                   CREATED           STATUS    PORTS                   NAMES
55e7859991c3    docker.io/library/nginx:latest    "/docker-entrypoint.…"    30 minutes ago    Up        0.0.0.0:9999->80/tcp
```

`k8s.io`というnamespaceには、Rancher Desktopで作成したKubernetesのコンテナ群が見えます。

```bash
$ nerdctl  --namespace k8s.io ps
CONTAINER ID    IMAGE                                                                      COMMAND                   CREATED              STATUS    PORTS    NAMES
0a3c6883ef0f    sha256:897ce3c5fc8ff8b1ad4fe1e74f725a0942e8e1dad0ee09096cfa7320da889a53    "entry"                   About an hour ago    Up
132e0235d9d4    docker.io/rancher/kim:v0.1.0-beta.6                                        "kim --debug agent -…"    About an hour ago    Up
1bb39f3b47db    sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e    "/pause"                  About an hour ago    Up
1fc1dd02eec4    sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e    "/pause"                  About an hour ago    Up
2dfc58bc1d60    sha256:897ce3c5fc8ff8b1ad4fe1e74f725a0942e8e1dad0ee09096cfa7320da889a53    "entry"                   About an hour ago    Up
387247a2f4eb    sha256:148c19256271909650fb514430c86606775bedaafc30e9fb6af6faad5adf1086    "local-path-provisio…"    About an hour ago    Up
6bfb954aa0f8    docker.io/moby/buildkit:v0.8.3                                             "buildkitd --addr=un…"    About an hour ago    Up
80d7c860bbe3    sha256:aa764f7db3051ee79467eeef28fe6a5f0667ae8af7bd6ead61f9b0ae3d8f638e    "/traefik --configfi…"    About an hour ago    Up
8a030c048cf3    sha256:9dd718864ce61b4c0805eaf75f87b95302960e65d4857cb8b6591864394be55b    "/metrics-server"         About an hour ago    Up
8e72c8c144d6    sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e    "/pause"                  About an hour ago    Up
901b1d009b36    sha256:296a6d5035e2d6919249e02709a488d680ddca91357602bd65e605eac967b899    "/coredns -conf /etc…"    About an hour ago    Up
a35a26ee3aab    sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e    "/pause"                  About an hour ago    Up
d526c08cb6e8    sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e    "/pause"                  About an hour ago    Up
f138ceae1e3e    sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e    "/pause"                  About an hour ago    Up
```

## helmを使ったデプロイ

Rancher Desktopにはhelmも入ってるので、helmを使ってアプリケーションをKubernetesにデプロイしてみます。

```bash
$ helm repo add bitnami https://charts.bitnami.com/bitnami                                                                                                               
"bitnami" has been added to your repositories

$ helm install wp bitnami/wordpress
NAME: wp
LAST DEPLOYED: Sat Nov 20 14:44:06 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 12.2.0
```

helmで確認

```
$ helm ls                                                                                                                                                                
NAME	NAMESPACE	REVISION	UPDATED                             	STATUS  	CHART           	APP VERSION
wp  	default  	1       	2021-11-20 14:44:06.851363 +0900 JST	deployed	wordpress-12.2.0	5.8.2
```

kubectlで確認

```bash
$ kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
svclb-wp-wordpress-qp6pz        0/2     Pending   0          4m11s
wp-mariadb-0                    1/1     Running   0          4m11s
wp-wordpress-7cf6dbc45f-42d45   1/1     Running   0          4m11s

```
このように内蔵されているnerdctlやhelmでアプリケーションの開発やデプロイが行えます。

# 感想など

* Racher Desktopはまだv0.6だけど、荒削り感はない
* kubernetesのバージョンを簡単に切り替えられるのは便利
* [Docker Desktopが一部有料化](https://www.publickey1.jp/blog/21/docker_desktop250100011.html)という話もあるので、containerd と nerdctl ベースのRancher desktop + nerdctl環境に慣れておくのもいいかも