おうちKubernetesクラスタでtype: LoadBalancerを試す
type: LoadBalancerは、ロードバランサーを表すKubernetesリソースです。
パブリッククラウドでのKubernetes環境であればLoadBalancerリソースを作成すると、各パブリッククラウドが提供するロードバランサーが作られて、Kubernetes環境でロードバランサーを扱うことができます。
しかし、自宅環境にKubernetesクラスタを構築する、いわゆる、おうちKubernetesクラスタでは、ロードバランサーがありません。
そんな環境でもMetalLBを使うことで、type: LoadBalancerを使うことができます。
今回は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を使えば、おうちのローカルネットワークでロードバランサーが用意できます。
しかも、とてもお手軽です。