【kubernetes】minikubeでいとも簡単にkubernetes(k8s)を使ってみた

最近k8sの理解を深めたく勉強しており、ローカルで簡単にpodを作れるツールを使ってみたので記事にする。
本来ならEKSとECSを使って遊びたかったがお金がそこそこかかってしまうので今回は断念した。
色々探した結果、ローカルで簡単にkubernetesを使えるminikubeというツールがあったので使ってみた。
※minikubeを入れるだけでマスターノードやワーカーノードが自動で構築されるので、必要なファイルを作るだけでpodを作れる。

# minikubeをインストール
minikubeはnodebrewを使ってインストールできる。
```terminal
$ brew install minikube

$ which kubectl
/usr/local/bin/minikube
```
minikubeを起動する。
```terminal
$ minikube start
```
多少時間がかかるが、「終了しました！」と出ればOK。

ノードを確認する。minikubeが表示されていれば準備完了。

```terminal
$ kubectl get nodes
NAME       STATUS   ROLES           AGE     VERSION
minikube   Ready    control-plane   2m19s   v1.30.0
```

kubectlが使えない場合は、インストールする。
```terminal
$ brew install kubectl
```

# deploymentとserviceの作成
pod作成に必要なdeploymentの定義とpodアクセスに必要なserviceの定義を作る。

あるあるだが、今回はApacheサーバー用のpodを作ることにする。
※定義ファイルの詳細については割愛。
```yaml:deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sampledep
spec:
  selector:
    matchLabels:
      app: samplekube
  replicas: 3
  template:
    metadata:
      labels:
         app: samplekube
    spec:
      containers:
        - name: samplecontainer
          image: httpd
          ports:
          - containerPort: 80
```

```yaml:service.yml
apiVersion: v1
kind: Service
metadata:
  name: sampleservice
spec:
  type: NodePort
  ports:
    - port: 8099
      targetPort: 80
      protocol: TCP
      nodePort: 30080
  selector:
    app: samplekube
```

これらを適応する。
これでpod3台とserviceができるはず。
```terminal
$ kubectl apply -f deployment.yml
deployment.apps/sampledep created

$ kubectl apply -f service.yml
service/sampleervice created
```

# pod, serviceの確認とアクセス
podを確認する。
```terminal
$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
sampledep-5566c97977-8jpz9   1/1     Running   0          4m53s
sampledep-5566c97977-lqjd4   1/1     Running   0          4m53s
sampledep-5566c97977-txggc   1/1     Running   0          4m53s
```
3台のpodが立ち上がっており想定通り。

サービスも確認する。
```terminal
$ kubectl get service
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          12m
sampleservice   NodePort    10.105.94.250   <none>        8099:30080/TCP   18s
```
想定どおりノードポートのサービスが作成された。

画面からも確認してみる。
サービスの情報から http://localhost:30080 にアクセスすればApacheの初期画面が見れるはず・・・
と思ったが、見れなかった。

minikubeでノードポートにアクセスするにはアクセス用のトンネルを起動させる必要がある。らしい。

```terminal
$ minikube service sampleservice
|-----------|---------------|-------------|---------------------------|
| NAMESPACE |     NAME      | TARGET PORT |            URL            |
|-----------|---------------|-------------|---------------------------|
| default   | sampleservice |        8099 | http://192.168.49.2:30080 |
|-----------|---------------|-------------|---------------------------|
🏃  sampleservice サービス用のトンネルを起動しています。
|-----------|---------------|-------------|------------------------|
| NAMESPACE |     NAME      | TARGET PORT |          URL           |
|-----------|---------------|-------------|------------------------|
| default   | sampleservice |             | http://127.0.0.1:59348 |
|-----------|---------------|-------------|------------------------|
🎉  デフォルトブラウザーで default/sampleservice サービスを開いています...
❗  Docker ドライバーを darwin 上で使用しているため、実行するにはターミナルを開く必要があります。
```

これでいけた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749685/8557dc94-a8c7-ca95-3551-50b836c9fb64.png)

# 後始末
使い終わったらちゃんと消しておく。
こういうの大事。
```terminal
$ kubectl delete -f deployment.yml 
deployment.apps "sampledep" deleted

$ kubectl delete -f service.yml 
service "sampleservice" deleted

$ minikube stop
✋  「minikube」ノードを停止しています...
🛑  SSH 経由で「minikube」の電源をオフにしています...
🛑  1 台のノードが停止しました。
```

minikubeを使えばかなり簡単にローカルでkubernetesを使った勉強ができると思う。
こういうのは手を動かした方が身につくので簡単に試せるのはすごくありがたい。

以上。