kindでローカル環境にKubernetesを立ち上げ、MetalLBとKnativeの開発環境を構築する
この記事について
こんにちは、東京大学鈴村研究室で、インフラエンジニアとしてお手伝いさせていただいています、福田と申します。
これまで、クラウド基盤mdxの上に、Kubernetes環境を構築し、KnativeというサーバレスWebアプリケーションの上で、LLMのWebアプリケーションなどをデプロイする手順を説明してきました。
今回の記事は少し視点を変えて、kindという、ローカルのDocker環境でKubernetesを構築できるライブラリを紹介し、kindの上で、MetalLBとKnativeをデプロイし、開発用のサーバレスWebアプリケーションを構築する方法を説明します。
kindを使えば、ローカルPC上に、開発用のKubernetesクラスタを即座に構築できるので、本番用Kubernetesにデプロイする前の動作検証が簡単にできます。
本番のKubernetes環境が壊れてしまうと修復が大変ですが、kindであれば最悪壊れても、Dockerなので、直ぐにまた作り直すことができ、利便性も高いです。
なお、MetalLBとKnativeの詳細については、以下の記事を参照ください。
アーキテクチャ全体像
今回、kind上で構築するサーバレスWebアプリケーションの全体像は以下の通りです。
MetalLBはL3ロードバランサの役割を果たし、KnativeはL7ロードバランサの役割を果たしています。
dockerのインストール
kindでは、docker上にKubernetesクラスタを構築するため、Dockerのインストールが必要です。
DockerのWebサイトから、Docker Desktopなどをインストールします。
kubectlのインストール
Kubernetesクラスタの切り替えや、コマンドの実行のために、ローカル端末上でkubectlコマンドが実行出来る必要があります。
以下の手順に従って、kubectlをインストールします。
Mac OSの場合
Windowsの場合
kindのインストール
kindはMac OSであれば、Homebrewからインストール可能です。
以下のコマンドでHomebrewをインストールします。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Homebrewがインストールできたら、以下のコマンドでkindをインストールします。
brew install kind
kind上でのKubernetesクラスタの構築
以下のyamlファイルを作成し、構築したいKubernetesクラスタの定義を行います。
ここでは、1台のcontrol plane nodeと、2つのworker nodeを定義します。
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
以下のコマンドで、クラスタを作成します。
--name
オプションには、好みのクラスター名を指定します。
kind create cluster --config (作成したファイルへのpath) --name dev-local-cluster-1
Lensを開いて、作成したクラスタが表示されることを確認します。
KubernetesのContextの切り替え
ここでは、kubectlコマンドの実行先を、kindで作成したKubernetesクラスタに向けるための設定をします。
まず、以下のコマンドを実行し、設定されているcontext一覧を表示します。
kubectl config get-contexts
得られる結果は以下のような形になります。
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
k0s-cluster k0s-cluster admin
* kind-dev-local-cluster1 kind-dev-local-cluster1 kind-dev-local-cluster1
ここで、kindで構築したKubernetesクラスタがcurrentとして設定されていない場合、以下のコマンドで設定します。
kubectl config use-context (kindで作成したKubernetesクラスタ名)
MetalLBのインストール
構築した、Kubernetesクラスタに対して、L3 Load balancerであるMetalLBを、公式の手順に従って、インストールしていきます。
ターミナルで以下のコマンドを実行し、MetalLBをインストールします。
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml
Docker networkのIPアドレス範囲の確認
MetalLBで割り当て可能なIPアドレスプールを設定するため、Docker networkで定義された全IPアドレス範囲を確認します。
まず、以下のコマンドでネットワーク一覧を表示します。
docker network ls
以下のような結果が得られます。
NETWORK ID NAME DRIVER SCOPE
5f8e9d2cfe91 bridge bridge local
f0f8ef2358f9 host host local
dfa28886eb16 kind bridge local
2c71ff05f6d4 none null local
ここで、kindという名前のネットワークが見つけられると思います。
このkindが対象のネットワークですので、以下のコマンドで詳細を確認します。
docker network inspect kind --format '{{json .IPAM.Config}}'
すると以下のような結果が得られます。
[{"Subnet":"172.19.0.0/16","Gateway":"172.19.0.1"},{"Subnet":"fc00:f853:ccd:e793::/64","Gateway":"fc00:f853:ccd:e793::1"}]
ここでのSubnetの項目にある、172.19.0.0/16
がMetal LBのIPアドレスプールとして設定可能なIPアドレスの範囲です。
IPアドレスプールの設定
上記のDocker networkにおける全IPアドレス範囲を元に、IPアドレスプールとしてアサイン可能なIPレンジを指定します。
このDocker networkにおける全IPアドレス範囲に収まれば、どのIPアドレスでも大丈夫です。
1つだけ設定しても良いですし、範囲で指定することもできます。
詳しい設定方法は、MetalLBのドキュメントを参照ください。
yamlファイルは以下のようになります。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: dev-address-pool # ここは自由な名前を設定してOK
namespace: metallb-system
spec:
addresses:
- 172.19.0.7/32 # ここにIPアドレスを指定する
このyamlファイルを、kubectlコマンドでkind環境に適用します。
kubectl apply -f (IPアドレスプール定義のyamlファイルのpath)
また、実際に上記のIPアドレスプールが割り当てられるようにするためには、Layer2 Advertisementという設定が必要になるので、以下のyamlファイルを作成し、こちらもKubernetesに適用します。
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2-advertisement # 好きな名前を設定して良い
namespace: metallb-system
spec:
ipAddressPools:
- dev-address-pool # この名前をIPアドレスプールの名前に合わせる
上記のyamlファイルについて、以下のコマンドでKubernetesに適用します。
kubectl apply -f (L2Advertisementのyamlファイルのpath)
これでMetalLBの設定は完了です。
次に、KNativeの設定に移ります。
Knative Servingのインストール
以下の公式の手順に従って、Knative Servingのインストールを行って行きます。
ターミナルで、以下のコマンドを実行し、以下のKnative Servingのコアライブラリについてインストールを行って行きます。
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.17.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.17.0/serving-core.yaml
Kourierのインストール
次に、L7ロードバランサーであるKourierのインストールを行って行きます。
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.17.0/kourier.yaml
KnativeのL7ロードバランサとして、Kourierが使われるようにconfigmapの編集を行います。
kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'
以下のコマンドを実行し、EXTERNAL-IPとして、MetalLBで設定したIPアドレスプールから、IPアドレスが割り当てられていることを確認します。
kubectl --namespace kourier-system get service kourier
こちらが、出力結果の例で、EXTERNAL-IPとして、MetalLBのIPアドレスプールで指定したIPアドレスが割り当てられていることが確認できます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kourier LoadBalancer 10.96.185.189 172.19.0.7 80:32738/TCP,443:30181/TCP 20m
デフォルトドメインの設定とテスト用Webアプリケーションのデプロイ
このステップでは、KNativeで提供されるサーバレスWebアプリケーションのデフォルトドメインの設定を行い、それから、サンプル用のWebアプリケーションのデプロイを行います。
ただし、この手順は過去記事である「第4回 クラウド基盤mdxで構築したKubernetesで、サーバレスWebアプリケーションを構築する」で行った手順と全く同じになりますので、以下のリンクを参照ください。
テスト用Webアプリケーションへのアクセス
さて、ここまでの手順で、WebアプリケーションをKNativeにデプロイすることができました。
ここからは、このWebアプリケーションが正常に動作しているかどうかを、実際にアクセスして確認します。
ただ、kind KubernetesクラスタはDocker内のネットワークにて動作しているため、PCからは直接はアクセスできません。
よって、kind Kubernetesクラスタにアクセスするための、Dockerコンテナを別途立てて、このコンテナから、curlコマンドでアクセスすることを行います。
以下のコマンドを実行し、dockerコンテナを立ち上げます。
起動した後、ターミナルでコマンドが送れることを確認します。
docker pull python:3.12
docker run -it --name kind_web_client python:3.12 /bin/bash
起動後、試しにlsコマンドなどを実行してみます
# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
その後、Control + Dなどで、一旦、このコンテナを抜けます。
次に、以下のコマンドで、ここで作成したコンテナkind_web_client
をkindのDocker networkに参加させます。
docker network connect kind kind_web_client
以下のコマンドを実行し、再度コンテナに入ります。
docker exec -it kind_web_client /bin/bash
コンテナ内のターミナルで、以下のコマンドを実行します。
ここで、IPアドレスとホスト名を間違えないようにしてください。
curl -v -H "Host: hello-world.default.example.com" -H "Content-Type: application/json" http://172.19.0.7/
KNativeに構築したWebアプリケーションが無事に立ち上がっていれば、以下のような結果が返ってくるかと思います。
* Trying 172.19.0.7:80...
* Connected to 172.19.0.7 (172.19.0.7) port 80 (#0)
> GET / HTTP/1.1
> Host: hello-world.default.example.com
> User-Agent: curl/7.88.1
> Accept: */*
> Content-Type: application/json
>
< HTTP/1.1 200 OK
< content-length: 20
< content-type: text/plain; charset=utf-8
< date: Wed, 19 Mar 2025 13:17:26 GMT
< x-envoy-upstream-service-time: 1433
< server: envoy
<
Hello Knative User!
* Connection #0 to host 172.19.0.7 left intact
今回のまとめ
これで、kindでローカルのDocker環境にKubernetesクラスタを構築し、MetalLBとKNativeでサーバレスWebアプリケーションを構築することができるようになりました。
kindを使えば、簡単にテスト用のKubernetesクラスタを構築できるので、本番環境にデプロイする前のテスト用としても最適な環境だと思います。
是非、Kubernetes開発で活用ください。
東京大学鈴村研究室について
Discussion