概要
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