kubernetesのserviceをlocalhostでアクセスできるようにする

## きっかけ
現在ローカル環境でminikubeを使った開発を学習しています。
ただローカル環境上のReactにminikube上のAPIを叩こうとすると、発行するURLが毎回変わってしまい接続ができない状態になる。
なのでこのURLが変わらないようにしたい。

```terminal
$ minikube service --all --url
http://127.0.0.1:58431
http://127.0.0.1:58433
❗  Docker ドライバーを darwin 上で使用しているため、実行するにはターミナルを開く必要があります。
^C%

$ minikube service --all --url
http://127.0.0.1:58448 # 変更されている
http://127.0.0.1:58450 #　　変更されている
❗  Docker ドライバーを darwin 上で使用しているため、実行するにはターミナルを開く必要があります。

```

## 前提
```terminal
$ minikube version
minikube version: v1.32.0
commit: 8220a6eb95f0a4d75f7f2d7b14cef975f050512d
$ kubectl version
Client Version: v1.28.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.3
$ minikube status # runningになっていなければ`minikube start`で起動する
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
```
## 結論
serviceを`type: LoadBalancer`で設定後、`minikube tunnel`でlocalhostからアクセスできるようにする。
ここでは`main-server`と`auth-server`というサービスを`LoadBalancer`タイプで定義します。

## そもそもkubernetesのLoadBalancerサービスって？
LoadBalancerサービスは、外部トラフィックをKubernetesクラスター内の適切なPod群にルーティングします。これにより、アプリケーションへの安定したアクセスポイントが提供します。
AWS上ではELBが対応しますが、ローカル環境ではそのような機能はありません。

なので、`minikube tunnel`を使ってローカル環境でも外部IPアドレスを持つサービスの機能を再現できます。

### 実践
deployment, serviceは下記のように設定してください。
```deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: main-server
  labels:
    app: main-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: main-server
  template:
    metadata:
      labels:
        app: main-server
    spec:
      containers:
      - name: main-server
        image: kaito2426/go-server # 自分でpullしたimageを使ってみて下さい！！
        ports:
        - containerPort: 8080 # ここはlocalからアクセスするportにしてください。
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-server
  labels:
    app: auth-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: auth-server
  template:
    metadata:
      labels:
        app: auth-server
    spec:
      containers:
      - name: auth-server
        image: kaito2426/sub-go-server # 自分でpullしたimageを使ってみて下さい！！
        ports:
        - containerPort: 8050 # ここはlocalからアクセスするportにしてください。
```

```service.yml
apiVersion: v1
kind: Service
metadata:
  name: main-server
  labels:
    app: main-server
spec:
  ports:
    - nodePort: 30001
      port: 8080 # deployment.main-serverに合わせる
      protocol: TCP
      targetPort: 8080　# deployment.main-serverに合わせる
  selector:
    app: main-server
  type: LoadBalancer　

---
apiVersion: v1
kind: Service
metadata:
  name: auth-server
  labels:
    app: auth-server
spec:
  ports:
    - nodePort: 30002
      port: 8050 # deployment.auth-serverに合わせる
      protocol: TCP
      targetPort: 8050 # deployment.auth-serverに合わせる
  selector:
    app: auth-server
  type: LoadBalancer
```

上記二つのファイルを保存したら下記のコマンドで反映させます。
```terminal
$ kubectl apply -f deployment.yml
deployment.apps/main-server created
deployment.apps/auth-server created
$ kubectl apply -f service.yml
service/main-server created
service/auth-server created
```

下記のようになっていたらOKです！！
```
$ kubectl get pods,svc 
NAME                               READY   STATUS    RESTARTS   AGE
pod/auth-server-74f985876f-8sdjq   1/1     Running   0          19m
pod/auth-server-74f985876f-tlwtk   1/1     Running   0          19m
pod/main-server-85847975c-4qr54    1/1     Running   0          19m
pod/main-server-85847975c-kr5hf    1/1     Running   0          19m

NAME                  TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/auth-server   LoadBalancer   10.96.119.111    <pending>     8050:30002/TCP   18m
service/main-server   LoadBalancer   10.103.216.224   <pending>     8080:30001/TCP   18m
```
そしたら実際にlocalhostからアクセスできるようにします。

```terminal
$ minikube tunnel
✅  トンネルが無事開始しました

📌  注意: トンネルにアクセスするにはこのプロセスが存続しなければならないため、このターミナルはクローズしないでください ...

🏃  auth-server サービス用のトンネルを起動しています。
🏃  main-server サービス用のトンネルを起動しています。
```
このようになったらcurlで確認してみましょう
```terminal
$ curl http://localhost:8080/hello
{"message":"Hello World!"}%
$ curl http://localhost:8050/hello
{"message":"Hello World!"}%
```
## まとめ
記事を書いてみましたが、ingressやserviceのtypeなどまだ基礎理解が足りないなと思いました。
学習出来次第追記していきます。