Kubernetes の Ingress を通した HTTP リクエストから、接続元のグローバルIPアドレスを取得しようとしたが、Kubernetes のローカルネットワークの IPアドレスが取得できてしまい、うまくいかなかった。
Kubernetes を microk8s にして、組み込みのイングレスコントローラーを使ってみたところ、グローバルのリモートIPアドレスが取得できたのでメモする。
ノードの OS は Ubutnu 20.04
2021年。
LAN は 192.168.0.0/24 で、Kubernetes ノードも、リクエスト元の PC も、192.168.0.X の IPアドレスとなっている。
Rancher を Docker で起動し、その中で起動したビルトインの k3s クラスターに対して、
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml
これでイングレスコントローラーを構築した。
nginx の Podを起動して、 Ingress 経由でリクエストを行い、アクセスログを確認したところ、
X-Real-IP: 10.42.0.1
X-Forwarded-For: 10.42.0.1
となった。これは、Kubernetes 内のゲートウェイの IP アドレスだった。
これを、本来の接続元の PC の IP アドレスにしたかったが、有用な情報は見つけられなかった。
2022年。
上記 Kubernetes クラスターを廃棄し、新しく MicroK8s を作成。
sudo snap install microk8s --classic
Ingress コントローラーを有効化
microk8s enable dns ingress
これで、Ingress マニフェスト等が1と同じ構成にして、リクエストしたところ、
X-Real-IP: 192.168.0.159
X-Forwarded-For: 192.168.0.159
となっており、クライアントの正しいIPアドレスが取得できていた。
コメント