documentation.suse.com / SUSE Edgeドキュメント / ハウツーガイド / K3s上のMetalLB (レイヤ3モードを使用)

26 K3s上のMetalLB (レイヤ3モードを使用)

MetalLBは、標準のルーティングプロトコルを使用する、ベアメタルKubernetesクラスタ用のロードバランサの実装です。

このガイドでは、MetalLBをレイヤ3 (L3) BGPモードでデプロイする方法について説明します。

26.1 MetalLBを使用する理由

MetalLBは、いくつかの理由により、ベアメタルKubernetesクラスタでの負荷分散に最適な選択肢です。

  1. Kubernetesとのネイティブ統合: MetalLBはKubernetesとシームレスに統合されており、使い慣れたKubernetesツールとプラクティスを使用して簡単にデプロイおよび管理できます。

  2. ベアメタルとの互換性: クラウドベースのロードバランサとは異なり、MetalLBは、従来のロードバランサが利用できない、または実現できないオンプレミスデプロイメント向けに特別に設計されています。

  3. 複数のプロトコルをサポート: MetalLBはレイヤ2モードとレイヤ3 BGP (Border Gateway Protocol)モードの両方をサポートし、さまざまなネットワークアーキテクチャと要件に柔軟に対応します。

  4. 高可用性: MetalLBは、負荷分散の責任を複数のノードに分散することで、サービスの高可用性と信頼性を保証します。

  5. スケーラビリティ: 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
done

26.6 設定

  1. この時点でインストールは完了します。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
EOF
  1. BGPPeerを設定します。

注記
注記

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
EOF
  1. BGPAdvertisement (L3)を作成します。

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: bgpadvertisement-test
  namespace: metallb-system
spec:
  ipAddressPools:
  - bgp-pool
EOF

26.7 使用法

  1. サービスを含むサンプルアプリケーションを作成します。この場合、そのサービスに対する 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
  1. 確認するには、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
  1. このルータがネットワークのデフォルトゲートウェイである場合、そのネットワーク上のボックスからcurlコマンドを実行し、httpdサンプルアプリに到達できることを確認できます。

# curl http://192.168.10.100:8080
<html><body><h1>It works!</h1></body></html>
#