インフラ系SEの技術メモ

雑なエンジニアが低信頼性のメモを書いています。参考程度にとどめてください。

オンプレKubernetesでLoadBalancerを展開してもただのNodePortになる話

LoadBalancerが使いたい

NodePortはPodが展開しているNodeのIPアドレスを打ち込む必要があるので、ロードバランサのような別IPに打てばよしなにPodに展開して欲しいものです。

そのようなServiceとしてLoadBalancerがKubernetesではありますが、Cloudのようにロードバランサを用意している環境であればさくっと外部IPが割り当てられServiceに紐づけてくれますが、オンプレだとそうはいきません。

どうなるのか?

例えば

$ kubectl expose deployment nginx --port=80 --type=LoadBalancer 

のようにロードバランサを指定するとサービスとして

nginx  LoadBalancer x.x.x.x  <pending> 80:30080/TCP

といったようなサービスができます。

ここでx.x.x.xはクラスターIPなのでクラスターに属していれば打てますが外部からは打てない。
というわけで本来は pending の箇所に外部IPが付与されるんですがこれがされないという話。
ただし、30080のようにNodeIPはできているのでPodが展開しているノード宛てに通信をかければ外部から疎通はできます。

手動でIPアドレスを入れても意味がないので、残念。

どうすればいいのか?

HAProxyやNginxを自前でロードバランサとして立てて、各WorkerNodeのIPに割り振れば同等のことはできそうです。
NodePortがポンポン変わらないように、固定させる必要がありますが。