半農半エンジニアの記録

関西在住エンジニア。個人で勉強・開発したこと、その他趣味のことを書いてます。農業してます。

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コンソールではサービスには青チェックついてて正常に動いてるように見えるのに、アクセスしたら動いてない、というのも微妙。

サービス→イベント を見てようやくエラー出てることに気づきました。