このページにはベアメタル 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 分散どちらもしていません。