Kubernetes に MetalLB を デプロイ する方法

0 件のコメント

今回は「kubeadm を利用して構築した Kubernetes 環境に MetalLB (L4 ロードバランサー)の インストール方法」についてまとめます。

概要

L4ロードバランサーの1つである「MetalLB」を ベアメタル Kubernetes クラスタにインストールします。 「MetalLB」を導入することで「Service」の「LoadBalancer」が利用できるようになります。

この記事では「MetalLBの導入から動作確認まで」をまとめます。

前提

ベアメタル Kubernetes クラスタが構築されている前提での作業を想定しています。本記事の内容は以下の環境で動作確認しています。

  • Kubernetes v1.14
  • MetalLB v0.7.3

インストール

GitHub から metallb.yaml をダウンロードして環境にあわせて修正。 今回は Controller を master Node に配置し、 Speaker を 各 worker Node に配置します。 そのため、 Controller の Deployment だけ修正します。

  1. metallb.yaml をダウンロード

  2. Controller が master Node に配置されるよう修正

    今回は Controller の Deployment に対して nodeAffinity と toleratioins を設定しました。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    … (省略) …
     
    ---
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
      namespace: metallb-system
      name: controller
      labels:
        app: metallb
        component: controller
    spec:
      revisionHistoryLimit: 3
      selector:
        matchLabels:
          app: metallb
          component: controller
      template:
        metadata:
          labels:
            app: metallb
            component: controller
          annotations:
            prometheus.io/scrape: "true"
            prometheus.io/port: "7472"
        spec:
          serviceAccountName: controller
          terminationGracePeriodSeconds: 0
          securityContext:
            runAsNonRoot: true
            runAsUser: 65534 # nobody
          containers:
          - name: controller
            image: metallb/controller:v0.7.3
            imagePullPolicy: IfNotPresent
            args:
            - --port=7472
            - --config=config
            ports:
            - name: monitoring
              containerPort: 7472
            resources:
              limits:
                cpu: 100m
                memory: 100Mi
               
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop:
                - all
              readOnlyRootFilesystem: true
    # Add -START-
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: node-role.kubernetes.io/master
                    operator: Exists
          tolerations:
          - key: node-role.kubernetes.io/master
            operator: Exists
            effect: NoSchedule
    # Add -END-
    ---
  3. Kubernetes 上に展開

    1
    kubectl apply -f metallb.yaml

設定

  1. L2ロードバランサ用の設定を作成

    以下のような layer2-config.yaml ファイルを作成します。 IPアドレスのレンジは環境に合わせて修正します。 ここで指定された範囲で Service の EXTERNAL-IP が設定されます。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: metallb-system
      name: config
    data:
      config: |
        address-pools:
        - name: my-ip-space
          protocol: layer2
          addresses:
          - 10.51.2.10-10.51.2.20
  2. Kubernetes 上に適用

    1
    kubectl apply -f layer2-config.yaml
  1. Firewallの穴あけ

    1
    2
    3
    4
    sudo firewall-cmd --zone public --add-port 7472/tcp --permanent
    firewall-cmd --add-service=http --zone=public --permanent
    firewall-cmd --add-service=https --zone=public --permanent
    sudo firewall-cmd --reload

Firewallに関してはうまく動かなければ切ってしまったほうが早いかも… Firewallを停止したい場合は systemctl stop firewalld で停止させます。

動作確認

  1. Load Balancer を含むサービスを展開

  2. Pod 、 Service が起動していることを確認

    1
    kubectl get pods,services
    1
    2
    3
    4
    5
    6
    NAME                         READY   STATUS    RESTARTS   AGE
    pod/nginx-58df4bbfdd-vk6x9   1/1     Running   0          7m42s
     
    NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP        13d
    service/nginx        LoadBalancer   10.104.173.121   10.51.2.10    80:30291/TCP   7m42s

    Pod、Service が起動していればOK。起動しているサービスの EXTERNAL-IP でアクセスできる。

  3. ブラウザから http://10.51.2.10 (Service の EXTERNAL-IP)へアクセス

今回は「MetalLBの導入から動作確認まで」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

参考記事

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!