きっかけ
現在ローカル環境でminikubeを使った開発を学習しています。
ただローカル環境上のReactにminikube上のAPIを叩こうとすると、発行するURLが毎回変わってしまい接続ができない状態になる。
なのでこのURLが変わらないようにしたい。
$ 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 上で使用しているため、実行するにはターミナルを開く必要があります。
前提
$ 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は下記のように設定してください。
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にしてください。
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
上記二つのファイルを保存したら下記のコマンドで反映させます。
$ 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からアクセスできるようにします。
$ minikube tunnel
✅ トンネルが無事開始しました
📌 注意: トンネルにアクセスするにはこのプロセスが存続しなければならないため、このターミナルはクローズしないでください ...
🏃 auth-server サービス用のトンネルを起動しています。
🏃 main-server サービス用のトンネルを起動しています。
このようになったらcurlで確認してみましょう
$ curl http://localhost:8080/hello
{"message":"Hello World!"}%
$ curl http://localhost:8050/hello
{"message":"Hello World!"}%
まとめ
記事を書いてみましたが、ingressやserviceのtypeなどまだ基礎理解が足りないなと思いました。
学習出来次第追記していきます。