Docker for MacでRancher2.4を動かしてみる

# はじめに

[Rancher](https://rancher.com/)を勉強しようとおもって[Docker for Mac](https://docs.docker.com/docker-for-mac/)上で動かそうと思ったら意外と手こずったので書いておきます。

各ソフトウェアのバージョンは以下のとおり

* Docker for Mac 2.3.0.4(49911) Stable
* Rancher v2.4.5

# ポイント
1. Docker for Macの Kubernetesを無効にしておく。Rancherが独自に上げるk8sコンテナとポートがかぶったりするようだ
3. Resourcesが CPUs:4, Memory: 8GB, Swap: 4GB くらいあったほうがいい。少ないと途中で落ちたりする模様
2. -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/src/rancher:/var/run

# やってみる

## Docker for MacのKubernetesを無効にする
Preference -> Kubernetes で `Enable Kubernetes`のチェックがオフになっているのを確認する。オンの場合はオフに。Kubernetesの設定変更後に`Starting...`のまま進まないという現象がけっこうあるのでその場合は[これ](https://github.com/docker/for-mac/issues/2990#issuecomment-570583805)を参考にリセットしたりする必要がある。
<img width="1035" alt="スクリーンショット 2020-08-15 12.03.13.png (200.2 kB)" src="https://img.esa.io/uploads/production/attachments/3505/2020/08/15/10856/bcccbf35-26bd-4e52-9315-762683e83e66.png">

## Docker for MacのResourceを設定する
CPUs:4, Memory: 8GB, Swap: 4GB くらいあったほうがいい。
![スクリーンショット 2020-08-15 12.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/923e21b8-6930-96d1-d8bd-df053acc7f72.png)

## Rancherを起動する
ターミナルで以下のコマンドでRancherを起動する

```shell
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
```

```shell
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                      NAMES
150a14cb4a5f        rancher/rancher     "entrypoint.sh"     19 seconds ago      Up 18 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   bold_meitner
```

HTTPサーバーが起動するのでちょっとまってからWebブラウザで `https://localhost` にアクセスして、`localhost にアクセスする（安全ではありません）`をクリックする
![スクリーンショット 2020-08-15 12.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/8ac8dffd-36bb-9a38-4c9b-cc6940f76acd.png)

adminのパスワードを設定して`I agree to...`にチェックを入れ`Continue`をクリックする
![スクリーンショット 2020-08-15 12.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/44e48569-77a8-9a56-3292-98a10f6b66b6.png)

`localhost`のまま`Save URL`をクリックする
![スクリーンショット 2020-08-15 12.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/ee602dba-a53a-4428-232d-142837c1f2f9.png)

## Clusterを新規作成する

右上の`Add Cluster`ボタンをクリックする
![スクリーンショット 2020-08-15 12.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/a3e4a10f-7ea6-34ee-b1b4-e502751decbe.png)

`From existing Nodes (Custom)`をクリックする
![スクリーンショット 2020-08-15 12.15.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/abbbab38-7d29-e4e1-9913-abbdf5f7b452.png)

Cluster Nameに適当な名前を入力して(今回はsandboxとした)あとはデフォルトのままにして一番下の`Next`ボタンをクリックする
![スクリーンショット 2020-08-15 12.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/c0ab0132-10fa-ad9b-c859-496e13dc2c41.png)

Node Role欄の`etcd`、`Control Plane`、`Worker`すべてにチェックを入れ、Run this command on one or more existing machines already running a supported version of Docker.下のコマンドを右のクリップボードアイコンをクリックしてクリップボードにコピーする
![スクリーンショット 2020-08-15 12.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/b2993d56-ecd7-9f4f-d027-f756e5bd0491.png)

以下が本記事の最も重要な変更ポイント。このコマンドを一旦TextEditなどにペーストして以下を変更する

1. ユーザー権限なディレクトリを作成する（ここでは`$HOME/rancher`とした）
2. コマンド中の `-v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run` を `-v /var/run/docker.sock:/var/run/docker.sock -v $HOME/rancher:/var/run` に変更する。`$HOME/rancher`の部分は1で作成したパスに読み替える

以下の記事を参考にさせていただいた。ありがとうございます。
[Docker for Mac で Rancher を動かす](https://qiita.com/ntoreg/items/e1e63077ef0fef1f3ccc)

ターミナルで変更したコマンドを実行する。正常に通るとRancherの画面下部に`1 new node has registered`と表示されるので`Done`ボタンをクリックする
![スクリーンショット 2020-08-15 12.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/c69e0ab4-8c14-7653-dbe6-effc032bf90f.png)

しばらく待ってClusterのStateが`Active`になったら成功。
![スクリーンショット 2020-08-15 13.05.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/10bc1e6b-39b7-d9ef-0088-1af35de20c54.png)

必要なコンテナが起動しているのがわかる

```shell
docker ps -a
CONTAINER ID        IMAGE                                             COMMAND                  CREATED              STATUS                          PORTS                                      NAMES
dfaf7bfd6d2d        rancher/nginx-ingress-controller-defaultbackend   "/server"                About a minute ago   Up About a minute                                                          k8s_default-http-backend_default-http-backend-598b7d7dbd-dm9jm_ingress-nginx_f1ed77e7-b0da-4ac7-b7d5-05a76e1dc935_0
b351b4a9587c        96148b821282                                      "/bin/sh -c 'kube-ap…"   About a minute ago   Up About a minute                                                          k8s_kube-api-auth_kube-api-auth-kh2xj_cattle-system_e8f0ffa8-9742-460c-bf89-ee59c1abb170_1
91cc1a58aedf        rancher/rancher-agent:v2.4.5                      "run.sh --server htt…"   2 minutes ago        Up About a minute                                                          infallible_dubinsky
6721149be6c6        rancher/rancher-agent:v2.4.5                      "run.sh -- share-roo…"   2 minutes ago        Exited (0) About a minute ago                                              share-mnt
56de7bc3900b        2e6c7ac4e072                                      "run.sh"                 2 minutes ago        Up 2 minutes                                                               k8s_agent_cattle-node-agent-fzgbg_cattle-system_5f8d6c02-3902-42de-916b-3bc65a1c5bae_0
cddcecf17cfd        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   2 minutes ago        Up 2 minutes                                                               kube-proxy
1797c1bf8ad1        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   2 minutes ago        Up 2 minutes                                                               kubelet
20f1a31e73dc        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   3 minutes ago        Up 3 minutes                                                               kube-scheduler
be51b1b346ca        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   3 minutes ago        Up 3 minutes                                                               kube-controller-manager
a1ed4f9f3143        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   3 minutes ago        Up 3 minutes                                                               kube-apiserver
bbf8496e49cc        rancher/rke-tools:v0.1.59                         "/bin/bash"              3 minutes ago        Created                                                                    service-sidekick
c22de36cf71d        rancher/coreos-etcd:v3.4.3-rancher1               "/usr/local/bin/etcd…"   3 minutes ago        Up 3 minutes                                                               etcd
8049cb416c10        rancher/rke-tools:v0.1.59                         "/bin/bash"              4 minutes ago        Exited (0) 4 minutes ago                                                   cluster-state-deployer
6c5cbb4b9b11        rancher/rancher                                   "entrypoint.sh"          6 minutes ago        Up 6 minutes                    0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   fervent_albattani
```

途中でなんかのエラー（うちではetcd関係がよく出た）が発生した場合はややこしいのでDocker for MacのPreferences -> 右上のBug(虫)アイコン -> Reset to factory defaults のボタンでファクトリーリセットをかけて最初からやり直したほうがいい。他に大事なコンテナがなければ

Activeになったらクラスタのヘルスチェックもできてる。素敵
![スクリーンショット 2020-08-15 13.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/d8b6560f-e07f-4891-42e8-e98ac90d26c7.png)

## Workloadを作成してみる

適当なWorkloadを作成してPodを起動してみる

Rancherの左上メニューのドロップダウンリストをクリックしてsandbox -> Defaultをクリックする
![スクリーンショット 2020-08-15 13.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/0044e60f-d345-b8a7-eaa1-d7af0c8918af.png)

右上のDeployボタンをクリックする
![スクリーンショット 2020-08-15 13.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/1ddd2013-9e30-47b2-cdb0-09b89231e15f.png)

適当な名前を入力して(ここでは`myapp`とした)Pod数を3にしてみた。設定したら一番下のLaunchボタンをクリックする
![スクリーンショット 2020-08-15 13.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/7d77349d-c7ce-70ec-ec44-d5136685944f.png)

しばらく待つと3つPodが起動したようだ
![スクリーンショット 2020-08-15 13.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/50544ddd-6bf2-b8f1-1228-07dcd8947f83.png)

![スクリーンショット 2020-08-15 13.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/6a9270f0-d458-a948-944d-7e5c331b1dc3.png)

たしかにubuntuが3つ上がっている

```shell
docker ps -a
CONTAINER ID        IMAGE                                             COMMAND                  CREATED             STATUS                      PORTS                                      NAMES
fa3af2559a20        ubuntu                                            "/bin/bash"              4 minutes ago       Up 4 minutes                                                           k8s_myapp_myapp-66fdffb7c6-kfr8h_default_3b6150d0-7419-4e9d-b315-91e6893e2e68_0
03d4cd6eac38        ubuntu                                            "/bin/bash"              4 minutes ago       Up 4 minutes                                                           k8s_myapp_myapp-66fdffb7c6-t68bl_default_cf1cc0f1-bd93-44e6-aca4-1d7e9fc32cd4_0
b0735931cc7d        ubuntu                                            "/bin/bash"              4 minutes ago       Up 4 minutes                                                           k8s_myapp_myapp-66fdffb7c6-s9pnq_default_12e0fdbc-04d2-4754-94e7-6635000b47bf_0
dfaf7bfd6d2d        rancher/nginx-ingress-controller-defaultbackend   "/server"                18 minutes ago      Up 18 minutes                                                          k8s_default-http-backend_default-http-backend-598b7d7dbd-dm9jm_ingress-nginx_f1ed77e7-b0da-4ac7-b7d5-05a76e1dc935_0
b351b4a9587c        96148b821282                                      "/bin/sh -c 'kube-ap…"   18 minutes ago      Up 18 minutes                                                          k8s_kube-api-auth_kube-api-auth-kh2xj_cattle-system_e8f0ffa8-9742-460c-bf89-ee59c1abb170_1
91cc1a58aedf        rancher/rancher-agent:v2.4.5                      "run.sh --server htt…"   19 minutes ago      Up 19 minutes                                                          infallible_dubinsky
6721149be6c6        rancher/rancher-agent:v2.4.5                      "run.sh -- share-roo…"   19 minutes ago      Exited (0) 19 minutes ago                                              share-mnt
56de7bc3900b        2e6c7ac4e072                                      "run.sh"                 19 minutes ago      Up 19 minutes                                                          k8s_agent_cattle-node-agent-fzgbg_cattle-system_5f8d6c02-3902-42de-916b-3bc65a1c5bae_0
cddcecf17cfd        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   19 minutes ago      Up 19 minutes                                                          kube-proxy
1797c1bf8ad1        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   19 minutes ago      Up 19 minutes                                                          kubelet
20f1a31e73dc        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   20 minutes ago      Up 20 minutes                                                          kube-scheduler
be51b1b346ca        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   20 minutes ago      Up 20 minutes                                                          kube-controller-manager
a1ed4f9f3143        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   20 minutes ago      Up 20 minutes                                                          kube-apiserver
bbf8496e49cc        rancher/rke-tools:v0.1.59                         "/bin/bash"              20 minutes ago      Created                                                                service-sidekick
c22de36cf71d        rancher/coreos-etcd:v3.4.3-rancher1               "/usr/local/bin/etcd…"   20 minutes ago      Up 20 minutes                                                          etcd
8049cb416c10        rancher/rke-tools:v0.1.59                         "/bin/bash"              21 minutes ago      Exited (0) 21 minutes ago                                              cluster-state-deployer
6c5cbb4b9b11        rancher/rancher                                   "entrypoint.sh"          23 minutes ago      Up 23 minutes               0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   fervent_albattani
```

Podを1にダウンスケールしてみる
![スクリーンショット 2020-08-15 13.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/fcccaf5a-5b88-cdf5-9894-e8e90d96413b.png)

ちゃんと減りました
![スクリーンショット 2020-08-15 13.27.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/1194e946-859f-bd61-2583-9e6c73e22d71.png)

```shell
docker ps -a
CONTAINER ID        IMAGE                                             COMMAND                  CREATED             STATUS                      PORTS                                      NAMES
b0735931cc7d        ubuntu                                            "/bin/bash"              6 minutes ago       Up 6 minutes                                                           k8s_myapp_myapp-66fdffb7c6-s9pnq_default_12e0fdbc-04d2-4754-94e7-6635000b47bf_0
dfaf7bfd6d2d        rancher/nginx-ingress-controller-defaultbackend   "/server"                20 minutes ago      Up 20 minutes                                                          k8s_default-http-backend_default-http-backend-598b7d7dbd-dm9jm_ingress-nginx_f1ed77e7-b0da-4ac7-b7d5-05a76e1dc935_0
b351b4a9587c        96148b821282                                      "/bin/sh -c 'kube-ap…"   21 minutes ago      Up 21 minutes                                                          k8s_kube-api-auth_kube-api-auth-kh2xj_cattle-system_e8f0ffa8-9742-460c-bf89-ee59c1abb170_1
91cc1a58aedf        rancher/rancher-agent:v2.4.5                      "run.sh --server htt…"   21 minutes ago      Up 21 minutes                                                          infallible_dubinsky
6721149be6c6        rancher/rancher-agent:v2.4.5                      "run.sh -- share-roo…"   21 minutes ago      Exited (0) 21 minutes ago                                              share-mnt
56de7bc3900b        2e6c7ac4e072                                      "run.sh"                 21 minutes ago      Up 21 minutes                                                          k8s_agent_cattle-node-agent-fzgbg_cattle-system_5f8d6c02-3902-42de-916b-3bc65a1c5bae_0
cddcecf17cfd        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   22 minutes ago      Up 22 minutes                                                          kube-proxy
1797c1bf8ad1        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   22 minutes ago      Up 22 minutes                                                          kubelet
20f1a31e73dc        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   22 minutes ago      Up 22 minutes                                                          kube-scheduler
be51b1b346ca        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   22 minutes ago      Up 22 minutes                                                          kube-controller-manager
a1ed4f9f3143        rancher/hyperkube:v1.18.6-rancher1                "/opt/rke-tools/entr…"   22 minutes ago      Up 22 minutes                                                          kube-apiserver
bbf8496e49cc        rancher/rke-tools:v0.1.59                         "/bin/bash"              22 minutes ago      Created                                                                service-sidekick
c22de36cf71d        rancher/coreos-etcd:v3.4.3-rancher1               "/usr/local/bin/etcd…"   22 minutes ago      Up 22 minutes                                                          etcd
8049cb416c10        rancher/rke-tools:v0.1.59                         "/bin/bash"              23 minutes ago      Exited (0) 23 minutes ago                                              cluster-state-deployer
6c5cbb4b9b11        rancher/rancher                                   "entrypoint.sh"          25 minutes ago      Up 25 minutes               0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   fervent_albattani
```

とりあえずここまで。

# まとめ
成功にたどり着くまでけっこう調べ回った。ちなみにCustom ClusterじゃなくてAWS EC2上でやったら普通に公式のチュートリアルどおりにできた。Docker for Macでやるのはあまり想定されていないっぽいが、学習用には便利なのでしばらくこれで使ってみようと思う。

全体的に割とナーバスなシステム構成なんだと感じた。特にk8sまわりが。この記事どおりにやってもどっかでエラーが出る場合は上述のとおりDocker for MacのFactory Resetをかけて最初からやり直すのがおすすめ。正直どこが障害になってるのか調べるのがけっこう大変なので。