自由帳

とりとめのない学習メモです。主に Web サービスのシステム基盤や運用に関することを書いています

kubeadmで作ったK8sクラスターにMetalLBとNginx Ingress Controllerを導入した手順メモ

kubeadmで作ったKubernatesクラスターにMetalLBとNginx Ingress Controllerを導入したのでその時にやった手順をメモしておく。

MetalLBとNginx Ingress ControllerはKubernates内部でのロードバランシングに利用する。前者はL4、後者はL7レベルのロードバランシングを行う。

環境

  • プラットフォーム さくらのVPS 3台 (k8s master * 1, k8s worker * 2)
  • OS: Ubuntu 18.04
  • kubernatis: 1.17.1
  • Docker: 19.03.5

事前準備

上記の環境でkubeadmでのk8sクラスターをセットアップできている状態で、MetalLBやNginx Ingress Controllerを導入する。

MetalLBのセットアップ

MetalLBのマニフェストファイルを取得する。

$ wget https://raw.githubusercontent.com/google/metallb/master/manifests/metallb.yaml

このままでも使えるが、Podを配置するノードだけ指定しておく。 ここでは1台目のWorkerノードに配置することとする。

まず、Workerノードにラベルをつけていない場合はラベルをつける。 そのために以下のコマンドをMasterノードで実行する。host-01,host-02の部分は環境に合わせて置き換える。

$ kubectl label node host-01 node-role.kubernetes.io/worker1=
$ kubectl label node host-02 node-role.kubernetes.io/worker2=

続いて、上記のラベルを設定したノードにPodがデプロイされるようにマニフェストファイルを編集する。 DaemonSetとDeploymentのspecフィールドの中のspecオブジェクト(Podの状態を定義するオブジェクト)の最後に以下を記載する。+の部分が追記部分となる。

:
  ---
  apiVersion: apps/v1
  kind: DaemonSet
  metadata:
    labels:
      app: metallb
      component: speaker
    name: speaker
    namespace: metallb-system
  spec:
    :
      spec:
        :
+       tolerations:
+       - effect: NoSchedule
+         key: node-role.kubernetes.io/worker1
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    labels:
      app: metallb
      component: controller
    name: controller
    namespace: metallb-system
  spec:
    :
      spec:
        :
+       tolerations:
+       - effect: NoSchedule
+         key: node-role.kubernetes.io/worker1

設定できたらapplyする。

$ kubectl apply -f metallb.yaml

masterノード以外にPodがデプロイされていることを確認する。

$ kubectl get pod -n metallb-system -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE                            NOMINATED NODE   READINESS GATES
controller-5df7dc969b-rrgwb   1/1     Running   0          20d   10.244.2.20   Node名               
speaker-9mppl                 1/1     Running   2          20d   10.1.0.130    Node名               
speaker-fk8wq                 1/1     Running   0          20d   10.1.0.131    Node名               

続いてMetalLBのモードの設定をする。 BGPモードとL2モードがあるが、BGPはBGPルータなどの専用機器が必要なのと、そもそもL2モードで十分なのでその設定をする。

$ wget https://raw.githubusercontent.com/metallb/metallb/main/manifests/example-layer2-config.yaml -O metallb-layer2-config.yaml

基本的にこのままで使えるが、addressesの部分だけ、利用したいExternal IPのレンジを設定する。

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - ***.***.***.***/32

これもapplyする。

$ kubectl apply -f metallb-layer2-config.yaml

Nginx Ingress Controllerのセットアップ

L7ロードバランサも設定する。マニフェストファイルを取得する。

まずIngress Contollerのデプロイメントを作成する。

$ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

これもMetalLBと同様に1台目のWorkerノードに配置することとする。

  ---

  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: nginx-ingress-controller
    namespace: ingress-nginx
    labels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  spec:
    :
      spec:
        :
+       tolerations:
+       - key: "node-role.kubernetes.io/worker1"
+         effect: "NoSchedule"

デプロイする。

$ kubectl apply -f mandatory.yaml

続いて、Ingress Contollerのサービスを作成する。

$ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml

これはそのままapplyすれば良い。

$ kubectl apply -f cloud-generic.yaml

確認

これでExternal-IPにアクセスしてNginxの404ページが表示されればとりあえず完了。

まとめ

kubeadmで作成したk8sクラスター上にMetalLBとNginx Ingress Controllerをデプロイしてみた時の手順を書いた。

参考