MetalLB L2 モードのネットワークの振る舞い確認

このページにはベアメタル Kubernetes 環境向けのロードバランサーである MetalLB L2 モードのネットワークの振る舞いについて書かれています。

MetalLB L2 モード #

MetalLB L2 モードはさまざまなサイト等でも言われているとおり、負荷分散はしません。 それがどういう意味なのかを確認していきます。

実験用に Nginx の Deployment リソースとロードバランスリソースを作成します。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-lb-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.12
        ports:
          - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: test-lb
spec:
  type: LoadBalancer
  ports:
    - name: "http-port"
      protocol: "TCP"
      port: 18080
      targetPort: 80
  selector:
    app: nginx

私の環境では、192.168.0.211 という IP アドレスが割り振られました。

$ kubectl get svc                          
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)           AGE
kubernetes   ClusterIP      10.43.0.1      <none>          443/TCP           14h
test-lb      LoadBalancer   10.43.216.98   192.168.0.211   18080:30400/TCP   25m

同一ネットワーク内のマシンからアクセスしてみます。

$ curl 192.168.0.211:18080
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

無事、Nginx にアクセスできています。

同マシンから ARP テーブルを確認します。

$ arp -a
_gateway (192.168.0.1) at 6c:e4:da:63:dd:9f [ether] on enp0s31f6
? (192.168.0.211) at dc:a6:32:70:26:71 [ether] on enp0s31f6

192.168.0.211 には dc:a6:32:70:26:71 という MAC アドレスが対応しております。

Nginx Pod が起動しているワーカノードの MAC アドレスを確認します。

$ ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether dc:a6:32:70:26:71 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.83/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 240f:104:a021:1:dea6:32ff:fe70:2671/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 265sec preferred_lft 265sec
    inet6 fe80::dea6:32ff:fe70:2671/64 scope link
       valid_lft forever preferred_lft forever

先ほどの MAC アドレスのインターフェースがありました。 これで、割り当てられた IP アドレス向けのメッセージが特定のワーカーノードにトラフィックが向くことがわかります。

なお詳細は省略しますが、各ノードには iptables で 192.168.0.211:18080 宛のトラフィックがすべて同一の Nginx Pod 向けにトラフィックをフォワードする設定が入っております。

これらの設定をみると MetalLB L2 モードは負荷分散をしないといわれる所以がわかります。 ノード分散も Pod 分散どちらもしていません。