はじめに
前回までで、アプリをhelmで動かすところと、ingress-nginx-controllerとmetalLBの設定まで完了しました。
今回は、インターネット公開する前にまずは自分のPCからアクセスできることを確認します。
k8sのネットワーク
おうちk8sの構築の際にトラベルルーターとスイッチも一緒に設置しました。
k8sってwifiで繋ぐし、そこでネットワーク組めばいいんじゃね?と思っていて、ちゃんとk8sのネットワークに見向きもしていませんでした。
このトラベルルーターとスイッチですることはk8sのノード間のネットワーク形成です。
実際のおうちk8sと構成図の関係は以下のようになります。

また、一応、トラベルルーターを部屋のwifiルーターとも接続しました。(今後、インターネット公開するときに役に立つ、、、はず、、、)
トラベルルーターの設定は以下のサイトを参考にしています。
ラズパイを外出先で簡単に無線LANに繋ぐには? – aptpod Tech Blog
PCからのアクセスをするまで
hostsファイルの設定
まず、PC側のhostsファイルの設定をします。
こちらに関しては以下のサイトが参考になります。

hostsで自分がアクセスする先のドメイン名を設定しましょう。
僕の場合は、「change-view.cospa-tank.com」になります。
でも、このままではPCからのアクセスできません。
$ curl change-view.cospa-tank.com
curl: (7) Failed to connect to change-view.cospa-tank.com port 80: No route to host
metalLBの設定の確認とwlan0の設定
ここでmetalLBの設定を確認してみましょう。
以下のコマンドはmasterノードで実施したもので、metalLBのspeakerについての確認コマンドです。
$ kubectl get pods -n metallb-system -l app.kubernetes.io/component=speaker -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
metallb-speaker-kqhm5 4/4 Running 0 7d 192.168.13.2 k8s-worker2 <none> <none>
metallb-speaker-mcxvq 4/4 Running 13 (13h ago) 7d 192.168.40.147 k8s-master <none> <none>
metallb-speaker-tkz6n 4/4 Running 0 7d 192.168.13.4 k8s-worker1 <none> <none>
metalLBのspeakerはARP・NDP・BGP
を使い、サービスの通信到達性を担保する機能を有します。
そして、ノードで1台ずつ動作します。
今回はクラスタのノードは3台あるため、speaker Pod が3つ作られるということです。
このうちの1つがanauncingしています。
anauncingは「このIPアドレスはこのノードが持ってますよ」とネットワークに知らせる状態であり、今回の外部IPアドレスをどのノードが持っているかを示すことになります。
ログを確認すると、
kubectl logs -n metallb-system metallb-speaker-tkz6n | grep "service has IP, announcing"
Defaulted container "speaker" out of: speaker, frr, reloader, frr-metrics, cp-frr-files (init), cp-reloader (init), cp-metrics (init)
{"caller":"main.go:420","event":"serviceAnnounced","ips":["192.168.13.2"],"level":"info","msg":"service has IP, announcing","pool":"default","protocol":"layer2","ts":"2025-06-24T14:13:28Z"}
{"caller":"main.go:420","event":"serviceAnnounced","ips":["192.168.13.2"],"level":"info","msg":"service has IP, announcing","pool":"default","protocol":"layer2","ts":"2025-06-24T14:13:28Z"}
{"caller":"main.go:420","event":"serviceAnnounced","ips":["192.168.13.2"],"level":"info","msg":"service has IP, announcing","pool":"default","protocol":"layer2","ts":"2025-06-24T14:13:28Z"}
で、metallb-system metallb-speaker-tkz6n podでanauncingしていることが分かります。
metallb-system metallb-speaker-tkz6nは上記で確認したようにk8s-worker1ノードで動いています。
k8s-worker1ノードで今回設定する192.168.40.11がwlan0で設定されていないといけません。
k8s-worker1:~ $ sudo ip addr add 192.168.40.11/24 dev wlan0
をしてあげましょう。
確認👇(ハイライトのところ)
k8s-worker1:~ $ ip a show wlan0
3: wlan0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether d8:3a:dd:88:72:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.40.187/24 brd 192.168.40.255 scope global dynamic noprefixroute wlan0
valid_lft 32182sec preferred_lft 32182sec
inet 192.168.40.11/24 scope global secondary wlan0
valid_lft forever preferred_lft forever
inet6 2405:1202:5095:4100::f253/128 scope global dynamic noprefixroute
valid_lft 236630sec preferred_lft 176150sec
inet6 2405:1202:5095:4100:797d:f4c2:59c6:d394/64 scope global dynamic noprefixroute
valid_lft 604799sec preferred_lft 544319sec
inet6 fe80::fe7f:1b07:355a:11f4/64 scope link noprefixroute
valid_lft forever preferred_lft forever
確認
ブラウザから確認してみます。
2つサービスがあるので、どちらもアクセスできるかを確認します。

無事確認できました。
最後に
ここに至るまでにとんでもなくハマっていました。。。
とりあえず、ブラウザからアクセス確認出来て良かったです。