M1 MacBook上へのローカルk8s環境（minikube、kind）セットアップ手順

MacBookAir（M1、2020）への **ローカルkubernetes環境** セットアップ手順をまとめました。
2022年1月時点ではM1環境への各種セットアップについて情報がまとまってきていますが機械学習系が多い印象で、ローカルk8s環境のセットアップに必要十分な手順を1ページにまとめてみました。
k8sの勉強をM1 MacBookでやりたいという需要はそもそも少ないかもしれませんが、同じような方の参考になればと思います。

# 前提
M1 MacBookAirを購入したばかりの状態を想定しています。
ローカルk8s環境を利用するための最低限の手順のためコマンドはMac標準のターミナル経由で実行する想定です。


# インストール対象ソフトウェア
minikubeおよびkind(Kubernetes in Docker)の環境をセットアップするために以下のインストールを行います。

* Homebrew
* Docker Desktop for Apple silicon
* minikube
* kind(Kubernetes in Docker)

:::note info
Homebrewはkindをインストールするために導入します。
Homebrewを利用しないkindのインストール手順はkind公式サイトを参照ください。
:::

:::note info
Docker Desktopはminikubeおよびkindを実行するためのハイパーバイザー環境として利用します。
:::


# 手順

以下の記事が大変参考になります。神ページ！
VSCodeやPythonの開発環境構築する際はぜひ。

https://qiita.com/c60evaporator/items/aef6cc1581d2c4676504

## Homebrewインストール
[公式サイト](https://brew.sh/index_ja) のトップページに記載の手順通り、ターミナルで以下を実行します。

```:
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

インストールが完了すると **「Next steps」** として実行すべきコマンドが表示されます。

```:
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/******/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh
```

表示の通り１つ目のコマンドを実行します。

```:
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/******/.zprofile
```

次に2つ目のコマンドを実行します。

```:
% eval "$(/opt/homebrew/bin/brew shellenv)"
```

以上でHomebrewのインストールは完了です。

## Docker Desktop for Apple siliconインストール 
[Docker公式サイトのDocker Desktop for Apple siliconのページ](https://docs.docker.com/desktop/mac/apple-silicon/) にアクセスします。
System Requirementに記載がある通り、ターミナルで以下のコマンドを実行しRosetta 2をインストールします。

```:
% softwareupdate --install-rosetta
```

次に公式サイトトップページの「Mac with Apple chip」のダウンロードリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509771/6e990b1d-b022-8149-6438-5fa332439b4c.png)

**Docker.dmg** ファイルがダウンロードされるのでダブルクリックで実行し、以下のインストーラーが表示されたら画面に従いドラッグ＆ドロップでインストールを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509771/ae112920-af09-9822-5e03-c8a2422c0bee.png)

インストール後の初回起動時に利用規約の承諾等を行い、以下画面が表示されればインストールは完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509771/31ce4e62-6c24-2d19-d642-1aa41e82322c.png)


## minikubeインストール
[公式サイト](https://minikube.sigs.k8s.io/docs/start/)の手順の通りターミナルで以下コマンドを実行し、minikubeをインストールします。

```:
% curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
% sudo install minikube-darwin-arm64 /usr/local/bin/minikube
```

minikubeのインストール手順は以上です。
インストール後、minikubeの起動は以下コマンドを実行します。

```:
% minikube start --driver=docker
```

コマンド実行後以下の画面が表示されminikubeクラスタが起動します。

```:
% minikube start --driver=docker              
😄  Darwin 12.1 (arm64) 上の minikube v1.24.0
✨  ユーザーの設定に基づいて docker ドライバーを使用します
👍  コントロールプレーンのノード minikube を minikube 上で起動しています
🚜  イメージを Pull しています...
🔥  docker container (CPUs=2, Memory=2200MB) を作成しています...
🐳  Docker 20.10.8 で Kubernetes v1.22.3 を準備しています...
    ▪ 証明書と鍵を作成しています...
    ▪ Control Plane を起動しています...
    ▪ RBAC のルールを設定中です...
🔎  Kubernetes コンポーネントを検証しています...
    ▪ イメージ gcr.io/k8s-minikube/storage-provisioner:v5 を使用しています
🌟  有効なアドオン: storage-provisioner, default-storageclass
🏄  完了しました！ kubectl が「"minikube"」クラスタと「"default"」ネームスペースを使用するよう構成されました
```

`kubectl get nodes` コマンドでminikubeクラスタのノードを確認できます。
minikubeはシングルノードクラスタのため1ノードのみ表示されます。

```:
% kubectl get nodes 
NAME       STATUS   ROLES                  AGE     VERSION
minikube   Ready    control-plane,master   9m41s   v1.22.3
```

minikubeクラスタを終了するには `minikube delete` コマンドを実行します。

```:
% minikube delete
🔥  docker の「minikube」を削除しています...
🔥  コンテナ "minikube" を削除しています...
🔥  /Users/******/.minikube/machines/minikube を削除しています...
💀  クラスタ "minikube" の全てのトレースを削除しました。
```

## kindインストール
kindはHomebrew経由でインストールできます。
Homebrewを利用しないkindのインストール手順は [公式サイト](https://kind.sigs.k8s.io/docs/user/quick-start/) を参照ください。

ターミナルで以下コマンドを実行し、kindをインストールします。

```:
% brew install kind
```

kindのインストール手順は以上です。
インストール後、kindでkubernetesクラスタを起動します。
クラスタの定義ファイルを作成して行います。 

```yml:kind.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
```

定義ファイルを作成後、以下コマンドを実行してkindクラスタを起動します。

```:
% kind create cluster --config kind.yaml --name kindcluster
```

コマンド実行後、kindクラスタの起動が行われます。

```:
% kind create cluster --config kind.yaml --name kindcluster
Creating cluster "kindcluster" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼 
 ✓ Preparing nodes 📦 📦 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
 ✓ Joining worker nodes 🚜 
Set kubectl context to "kind-kindcluster"
You can now use your cluster with:

kubectl cluster-info --context kind-kindcluster

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/
```

起動後、表示されたメッセージのContextをkindに設定しておきます。Contextの設定は以下コマンドで行います。

```:
% kubectl config use-context kind-cluster
```

minikubeと同様に `kubectl get nodes` コマンドでkindクラスタのノードを確認できます。
kind.ymlで定義した通りのノード構成で起動していることを確認します。

```:
% kubectl get nodes
NAME                        STATUS   ROLES                  AGE     VERSION
kindcluster-control-plane   Ready    control-plane,master   9m29s   v1.21.1
kindcluster-worker          Ready    <none>                 8m58s   v1.21.1
kindcluster-worker2         Ready    <none>                 8m58s   v1.21.1
```

kindクラスタを終了するには `kind delete cluster` コマンドを実行します。

```:
% kind delete cluster --name kindcluster
Deleting cluster "kindcluster" ...
```

# おわりに
今回はminikubeとkindのセットアップまでまとめました。
とりあえずこの環境でPodの起動は問題なくできていますが、今後環境触っている中でM1固有の問題などが見つかれば別の記事にまとめようと考えています。
最後まで読んでいただきありがとうございます。