MetalLB
Bare Metal k8sでLoadBalancer Serviceを提供する 参考
L2 modeとBGP modeがある。
ノードにアサインされたExternal IPをどう外部ネットワークに広報するか
未対応CNIがあるので注意。
setup
code:sh
# On first install only
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
code:config
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2 #L2 mode addresses:
- 172.16.50.147-172.16.50.148 #Update this with your Nodes IP range EOF
次の二種類で構成
Controlelr
Metallbリソースの監視、また各サービスへのIP Addressの割り振り管理
新しいLoadBalancer Serviceの追加を検知してアドレスプールからIPを各サービスに割り当て
各Speakerにもつべき外部IP情報を伝達
実際のパケット処理については何もしてないので、落ちてもMetalLBの外部IPの割り当ては問題ない
Speaker
SpeakerがL2モードならARP応答、BGPモードならBGP speaker として各ノードごとに一つ動く。
speakerはControlelrから割り当てられた外部IPのARP応答、またはBGP広報によってパケットを吸い込む
受け取った外部IPパケットはkube-proxyによってDNATされて適切なPODにフォワーディングされる
externalTrafficPlicy
クラスタ外部IPから来たパケットの転送方式
外部IPパケット受信時のPodへの転送をどうするか
Cluster
着信したノードから必要なPODに転送
kube-proxy経由でiptableいじってNATして必要な外部ノードのPODへ転送。
Local
着信したノードのPODにのみ転送
ほかのノードへは転送しない