MetalLB
Bare Metal k8sでLoadBalancer Serviceを提供する
参考
https://makeoptim.com/en/service-mesh/kubeadm-kubernetes-istio-setup#metallb
https://zenn.dev/vampire_yuta/articles/ccbc57be8e092a
L2 modeとBGP modeがある。
ノードにアサインされたExternal IPをどう外部ネットワークに広報するか
未対応CNIがあるので注意。
サポートCNI: https://metallb.universe.tf/installation/network-addons/
setup
code:sh
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.6/manifests/metallb.yaml
# 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から来たパケットの転送方式
https://note.com/minato_kame/n/n9450e460b78c
https://medium.com/@satishpandey2013/kubernetes-external-traffic-policies-their-cffea1a8cc32
外部IPパケット受信時のPodへの転送をどうするか
Cluster
着信したノードから必要なPODに転送
kube-proxy経由でiptableいじってNATして必要な外部ノードのPODへ転送。
Local
着信したノードのPODにのみ転送
ほかのノードへは転送しない