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をデプロイしてみた時の手順を書いた。
参考
- Bare-metal considerations - NGINX Ingress Controller
- Kubernetesオブジェクトを理解する - Kubernetes
- Kubernetes API Reference Docs
- GitHub - metallb/metallb: A network load-balancer implementation for Kubernetes using standard routing protocols
- GitHub - kubernetes/ingress-nginx: NGINX Ingress Controller for Kubernetes
- 例:クラスタ上のイングレス・コントローラの設定
- Kubernetes on CentOS7 - Qiita
- オンプレでもIngressする - Qiita