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 をダウンロード

    curl -O https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
    
  2. Controller が master Node に配置されるよう修正

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

    
    … (省略) …
    
    ---
    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 上に展開

    kubectl apply -f metallb.yaml
    

設定

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

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

    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 上に適用

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

    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 を含むサービスを展開

    kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/tutorial-2.yaml
    
  2. Pod 、 Service が起動していることを確認

    kubectl get pods,services
    
    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)へアクセス

  • 必要に応じてテストに使った Deployment と Service を削除

    kubectl delete -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/tutorial-2.yaml
    

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

参考記事

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