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がポンポン変わらないように、固定させる必要がありますが。