おうちKubernetesでたわむれる (2) ~MetalLB導入編~
MetalLBとは
MetalLBとは、ベアメタル環境で使用できるKubernetesのExternal Load Balancerの実装の一種で、ベアメタル環境Kubernetes用のL2ロードバランサー機能を提供してくれます.
MetalLBを追加することで、指定したレンジでIPアドレスを取得し、そのIPをエンドポイントとしてLAN内にServiceを公開できるようになります.
MetalLB導入
早速、構築済みのおうちKubernetesクラスタにMetalLBを導入していきます.
基本的に以下の手順に従えば導入できます.
Installation - MetalLB
まず、以下のコマンドを実行し、MetalLB用のnamespaceを作成します.
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
次に以下のコマンドを実行し、MetalLBのPodとserviceを作成します.
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml
そして、初めてMetalLBを導入するときのみ、以下のコマンドを実行します.
# On first install only
$ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
しかし、このままではMetalLBはちゃんと機能しない状態なので、以下のようなConfigMap用のYAMLファイルを作成し、MetalLBがデプロイされた名前空間と同じ名前空間(metallb-system)にkubectl apply -f config.yaml
コマンドでConfigMapをデプロイします.
adressesにはDHCP等で取得できるIPアドレスのレンジを指定してください.
筆者の場合は、k8s-master〜k8s-worker3が192.168.xxx.201-204となっているので、192.168.xxx.220-240を割り当てています.
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.xxx.220-192.168.xxx.240
ここまできたら、kubectl get pod,svc -n metallb-system
コマンドを実行し、MetalLBがちゃんと動作してるかどうかを確認します.
$ kubectl get pod,svc -n metallb-system
NAME READY STATUS RESTARTS AGE
pod/controller-65db86ddc6-v858x 1/1 Running 0 34m
pod/speaker-5hj9k 1/1 Running 0 34m
pod/speaker-jp5jb 1/1 Running 0 34m
pod/speaker-pkz6l 1/1 Running 0 34m
pod/speaker-zbh8v 1/1 Running 0 34m
またMetalLBが指定したserviceに対してちゃんと外部IPアドレスを割り当ててくれるか確認するために、適当なディレクトリに以下のようなYAMLファイルを作成し、kubectl apply -f xxxx.yaml
コマンドで適用させます.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
kubectl get svc
コマンドで、serviceを取得し、作成したserviceにExternalIPが割り当てられていることを確認します.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
nginx-service LoadBalancer 10.109.92.10 192.168.0.220 80:31356/TCP 55s
nginx-service
のExternalIPに書かれている192.168.0.220
にブラウザでアクセスしてみる.
こんな感じに Welcome to Nginx! のページが表示されれば成功.
最後に
MetalLBの導入ができたので、今度はArgoCDの導入をやる.