VPSに乗せていたappを自宅のオンプレに移す試み(PCからアクセスできるところまで)

スポンサーリンク
個人開発

はじめに

前回までで、アプリをhelmで動かすところと、ingress-nginx-controllerとmetalLBの設定まで完了しました。

今回は、インターネット公開する前にまずは自分のPCからアクセスできることを確認します。

k8sのネットワーク

おうちk8sの構築の際にトラベルルーターとスイッチも一緒に設置しました。

k8sってwifiで繋ぐし、そこでネットワーク組めばいいんじゃね?と思っていて、ちゃんとk8sのネットワークに見向きもしていませんでした。

このトラベルルーターとスイッチですることはk8sのノード間のネットワーク形成です。

実際のおうちk8sと構成図の関係は以下のようになります。

また、一応、トラベルルーターを部屋のwifiルーターとも接続しました。(今後、インターネット公開するときに役に立つ、、、はず、、、)

トラベルルーターの設定は以下のサイトを参考にしています。

ラズパイを外出先で簡単に無線LANに繋ぐには? – aptpod Tech Blog

PCからのアクセスをするまで

hostsファイルの設定

まず、PC側のhostsファイルの設定をします。

こちらに関しては以下のサイトが参考になります。

hostsファイルの設定方法(Windows) | マニュアル | サポート | レンタルサーバー CORESERVER(コアサーバー)
レンタルサーバー「コアサーバー」のサポートページです。初心者でも気軽に使えるようサポートにも力を入れています。ライブチャットやお問い合わせフォームも存分にご活用ください。

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つサービスがあるので、どちらもアクセスできるかを確認します。

無事確認できました。

最後に

ここに至るまでにとんでもなくハマっていました。。。

とりあえず、ブラウザからアクセス確認出来て良かったです。

タイトルとURLをコピーしました