Kubernetes をローカルで試してみる

# やりたいこと
Kubernetes を使うことになったが、これまでまったく触ったことがなかったのでこの機会にいろいろと試してみようと、ローカルで使える環境を整えたので記事にしてみます。

## マシン
* OS: MacOS 14.3
* CPU: M3Pro
* メモリ: 36 GB

## ローカル環境の構築

### minikube

ローカルで k8s 環境を構築できる minikube をインストールする。

https://minikube.sigs.k8s.io/

以下コマンドでインストール。

```sh
$ brew install minikube
```

Version 確認しておく。

```sh
$ minikube version

minikube version: v1.34.0
commit: 210b148df93a80eb872ecbeb7e35281b3c582c61
```

### kubectl

k8s の CLI ツール。

https://kubernetes.io/docs/reference/kubectl/

以下コマンドでインストールする。

```sh
$ brew install kubectl
```

Version 確認しておく。

```sh
$ kubectl version --client

Client Version: v1.31.3
Kustomize Version: v5.4.2
```

### minikube の起動

以下コマンドで minikube を起動させる。初回起動時は少し時間がかかるが待機する。

```sh
$ minikube start
```

以下のような出力が表示される。

```sh
😄  Darwin 14.3 (arm64) 上の minikube v1.34.0
✨  既存のプロファイルを元に、docker ドライバーを使用します
👍  Starting "minikube" primary control-plane node in "minikube" cluster
🚜  Pulling base image v0.0.45 ...
🏃  実行中の docker 「minikube」 container を更新しています...
🐳  Docker 27.2.0 で Kubernetes v1.31.0 を準備しています...
🔎  Kubernetes コンポーネントを検証しています...
    ▪ gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
🌟  有効なアドオン: storage-provisioner, default-storageclass
🏄  終了しました！kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました
```

以上で、環境構築は完了！

## Service を作成する

今回は、Nginx を k8s 上に作成していく。

Service を作成する前に、Deployment を作成する。
Deployment の概念については以下の記事が分かりやすい。

https://qiita.com/tkusumi/items/01cd18c59b742eebdc6a

以下のように YAML ファイルを作成する。

```test_deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
```

Service については以下の記事で詳しく書かれている。

https://qiita.com/kouares/items/94a073baed9dffe86ea0

以下のように YAML ファイルを作成する。

```test_service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
```

作成した YAML ファイルを minikube 上に適用していく。

```sh
$ kubectl create -f test_deployment.yml

deployment.apps/nginx created
```

```sh
$ kubectl create -f test_service.yml

service/nginx-service created
```

実際に作成されたか確認してみる。以下のような出力になれば OK。
Running には時間が経てば変化する。

```sh
$ kubectl get all
                            
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7769f8f85b-585x7   1/1     Running   0          3m30s
pod/nginx-7769f8f85b-zhmsj   1/1     Running   0          3m30s

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        37m
service/nginx-service   NodePort    10.106.243.72   <none>        80:30954/TCP   2m38s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   2/2     2            2           3m30s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-7769f8f85b   2         2         2       3m30s

```

## サービスへアクセスする

以下コマンドを事項すると、アクセス URL が表示され自動的にブラウザが起動して URL 先が表示される。
今回はよく見る Nginx のデフォルトページが表示されるはず！

```sh
minikube service nginx-service
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/e1dcbdcc-fae7-7037-e08e-353f0791d239.png)


# ということで
k8s 上に Nginx を構築してみました。k8s の概要と基本的な操作は分かったかなと思います。
他にも様々な機能がありそうなので今後も記事にしていきます。最終的には何らかクラウドサービスを利用したケースまで試してみみたいです。


以上です。