Nutanix Kubernetes Engine(NKE)で作成した Kubernetes クラスタに、MetalLB をインストールして、LoadBalancer Service を作成してみます。
今回の内容です。
MetalLB のインストール
まず準備として、kubectl でクラスタに接続できるようにしておきます。
インストール先の NKE クラスタを確認しておきます。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION nke-02-55946c-master-0 Ready control-plane,master 39d v1.26.8 nke-02-55946c-worker-0 Ready node 39d v1.26.8
公式サイトで案内されている YAML を適用します。
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.3/config/manifests/metallb-native.yaml namespace/metallb-system created customresourcedefinition.apiextensions.k8s.io/bfdprofiles.metallb.io created customresourcedefinition.apiextensions.k8s.io/bgpadvertisements.metallb.io created customresourcedefinition.apiextensions.k8s.io/bgppeers.metallb.io created customresourcedefinition.apiextensions.k8s.io/communities.metallb.io created customresourcedefinition.apiextensions.k8s.io/ipaddresspools.metallb.io created customresourcedefinition.apiextensions.k8s.io/l2advertisements.metallb.io created serviceaccount/controller created serviceaccount/speaker created role.rbac.authorization.k8s.io/controller created role.rbac.authorization.k8s.io/pod-lister created clusterrole.rbac.authorization.k8s.io/metallb-system:controller created clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created rolebinding.rbac.authorization.k8s.io/controller created rolebinding.rbac.authorization.k8s.io/pod-lister created clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created configmap/metallb-excludel2 created secret/webhook-server-cert created service/webhook-service created deployment.apps/controller created daemonset.apps/speaker created validatingwebhookconfiguration.admissionregistration.k8s.io/metallb-webhook-configuration created
Pod が Running になったことを確認しておきます。
$ kubectl get pod -n metallb-system NAME READY STATUS RESTARTS AGE controller-7d678cf54-hr9pz 1/1 Running 0 5m27s speaker-l4c6c 1/1 Running 0 5m27s
IP Address Pool リソースを作成します。Bash プロンプトに下記を貼り付けて実行し、ippool.yml という名前で YAML ファイルを作成します。
IP アドレス プールのレンジは、Kubernetes 仮想マシンの IP アドレスと同じネットワークから採番します。
- addresses: 192.168.12.210-192.168.12.214
cat << EOF > ippool.yml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default namespace: metallb-system spec: addresses: - 192.168.12.210-192.168.12.214 EOF
ファイルが作成されたことを確認しておきます。
$ cat ippool.yml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default namespace: metallb-system spec: addresses: - 192.168.12.210-192.168.12.214
さらに、L2 Advertisement リソースの YAML ファイル(l2adv.yml)を作成しておきます。
cat << EOF > l2adv.yml apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default namespace: metallb-system spec: ipAddressPools: - default EOF
YAML ファイルが作成されたことを確認しておきます。
$ cat l2adv.yml apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default namespace: metallb-system spec: ipAddressPools: - default
2つの YAML ファイルを、kubectl apply で適用します。
$ kubectl apply -f ippool.yml -f l2adv.yml ipaddresspool.metallb.io/default created l2advertisement.metallb.io/default created
MetalLB の動作確認
Pod と LoadBalancer Service リソースを作成して、MetalLB が機能するか動作確認してみます。
まず、Pod を起動します。
$ kubectl run web2048 --image=gowatana/docker-2048 pod/web2048 created
Pod が Running になったことを確認します。
$ kubectl get pod NAME READY STATUS RESTARTS AGE web2048 1/1 Running 0 86s
LoadBalancer Service リソースを作成します。
$ kubectl expose pod web2048 --port=80 --target-port=80 --type LoadBalancer service/web2048 exposed
これで、サービスが作成され、IPAddressPool で指定したレンジから EXTERNAL-IP のアドレスが設定されます。
$ kubectl get svc web2048 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web2048 LoadBalancer 172.19.58.46 192.168.12.210 80:32038/TCP 12s
EXTERNAL-IP のアドレスに Web ブラウザからアクセスすると、2048 ゲームが表示されるはずです。
ちなみに LoadBalancer ではなく NodePort でアクセスする方法は、少し古い投稿ですがこちらをどうぞ。
以上。