概要

Kubernetesで複数ノードで分散処理する場合、
Kubernetesには負荷分散機能がなく、AWSやAzureなどのクラウドサービスが提供する負荷分散装置と連携して外部公開用のIPアドレスを用意する。
オンプレの場合、MetalLBを利用することで負荷分散を実現でき、外部公開用のIPを用意できる。
※これがないとPodがノード間を移動した際に外部からアクセスするIPも変わってしまう。
※MetalLBを使わずに独自に負荷分散機能を構築してもOK、かなり面倒そうだけど。。

https://metallb.universe.tf/ external_link

インストール

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml $ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml $ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

設定

addresses:にはKubernetesでNodeに割り当てる範囲を指定する

$ vim metallb-config.yaml
apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 172.16.0.1-172.16.0.253

設定を適用

$ kubectl apply -f metallb-config.yaml

アプリケーション毎の使い方

使うときは以下のようなLoadBalancerサービスを作成する

$ vim loadbalancer.yaml
apiVersion: v1 kind: Service metadata: name: loadbalancer-nextcloud1 spec: type: LoadBalancer ports: - name: "http-port" protocol: "TCP" port: 8080 # LBの待受ポート targetPort: 80 # Podの待受ポート selector: io.kompose.service: nextcloud1 # 対象ポッドのラベルを指定
$ kubectl apply -f loadbalancer.yaml

複数のアドレスプールを使いこなす

  • 以下でできるらしい(まだ試していない)
    アドレスプールは複数用意することができ、特定のアドレスプールからIPを割り当てたい場合はtype: LoadBalancerのアノテーションにmetallb.universe.tf/address-pool: <ADDRESS_POOL_NAME>を追加します。
    <参照> https://blog.web-apps.tech/type-loadbalancer_by_metallb/ external_link