k8sのserviceにtype: LoadBalancer指定すると複数プロトコルが指定できない

Pocket

例えば

 ゲーム用のDedicated Serverによくありがちな、ConnectionにUDPをQueryにTCPを使用するような、1プロセスで複数のプロトコルを併用するようなプロセスをKubernetes環境に載せようとする。

 このような、UDPとTCPが混在しているServiceをデプロイしようとする。type: NodePortを使用している場合は(恐らくは)問題ないけれど、type: LoadBalancerを使用する環境だと下記の様なエラーが返る。

 このKubernetes環境ではL4LBとしてMetalLBで、L7LBとしてIngressでそれぞれLBが収容しているので、Bare-Metalなk8s環境でLBを用意していないが、type: LoadBalancerを使用することができる。

原因と対策

 単純に、type: LoadBalancerはmixed protocolsをサポートしない。今後のk8sも恐らくサポートされない。詳細はこのPull Reqestが詳しいと思う。
Allow for mixed UDP/TCP ports on LoadBalancer Services by Miouge1 · Pull Request #64471 · kubernetes/kubernetes · GitHub
 そもそもMetalLBの様なUDPをサポートするLoadBalancerの方が例外的で、通常はTCPの負荷分散に使用される。なのでMixedでLoadBalancer指定はどちらかと言えば例外的(本来は必要ない)と思う。

対策

 単純に「別々のserviceを作成する」のが正しい。

 ただし、そのままではプロトコル別にIPアドレスを分けないとMetalLBのRouterからアドレスが割り当てられないので(恐らくPendingの状態で止まると思う)、annotationを付けて調整する必要がある。

 annotationのvalueが、そのまま関連付けるserviceのsharing key(関連付けの為のキー)になるので、適当な一意の名前付けをする。
 詳細はMetalLBのドキュメントが詳しい。
MetalLB, bare metal load-balancer for Kubernetes

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください