この記事では、Nginx の Deployment と type: LoadBalancer の Service を作成し、MetalLB によって外部 IP アドレスが割り当てられることを確認します。
この記事の位置づけ
この記事は、MetalLB 導入後に LoadBalancer Service が外部 IP を受け取ることを確認するための記事です。MetalLB の設計や導入手順そのものではなく、Deployment、Service、EXTERNAL-IP、外部到達性を順番に確認します。
MetalLB の導入そのものではなく、導入後に Kubernetes の Service と外部ネットワークがどのようにつながるかを見るための確認用記事です。
前提
この手順は、Kubernetes クラスタに MetalLB が導入済みで、IPAddressPool と L2Advertisement などの広告設定が済んでいることを前提にします。
- MetalLB が導入済みであること
- Service に割り当てる外部 IP アドレス範囲が定義済みであること
- クライアントから MetalLB のアドレス範囲へ到達できること
- 確認用の Nginx を作成できる Kubernetes 権限があること
Namespace と Deployment を作成する
まず確認用の Namespace を作成し、その中に Nginx の Deployment を作成します。ここでは Pod を 2 個起動し、Service から label selector で束ねられるようにします。
kubectl create namespace nginx-loadbalancer-ns
kubectl -n nginx-loadbalancer-ns apply -f - <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
EOFLoadBalancer Service を作成する
次に、Nginx Deployment に向けた type: LoadBalancer の Service を作成します。MetalLB が正常に動作していれば、この Service に外部 IP アドレスが割り当てられます。
kubectl -n nginx-loadbalancer-ns apply -f - <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
EOFService と Pod の状態を確認する
kubectl get service の EXTERNAL-IP にアドレスが表示されていれば、MetalLB による IP アドレス割り当ては成立しています。
kubectl -n nginx-loadbalancer-ns get deploy,pod,svc -o wide
kubectl -n nginx-loadbalancer-ns describe svc nginx-svcEXTERNAL-IP が <pending> のままの場合は、MetalLB の Pod、IPAddressPool、L2Advertisement、Service のイベントを確認します。
外部 IP アドレスへ接続する
外部 IP アドレスが割り当てられたら、クライアントから HTTP で接続します。クラスタ外から疎通できる場合、MetalLB、Service、Pod の一連の経路が成立しています。
kubectl -n nginx-loadbalancer-ns get svc nginx-svc
VIP=$(kubectl -n nginx-loadbalancer-ns get svc nginx-svc -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl -I http://${VIP}/うまく接続できない場合の見る順番
LoadBalancer Service は複数の要素が関係するため、疎通できない場合は順番に切り分けます。最初からネットワーク全体を疑うより、Kubernetes 内部から外側へ広げて見る方が見通しやすいです。
- Deployment の Pod が起動しているか
- Service の selector が Pod の label と一致しているか
- Service に
EXTERNAL-IPが割り当てられているか - MetalLB の controller / speaker が正常に動作しているか
- MetalLB のアドレス範囲と既存ネットワークが衝突していないか
- クライアントから Service の外部 IP アドレスへ到達できるか
後片付け
確認が終わったら、作成した Namespace を削除します。Namespace ごと削除すれば、Deployment と Service もまとめて削除されます。
kubectl delete namespace nginx-loadbalancer-nsまとめ
Nginx と LoadBalancer Service を使うと、MetalLB が外部 IP アドレスを Service に割り当て、クラスタ外から Pod へ到達できる流れを確認できます。
ここで重要なのは、Service は Pod の入口を作る Kubernetes 側の抽象であり、MetalLB はその Service に外部ネットワークから到達するための IP アドレス通知を担う、という役割分担です。
MetalLB の動作確認では、単に Nginx が表示されるかだけでなく、EXTERNAL-IP、Service のイベント、MetalLB の Pod、上位ネットワークの到達性を合わせて確認すると、障害時にも切り分けやすくなります。
関連する記事
- Kubernetes MetalLB の導入 – LoadBalancer Service をオンプレ環境で成立させる
MetalLB が LoadBalancer Service を成立させる位置づけを確認します。 - Kubernetes で送信元アドレスが変わる問題 – externalTrafficPolicy、hostNetwork、BGP 経路広告で考える
外部公開後に送信元アドレスがどう見えるかを確認します。 - MicroK8s MetalLB speaker が socket permission denied を出す原因 – L2 / 権限 / ホストネットワークを切り分ける
MetalLB speaker がホストネットワーク側で何をしているのかを確認します。
次に進む
- Kubernetes MetalLB を Helm で導入する – オンプレ環境で LoadBalancer Service を使う
MetalLB を Helm で導入する手順へ進みます。 - Kubernetes MetalLB を Helm で導入する – Harbor で Chart を管理する考え方
Chart を内部レジストリで管理する運用寄りの記事です。 - Kubernetes 運用設計ガイド
Kubernetes 系記事の全体導線に戻ります。
参考書籍
書籍
Kubernetes 完全ガイド 第 2 版
Kubernetes の Service、ネットワーク、Ingress、運用設計を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。

