はじめに
オンプレミス環境に構築したKubernetesではServiceにて type: LoadBalancer
と記載して起動するも、External-IPの箇所がpendingのままでIPアドレスが割り当てられません。
本記事では以下のベアメタルサーバで動作するKubernetesにロードバランサ機能を提供するMetalLBを利用してngixnのPodをLoadBalancerに紐づけてみます。
環境情報
- MetalLB v0.9.4
- kubeadm v1.15.1
インストール
上記リンクに記載の通りで以下の手順にて必要なリソースを作成します。
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.4/manifests/namespace.yaml $ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.4/manifests/metallb.yaml $ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
その中で以下のイメージが利用されます。
metallb/controller:v0.9.4
metallb/speaker:v0.9.4
正常に立ち上がると以下のようにPod群が立ち上がります。
# kubectl get all -n metallb-system NAME READY STATUS RESTARTS AGE pod/controller-6447bdd8f6-rn6xw 1/1 Running 0 52s pod/speaker-2kds5 1/1 Running 0 52s pod/speaker-6k6c4 1/1 Running 0 52s pod/speaker-qmpzv 1/1 Running 0 52s pod/speaker-tgc58 1/1 Running 0 52s ..
今回は1MasterNode+3WorkerNodeの構成のためdaemonset.appsとして動くspeakerは4つ起動しています。
最後にLoadBalancerとして割り当てるIPアドレスの範囲を記載したConfigMapを展開するとインストール完了です。
apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 10.200.200.120-10.200.200.122
LoadBalancerを利用する
nginxのPodを動かした状態で以下のサービスを起動すると
apiVersion: v1 kind: Service metadata: creationTimestamp: null labels: app: nginx name: nginx spec: ports: - port: 8080 protocol: TCP targetPort: 80 nodePort: 30080 selector: app: nginx type: LoadBalancer status: loadBalancer: {}
以下のように外部IPアドレスが割り当てられた状態でロードバランサが起動します。
# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) ... nginx LoadBalancer 10.108.83.30 10.200.200.120
Kubernetesのクラスター外のサーバからでも同IPめがけて通信が可能です。
# curl 10.200.200.120:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
EXTERNAL-IPの実体はどこなのか?
同ロードバランサのIPアドレスをARPテーブルで確認すると同じMACアドレスを持つIPアドレスがあります。
# ip n ... 10.200.200.120 dev ens192 lladdr 00:50:XX:XX:3b:6f REACHABLE ... 10.200.200.11 dev ens192 lladdr 00:50:XX:XX:3b:6f REACHABLE ...
このIPアドレスはnginxのPodが展開されているWorkerNodeのIPアドレスで、試しにPodを別のWorkerNodeに移すと同MACアドレスはそのWorkerNodeのMACアドレスに変化します。
終わりに
MetalLBを利用すれば、クラウド上に用意したKubernetesではない環境でもIPアドレスが動的にアサインされます。
そして、この動的にアサインされるIPアドレスの実体は各WorkerNodeに紐づいており、Podを複数にした場合でも問題なくロードバランサできているので、まずはARPに記載があるNodeに飛んだ後にNode間に振り分けていると考えられます。
以上、ご参考になれば幸いです。