プログラミング初心者でも出来た！とにかくローカル環境でk8sを動かしてみよう

# 参考記事
https://kubernetes.io/ja/docs/setup/learning-environment/minikube/
https://minikube.sigs.k8s.io/docs/start/

# はじめに
「Kubernetes（k8s）って何？ 何から手をつけたらいいの？」と疑問を持つ初学者の方々に向けて、この記事では実際に手を動かしながらKubernetesの基本を学ぶ方法を紹介します。

社内のKubernetes勉強会で、プログラミング初心者から業務でKubernetesを使用している経験者まで、5名の幅広いメンバーと共にこの活動を行いました。

今回は、Minikubeを使用してローカル環境でKubernetesを動かす方法を中心に解説します。

# 必要なツールのインストール
## Docker
Dockerはコンテナを作成・管理するために必要です。以下のリンクから自分の環境に合わせてインストールしてください。

https://docs.docker.com/engine/install/

自分の環境に合うリンクをクリックします。
<img width="2520" alt="CleanShot 2024-05-14 at 16.29.30@2x.png (651.4 kB)" src="https://img.esa.io/uploads/production/attachments/20153/2024/05/14/141367/e6387f32-7d7f-4bd5-b1fd-d708d09cafb7.png">


## Macの場合：Appleシリコンチップを搭載しているか、インテルチップを搭載しているかを確認する方法
https://qiita.com/ASONE0923/items/39992e2deb610dda105d

<img width="2512" alt="CleanShot 2024-05-14 at 16.30.55@2x.png (543.4 kB)" src="https://img.esa.io/uploads/production/attachments/20153/2024/05/14/141367/43181b0c-999a-4f0b-ba62-8f09a7ce4fef.png">

クリックすると、Docker Desktopのインストーラーのダウンロードが開始されます。

<img width="1794" alt="CleanShot 2024-05-14 at 16.33.38@2x.png (76.9 kB)" src="https://img.esa.io/uploads/production/attachments/20153/2024/05/14/141367/216c378a-733b-4a76-8173-06d342f005e9.png">

ダブルクリックしてDocker.dmgインストーラーを開き、Docker アイコンをアプリケーションフォルダーにドラッグします。
<img width="719" alt="CleanShot 2024-05-14 at 16.34.18@2x.png (203.4 kB)" src="https://img.esa.io/uploads/production/attachments/20153/2024/05/14/141367/efd7ab3e-1876-4218-86b7-9556696d538d.png">

<img width="899" alt="アプリケーション.png (316.4 kB)" src="https://img.esa.io/uploads/production/attachments/20153/2024/05/14/127438/f978f83d-d0f3-479f-860c-bd8a68c92f87.png">

アプリを開いてアプリを使用する目的を入力して「finish」を選択し、下記の画面に遷移します。
<img width="1260" alt="Containers_-_Docker_Desktop.png (354.1 kB)" src="https://img.esa.io/uploads/production/attachments/20153/2024/05/14/127438/f44f04c5-7fe6-4c1f-b42c-a3eb734d9a6c.png">


## Minikube
Minikubeはローカル環境で簡単にKubernetesクラスタを立ち上げるツールです。以下のコマンドでインストールできます。

```sh
brew install minikube
```

# Kubernetesクラスタの起動
Minikubeを使ってクラスタを起動するには、ターミナルで以下のコマンドを実行します。

```sh
minikube start
```

なお、Dockerをインストールせずに`minikube start`を実行すると、以下のようなエラーが表示されます。
```
😄  Darwin 13.2.1 (arm64) 上の minikube v1.33.1
👎  デフォルトドライバーを採用できませんでした。こちらが可能性の高い順に考えられる事です:
💡  代わりに、これらのドライバーのいずれかをインストールすることもできます:
    ▪ docker: Not installed: exec: "docker": executable file not found in $PATH
    ▪ hyperkit: Not installed: exec: "hyperkit": executable file not found in $PATH
    ▪ parallels: Not installed: exec: "prlctl": executable file not found in $PATH
    ▪ qemu2: Not installed: exec: "qemu-system-aarch64": executable file not found in $PATH
    ▪ virtualbox: Not installed: unable to find VBoxManage in $PATH
    ▪ podman: Not installed: exec: "podman": executable file not found in $PATH

❌  DRV_NOT_DETECTED が原因で終了します: 利用可能なドライバーが検出されませんでした。--driver 指定を試すか、https://minikube.sigs.k8s.io/docs/start/ を参照してください
```

問題なくMinikubeがスタートされると以下のように表示されます。
```
- 😄  Darwin 13.2.1 (arm64) 上の minikube v1.33.1
✨  docker ドライバーが自動的に選択されました
📌  root 権限を持つ Docker Desktop ドライバーを使用
👍  Starting "minikube" primary control-plane node in "minikube" cluster
🚜  Pulling base image v0.0.44 ...
💾  ロード済み Kubernetes v1.30.0 をダウンロードしています...
    > preloaded-images-k8s-v18-v1...:  319.81 MiB / 319.81 MiB  100.00% 3.03 Mi
    > gcr.io/k8s-minikube/kicbase...:  435.76 MiB / 435.76 MiB  100.00% 3.35 Mi
🔥  Creating docker container (CPUs=2, Memory=2200MB) ...
🐳  Docker 26.1.1 で Kubernetes v1.30.0 を準備しています...
    ▪ 証明書と鍵を作成しています...
    ▪ コントロールプレーンを起動しています...
    ▪ RBAC のルールを設定中です...
🔗  bridge CNI (コンテナーネットワークインターフェース) を設定中です...
🔎  Kubernetes コンポーネントを検証しています...
    ▪ gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
🌟  有効なアドオン: storage-provisioner, default-storageclass
🏄  終了しました！kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました
```

# Kubectlを使ってPodを一覧表示する
kubectlを使用して、全namespaceのPodを一覧表示することができます。
 ```sh
 # 全namespaceに存在するPodを一覧表示する
$ kubectl get pod -A
 NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-787d4945fb-8c9fq           1/1     Running   0          12s
kube-system   coredns-787d4945fb-q6r8p           1/1     Running   0          12s
kube-system   etcd-minikube                      1/1     Running   0          27s
kube-system   kube-apiserver-minikube            1/1     Running   0          27s
kube-system   kube-controller-manager-minikube   1/1     Running   0          25s
kube-system   kube-proxy-krj5b                   1/1     Running   0          12s
kube-system   kube-scheduler-minikube            1/1     Running   0          27s
kube-system   storage-provisioner                1/1     Running   0          24s
 ```

# アプリケーションをデプロイする
サンプル Deploymentを作成し、ポート 8080 で公開します。

```sh
kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
kubectl expose deployment hello-minikube --type=NodePort --port=8080
```

しばらく時間がかかることもありますが、以下を実行するとすぐにデプロイメントが表示されます。
```sh
kubectl get services hello-minikube
```

このサービスにアクセスするために、minikube に Web ブラウザを起動させます。
```sh
minikube service hello-minikube
```

kubectl を使用してポートを転送します。
```sh
kubectl port-forward service/hello-minikube 7080:8080
```

やったー！ローカル環境でk8sを動かしてアプリケーションがデプロイされました。

# Minikubeクラスターを停止&削除
ローカル環境のMinikubeクラスターを停止します。

```sh
minikube stop
```
ローカルのMinikubeクラスターを削除します。

```sh
minikube delete --all
```


# 番外編
## Podの数を増やしたい
Deploymentで管理されているPodの個数を増やす方法を紹介します。

```sh
$ kubectl edit deployment hello-minikube
```


```sh
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-minikube
  labels:
    app: nginx
spec:
  replicas: 3 # 希望のPod数に変更します
```

```sh
$ kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hello-minikube   3/3     3            3           16m

$ kubectl get pod -A
NAMESPACE              NAME                                         READY   STATUS    RESTARTS      AGE
default                hello-minikube-7ddcbc9b8b-4trx6              1/1     Running   0             51s
default                hello-minikube-7ddcbc9b8b-gqzq6              1/1     Running   0             7m26s
default                hello-minikube-7ddcbc9b8b-xqfbl              1/1     Running   0             51s
kube-system            coredns-565d847f94-6thzk                     1/1     Running   0             31m
```


## Podを消してもPodが再作成される！

Podを取得します。
```sh
$ kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube-77b6f68484-zbb9f   1/1     Running   0          22s
```

Podを削除します。
```sh
$ kubectl delete pod hello-minikube-77b6f68484-zbb9f
```

Podが削除されているか確認します。
```sh
$ kubectl delete pod hello-minikube-77b6f68484-6tlkp
```

なぜPodが削除されないのでしょうか？
それは、PodがDeploymentで管理されているからです。

KubernetesではPodを直接削除しても、そのPodがDeploymentなどのコントローラによって管理されている場合、Deploymentの設定に基づいて自動的に新しいPodが再作成されます。

この挙動は、システムの可用性と耐障害性を確保するために重要です。

もしPodを削除したい場合にPodが自動的に再作成されるのを防ぎたいなら、そのPodを管理しているDeploymentやReplicaSetを削除する必要があります。

```sh
kubectl delete deployment <deployment-name>
```

<img width="652" alt="名称未設定2.png (30.0 kB)" src="https://img.esa.io/uploads/production/attachments/20153/2024/05/14/127438/dedc3b9f-823f-44cb-a1ba-9d05a6600731.png">

# やってみた感想
全くプログラミングを触れずに来た人でも社内のKubernetesの勉強会を通じて、チーム制であれば、記事に記載された一通りの内容を実施することができました！
触れる前はターミナルを開く機会もあまりなく抵抗感がありましたが、実際に触れてみるとよりKubernetesがどのようなシステムなのかを理解することができ、とても勉強になりました！