zaki work log

作業ログやら生活ログやらなんやら

[Kubernetes] MetalLBがHelmを使ったインストールに対応してたのでお試し(on kind)

任意のKubernetesクラスタでLoadBalancerタイプのServiceを使えるようにできるMetalLBが0.10.0からHelmを使ったインストールに対応してるようなので試してみた。

以前書いたMetalLBって何?的なエントリはこちら。

zaki-hmkc.hatenablog.com

環境

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サーバーのマニフェストはこれ。

github.com