(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】MetalLBにてLoadBalancerを利用する

スポンサーリンク

はじめに

オンプレミス環境に構築したKubernetesではServiceにて type: LoadBalancerと記載して起動するも、External-IPの箇所がpendingのままでIPアドレスが割り当てられません。

本記事では以下のベアメタルサーバで動作するKubernetesにロードバランサ機能を提供するMetalLBを利用してngixnのPodをLoadBalancerに紐づけてみます。

環境情報
  • MetalLB v0.9.4
  • kubeadm v1.15.1

インストール

上記リンクに記載の通りで以下の手順にて必要なリソースを作成します。

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

その中で以下のイメージが利用されます。

metallb/controller:v0.9.4
metallb/speaker:v0.9.4

正常に立ち上がると以下のようにPod群が立ち上がります。

# kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-6447bdd8f6-rn6xw   1/1     Running   0          52s
pod/speaker-2kds5                 1/1     Running   0          52s
pod/speaker-6k6c4                 1/1     Running   0          52s
pod/speaker-qmpzv                 1/1     Running   0          52s
pod/speaker-tgc58                 1/1     Running   0          52s
..

今回は1MasterNode+3WorkerNodeの構成のためdaemonset.appsとして動くspeakerは4つ起動しています。

最後にLoadBalancerとして割り当てるIPアドレスの範囲を記載したConfigMapを展開するとインストール完了です。

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.200.200.120-10.200.200.122

LoadBalancerを利用する

nginxのPodを動かした状態で以下のサービスを起動すると

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx
  type: LoadBalancer
status:
  loadBalancer: {}

以下のように外部IPアドレスが割り当てられた状態でロードバランサが起動します。

# kubectl get service
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S) ...
nginx        LoadBalancer   10.108.83.30   10.200.200.120

Kubernetesのクラスター外のサーバからでも同IPめがけて通信が可能です。

# curl 10.200.200.120:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

EXTERNAL-IPの実体はどこなのか?

同ロードバランサのIPアドレスをARPテーブルで確認すると同じMACアドレスを持つIPアドレスがあります。

# ip n
...
10.200.200.120 dev ens192 lladdr 00:50:XX:XX:3b:6f REACHABLE
...
10.200.200.11 dev ens192 lladdr 00:50:XX:XX:3b:6f REACHABLE
...

このIPアドレスはnginxのPodが展開されているWorkerNodeのIPアドレスで、試しにPodを別のWorkerNodeに移すと同MACアドレスはそのWorkerNodeのMACアドレスに変化します。

終わりに

MetalLBを利用すれば、クラウド上に用意したKubernetesではない環境でもIPアドレスが動的にアサインされます。
そして、この動的にアサインされるIPアドレスの実体は各WorkerNodeに紐づいており、Podを複数にした場合でも問題なくロードバランサできているので、まずはARPに記載があるNodeに飛んだ後にNode間に振り分けていると考えられます。

以上、ご参考になれば幸いです。