任意のKubernetesクラスタでLoadBalancerタイプのServiceを使えるようにできるMetalLBが0.10.0からHelmを使ったインストールに対応してるようなので試してみた。
以前書いたMetalLBって何?的なエントリはこちら。
環境
Helm は3.6.2
$ helm version --short v3.6.2+gee407bd
Kubernetesクラスタはkindを使ってv1.21.1で作成。
$ kubectl get node NAME STATUS ROLES AGE VERSION july-control-plane Ready control-plane,master 75s v1.21.1 july-worker Ready <none> 40s v1.21.1 july-worker2 Ready <none> 40s v1.21.1
kindクラスタ自体はtype:LoadBalancer Serviceに対応してないので、デプロイしようとしてもこの通り使えない。(pendingのまま)
$ kc get pod,svc -n sample-app NAME READY STATUS RESTARTS AGE pod/sample-http-6c94f59975-7bskg 0/1 ContainerCreating 0 3s pod/sample-http-6c94f59975-fvjcr 1/1 Running 0 3s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/sample-http2 LoadBalancer 10.96.41.222 <pending> 80:32215/TCP 3s
MetalLBインストール with Helm
手順は公式ドキュメントの通り。
https://metallb.universe.tf/installation/#installation-with-helm
リポジトリ追加
[zaki@cloud-dev ~]$ helm repo add metallb https://metallb.github.io/metallb "metallb" has been added to your repositories [zaki@cloud-dev ~]$ helm repo list NAME URL prometheus-community https://prometheus-community.github.io/helm-charts rook-release https://charts.rook.io/release stable https://charts.helm.sh/stable grafana https://grafana.github.io/helm-charts elastic https://helm.elastic.co metallb https://metallb.github.io/metallb
チャートとデフォルト値の確認
インストールできるチャートはこんな感じ。
[zaki@cloud-dev ~]$ helm search repo metallb NAME CHART VERSION APP VERSION DESCRIPTION metallb/metallb 0.10.2 v0.10.2 A network load-balancer implementation for Kube... stable/metallb 0.12.1 0.8.1 DEPRECATED MetalLB is a load-balancer implement...
デフォルト値は以下で確認できる。
$ helm show values metallb/metallb
SecurityContextとか微妙に違うけど、値はここの内容かな?
https://github.com/metallb/metallb/blob/main/charts/metallb/values.yaml
インストール
カスタマイズYAMLでtype:LoadBalancer Serviceに割り当てるアドレスを設定できるのでファイルを作成。
従来のConfigMapの設定だとアドレスレンジを記述するけど、HelmのカスタマイズYAMLはネットワークアドレスとマスクを記載するようになってる。(従来の書き方の可否は試してない)
ちなみにkindクラスタでLoadBalancerに使えるアドレスレンジは、docker network ls
で確認できるkind
って名前のDockerのブリッジネットワークのアドレスをdocker network inspect kind
で確認できるので、そこから余りそうなアドレスを使うってやりかたで合ってたっぽい。
手元の環境のkindクラスタで使うDockerコンテナのアドレス設定はこんな感じ。
[zaki@cloud-dev ~]$ docker network inspect -f '{{.IPAM.Config}}' kind [{172.19.0.0/16 172.19.0.1 map[]} {fc00:f853:ccd:e793::/64 fc00:f853:ccd:e793::1 map[]}]
これを元にkindクラスタ用のアドレス設定。
configInline: address-pools: - name: default protocol: layer2 addresses: - 172.19.255.0/24
このファイルを指定してHelmチャートをインストール
[zaki@cloud-dev ~]$ helm install metallb metallb/metallb -f ~/local/kind/helm/values/values.yaml W0702 07:42:47.328620 36865 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ W0702 07:42:47.331087 36865 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ W0702 07:42:47.371780 36865 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ W0702 07:42:47.372231 36865 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ NAME: metallb LAST DEPLOYED: Fri Jul 2 07:42:47 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: MetalLB is now running in the cluster. LoadBalancer Services in your cluster are now available on the IPs you defined in MetalLB's configuration: config: address-pools: - addresses: - 172.19.255.0/24 name: default protocol: layer2 To see IP assignments, try `kubectl get services`.
あ、defaultネームスペースにデプロイされてる。
[zaki@cloud-dev ~]$ kubectl get pod,cm -n default NAME READY STATUS RESTARTS AGE pod/metallb-controller-748756655f-b9r85 1/1 Running 0 35s pod/metallb-speaker-mn59v 1/1 Running 0 35s pod/metallb-speaker-rttht 1/1 Running 0 35s pod/metallb-speaker-wdkqn 1/1 Running 0 35s NAME DATA AGE configmap/kube-root-ca.crt 1 40m configmap/metallb 1 35s
[zaki@cloud-dev ~]$ kubectl get pod,svc -n sample-app NAME READY STATUS RESTARTS AGE pod/sample-http-6c94f59975-7bskg 1/1 Running 0 84s pod/sample-http-6c94f59975-fvjcr 1/1 Running 0 84s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/sample-http2 LoadBalancer 10.96.41.222 172.19.255.0 80:32215/TCP 84s
お
[zaki@cloud-dev ~]$ curl 172.19.255.0 <html><body><h1>It works!</h1></body></html>
動いた。
MetalLB本体をデプロイするネームスペースはdefault
でも良いのね。
カスタマイズYAML無しでインストールした場合
カスタマイズYAML無しでインストールした場合はConfigMapが作成されないので、そのままではtype:LoadBalancer Serviceは作成できないけど、あとからでもConfigMapを作成すればOK
apiVersion: v1 kind: ConfigMap metadata: name: metallb data: config: | address-pools: - name: default protocol: layer2 addresses: - 172.19.255.0-172.19.255.50
ただ、従来の手動でインストールした場合と、ConfigMapのリソース名が異なるので注意。(以前はconfig
だったはずだけど、Helm版はmetallb
になってる)
サンプルに使ったhttpサーバーのマニフェストはこれ。