GKEでServiceやらIngressにstaticIPを設定する
GKEでロードバランサを使用すると、type:LoadBalancerのServiceを作成する方法とtype:NodePortのServiceを作成してIngressを立てる方法があります。
どちらでもstaticIPを設定できますが、試しにやってるとエラーが出たのでメモ。
経緯
ロードバランサーにIngressを立てる前提で進めていたんですが、ポートで分ける必要が出たのでIngressのままではできないので、Service使ってできないかなと思いました。
※ Nginx Ingress Controller を使えばL4ロードバランスできる、みたいなことちらほら見かけましたが、設定見るとL7でやってるのと同じに見えた。
遭遇したエラー
先にIngressでstaticIPを設定できることを確認できていて、その時に予約したIPをそのままLoadBalancerで使おうとして発生しました。GKEのことを理解されている方であれば、この時点でもうお察しかと思います。
で、こんなエラーが出ました。
Error creating load balancer (will retry): failed to ensure load balancer for service default/lb1: requested ip "xxx.xxx.xxx.xxx" is neither static nor assigned to the LB
つまり
ロードバランサ作るのに失敗したよ。リクエストしたIPは静的じゃないしLBに割り当てられてないよ。
原因
静的 IP アドレスを使用したドメイン名の構成 | Kubernetes Engine のチュートリアル | Google Cloud
公式docにばっちり載ってました。
Service を使用してアプリケーションを公開する場合は、リージョン IP アドレスを作成する必要があります。次のセクションで説明するように、グローバル IP アドレスは Ingress リソースタイプでのみ機能します。
というわけでリージョンのIPを予約して設定してみたら、無事成功しました。
まとめ
Service使ってL7ロードバランスっぽいことができました!
複数のServiceに同じstaticIPを割り当てて、ポートで別のPodに向けてます。
これがk8sの思想に合ってるかはわかりません。。
余談
ちなみに解決したのでいいんですが、このエラーメッセージわかりにくくないですか?
一応staticIPやし。。
というのと、エラー出てるくせにGCPコンソールではサービスには青チェックついてて正常に動いてるように見えるのに、アクセスしたら動いてない、というのも微妙。
サービス→イベント を見てようやくエラー出てることに気づきました。