26 K3s上のMetalLB (レイヤ3モードを使用) #
MetalLBは、標準のルーティングプロトコルを使用する、ベアメタルKubernetesクラスタ用のロードバランサの実装です。
このガイドでは、MetalLBをレイヤ3 (L3) BGPモードでデプロイする方法について説明します。
26.1 MetalLBを使用する理由 #
MetalLBは、いくつかの理由により、ベアメタルKubernetesクラスタでの負荷分散に最適な選択肢です。
Kubernetesとのネイティブ統合: MetalLBはKubernetesとシームレスに統合されており、使い慣れたKubernetesツールとプラクティスを使用して簡単にデプロイおよび管理できます。
ベアメタルとの互換性: クラウドベースのロードバランサとは異なり、MetalLBは、従来のロードバランサが利用できない、または実現できないオンプレミスデプロイメント向けに特別に設計されています。
複数のプロトコルをサポート: MetalLBはレイヤ2モードとレイヤ3 BGP (Border Gateway Protocol)モードの両方をサポートし、さまざまなネットワークアーキテクチャと要件に柔軟に対応します。
高可用性: MetalLBは、負荷分散の責任を複数のノードに分散することで、サービスの高可用性と信頼性を保証します。
スケーラビリティ: MetalLBは大規模なデプロイメントに対応し、Kubernetesクラスタに合わせてスケーリングして需要の増加に対応します。
レイヤ2モードでは、1つのノードがローカルネットワークにサービスをアドバタイズする責任を負います。ネットワークの視点からは、マシンのネットワークインタフェースに複数のIPアドレスが割り当てられているように見えます。
レイヤ2モードの主な利点は、その汎用性です。あらゆるEthernetネットワークで動作し、特別なハードウェアも、高価なルータも必要ありません。
26.2 K3s上のMetalLB (L3を使用) #
このクイックスタートではL3モードを使用します。つまり、ネットワーク範囲内にBGP機能を備えた近隣ルータが必要です。
26.3 前提条件 #
MetalLBがデプロイされるK3sクラスタ。
BGPプロトコルをサポートするネットワーク上のルータ。
サービス用のネットワーク範囲内の空きIPアドレス。この例では
192.168.10.100
このIPアドレスが未割り当てであることを確認する必要があります。DHCP環境では、二重割り当てを避けるため、このアドレスをDHCPプールに含めないでください。
26.4 サービスIPアドレスをアドバタイズするための設定 #
すぐに利用可能なBGPは設定済みのすべてのピアにサービスIPアドレスをアドバタイズします。これらのピア(通常はルータ)は、各サービスIPアドレスに対して32ビットのネットワークマスクを持つルートを受け取ります。この例では、クラスタと同じネットワーク上にあるFRRベースのルータを使用します。その後、MetalLBのBGP機能を使用して、そのFRRベースのルータにサービスをアドバタイズします。
26.5 デプロイメント #
SUSEでは、SUSE Edgeソリューションの一部として公開されているMetalLB Helmチャートを使用します。
helm install \
metallb oci://registry.suse.com/edge/charts/metallb \
--namespace metallb-system \
--create-namespace
while ! kubectl wait --for condition=ready -n metallb-system $(kubectl get\
pods -n metallb-system -l app.kubernetes.io/component=controller -o name)\
--timeout=10s; do
sleep 2
done26.6 設定 #
この時点でインストールは完了します。
IPAddressPoolを作成します。
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: bgp-pool
namespace: metallb-system
labels:
app: httpd
spec:
addresses:
- 192.168.10.100/32
autoAssign: true
avoidBuggyIPs: false
serviceAllocation:
namespaces:
- metallb-system
priority: 100
serviceSelectors:
- matchExpressions:
- key: serviceType
operator: In
values:
- httpd
EOFBGPPeerを設定します。
FRRルータのASNは1000であり、BGPPeerは1001です。また、FRRルータのIPアドレスは192.168.3.140であることも確認できます。
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
namespace: metallb-system
name: mypeertest
spec:
peerAddress: 192.168.3.140
peerASN: 1000
myASN: 1001
routerID: 4.4.4.4
EOFBGPAdvertisement (L3)を作成します。
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
name: bgpadvertisement-test
namespace: metallb-system
spec:
ipAddressPools:
- bgp-pool
EOF26.7 使用法 #
サービスを含むサンプルアプリケーションを作成します。この場合、そのサービスに対する
IPAddressPoolからのIPアドレスは192.168.10.100です。
cat <<- EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
namespace: metallb-system
labels:
app: httpd
spec:
replicas: 3
selector:
matchLabels:
pod-label: httpd
template:
metadata:
labels:
pod-label: httpd
spec:
containers:
- name: httpdcontainer
image: image: docker.io/library/httpd:2.4
ports:
- containerPort: 80
protocol: TCP
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: http-service
namespace: metallb-system
labels:
serviceType: httpd
spec:
selector:
pod-label: httpd
type: LoadBalancer
ports:
- protocol: TCP
port: 8080
name: 8080-tcp
targetPort: 80
EOF確認するには、FRRルータにログオンし、BGPアドバタイズメントから作成されたルートを確認できます。
42178089cba5# show ip bgp all
For address family: IPv4 Unicast
BGP table version is 3, local router ID is 2.2.2.2, vrf id 0
Default local pref 100, local AS 1000
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
* i172.16.0.0/24 1.1.1.1 0 100 0 i
*> 0.0.0.0 0 32768 i
* i172.17.0.0/24 3.3.3.3 0 100 0 i
*> 0.0.0.0 0 32768 i
*= 192.168.10.100/32
192.168.3.162 0 1001 i
*= 192.168.3.163 0 1001 i
*> 192.168.3.161 0 1001 i
Displayed 3 routes and 7 total paths
kubectl get svc -n hello-kubernetes
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-kubernetes LoadBalancer 10.43.127.75 192.168.122.11 80:31461/TCP 8sこのルータがネットワークのデフォルトゲートウェイである場合、そのネットワーク上のボックスから
curlコマンドを実行し、httpdサンプルアプリに到達できることを確認できます。
# curl http://192.168.10.100:8080
<html><body><h1>It works!</h1></body></html>
#