Zenn
🙆

kindでローカル環境にKubernetesを立ち上げ、MetalLBとKnativeの開発環境を構築する

2025/03/25に公開

この記事について

こんにちは、東京大学鈴村研究室で、インフラエンジニアとしてお手伝いさせていただいています、福田と申します。

https://sites.google.com/view/toyolab/鈴村研究室概要

これまで、クラウド基盤mdxの上に、Kubernetes環境を構築し、KnativeというサーバレスWebアプリケーションの上で、LLMのWebアプリケーションなどをデプロイする手順を説明してきました。

https://zenn.dev/suzumura_lab/articles/627b5063d6884d

今回の記事は少し視点を変えて、kindという、ローカルのDocker環境でKubernetesを構築できるライブラリを紹介し、kindの上で、MetalLBとKnativeをデプロイし、開発用のサーバレスWebアプリケーションを構築する方法を説明します。

https://kind.sigs.k8s.io/

kindを使えば、ローカルPC上に、開発用のKubernetesクラスタを即座に構築できるので、本番用Kubernetesにデプロイする前の動作検証が簡単にできます。
本番のKubernetes環境が壊れてしまうと修復が大変ですが、kindであれば最悪壊れても、Dockerなので、直ぐにまた作り直すことができ、利便性も高いです。

なお、MetalLBとKnativeの詳細については、以下の記事を参照ください。

https://zenn.dev/suzumura_lab/articles/4bd9eb672fff61

アーキテクチャ全体像

今回、kind上で構築するサーバレスWebアプリケーションの全体像は以下の通りです。
MetalLBはL3ロードバランサの役割を果たし、KnativeはL7ロードバランサの役割を果たしています。

dockerのインストール

kindでは、docker上にKubernetesクラスタを構築するため、Dockerのインストールが必要です。
DockerのWebサイトから、Docker Desktopなどをインストールします。

https://www.docker.com/ja-jp/

kubectlのインストール

Kubernetesクラスタの切り替えや、コマンドの実行のために、ローカル端末上でkubectlコマンドが実行出来る必要があります。
以下の手順に従って、kubectlをインストールします。

Mac OSの場合
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl-macos/

Windowsの場合
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl-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のインストールを行って行きます。
https://knative.dev/docs/install/yaml-install/serving/install-serving-with-yaml/

ターミナルで、以下のコマンドを実行し、以下の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開発で活用ください。

東京大学鈴村研究室について

https://sites.google.com/view/toyolab/鈴村研究室概要

Discussion

ログインするとコメントできます