なになれ

IT系のことを記録していきます

おうちKubernetesクラスタでtype: LoadBalancerを試す

type: LoadBalancerは、ロードバランサーを表すKubernetesリソースです。
パブリッククラウドでのKubernetes環境であればLoadBalancerリソースを作成すると、各パブリッククラウドが提供するロードバランサーが作られて、Kubernetes環境でロードバランサーを扱うことができます。
しかし、自宅環境にKubernetesクラスタを構築する、いわゆる、おうちKubernetesクラスタでは、ロードバランサーがありません。
そんな環境でもMetalLBを使うことで、type: LoadBalancerを使うことができます。

metallb.universe.tf

今回はMetalLBのセットアップ、使い方を紹介します。
なお、今回の環境はFlannelを使用してKubernetes環境のネットワークをセットアップしています。

セットアップ

MetalLBのセットアップを行います。 まずは、下記のコマンドで、マニフェストを使ってMetalLBをインストールします。

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

metallb-systemというNamespaceにMetalLBの各リソースが作られます。

次に、MetalLBの設定ファイルをConfigMapリソースで用意します。

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

addressesのIPアドレスの範囲でIPアドレスが選択されて、LoadBalancerリソースが機能します。
この値はご自身のローカルネットワーク環境に合わせて変更が必要です。

ConfigMapのマニフェストをapplyします。

$ kubectl apply -f config.yaml

これでMetalLBのセットアップは完了です。
あとは、type: LoadBalancerのKubernetesリソースを作成するだけで利用できます。

動作確認

nginxを起動して、LoadBalancer経由でアクセスできるかを確認します。

まずは、以下のマニフェストでnginxを起動します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
        ports:
        - containerPort: 80

次に、以下のマニフェストで、 nginxにつながるLoadBalancerリソースを用意します。

apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment-lb
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

LoadBalancerリソースを確認すると、EXTERNAL-IPでIPアドレスが割り振られていることが確認できます。

$ kubectl get svc
NAME                  TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
nginx-deployment-lb   LoadBalancer   10.106.248.160   192.168.3.241   80:30159/TCP   20h

MetalLBがない場合、この値はpendingのままになってしまいます。

LoadBalancerリソースが機能していることを確認したので、curlでアクセスしてみます。

$ curl 192.168.3.241
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
...
</body>
</html>

アクセスできることが確認できます。

まとめ

MetalLBを使えば、おうちのローカルネットワークでロードバランサーが用意できます。
しかも、とてもお手軽です。

参考