Kind で Kubernetes のクラスタを構築する
皆さん、こんにちは。技術開発グループのn-ozawanです。
当社ではこの時期、創立記念日に合わせてアイオスオープン(ゴルフ)が開催されているようです。私はゴルフをやらないので不参加です。
本題です。
Kubernetesを勉強しようとしたときに、Kubernetesを試すための環境が欲しくなります。ぱっと思いつくのがAWS EKSなどのクラウド環境ですが、お手軽でもなく、料金もかかるので、ちょっと試したいときには不向きです。そんな中、Kindというお手軽にKubernetesを試せるツールがありましたので、今日はKindでKubernetesのクラスタを構築する方法を紹介します。
目次
Kind (Kubernetes in Docker)
Kubernetesは複数のノード(物理マシンや仮想マシンなど)を管理し、複数のノードでクラスタを形成します。複数のノードでクラスタを構築しようとするときは、複数台の物理マシンや仮想マシンを用意する必要があり、個人で用意するのは簡単なことではありません。
今回紹介するKindを使うと、Dockerのコンテナをノードに見立てることにより、ローカル環境の端末1台で、複数のノードでクラスタ環境を構築することが出来るようになります。
Docker のインストール
「Dockerのコンテナをノードに見立てることにより」とある通り、Dockerをインストールする必要があります。Windows環境、かつ、個人利用であればDocker Desktopで良いかと思いますが、商用利用だと有料となりますのでご注意ください。
Kindのインストール
公式サイトを見ると、Goパッケージとして公開されているようです。他にも、HomebrewやMacPorts、Chocolateyなどでもパッケージを公開しているようですが、残念ながら私の端末にはありません。なので、シンプルに実行ファイルをダウンロードします。PowerShellで以下のコマンドを実行します。
> curl.exe -Lo kind-windows-amd64.exe "https://kind.sigs.k8s.io/dl/v0.19.0/kind-windows-amd64"
あとは、ダウンロードしたkind-windows-amd64
をkind.exe
にリネームすれば完了です。
Kubectlのインストール
Kubernetesへの操作を行うにはkubectl
コマンドが必要になります。これも実行ファイルをダウンロードします。
> curl.exe -LO "https://dl.k8s.io/release/v1.27.2/bin/windows/amd64/kubectl.exe"
クラスタ構築
実際にkindでクラスタを構築してみます。まずは以下のYamlファイルを用意します。
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
image: kindest/node:v1.27.2
extraPortMappings:
- containerPort: 30080
hostPort: 80
- role: worker
image: kindest/node:v1.27.2
- role: worker
image: kindest/node:v1.27.2
- role: worker
image: kindest/node:v1.27.2
ノードやコンテナを制御するControl Planeのノードが1つと、実際にコンテナを動作させるWorker ノードが3つの構成でクラスタを構築します。構築するには以下のコマンドを実行します。
> kind create cluster --config cluster.yaml --name kindcluster
kind create cluster
でクラスタを構築します。--config
には先ほど作成したYamlファイルへのパスを指定します。--name
にはクラスタの名前を指定します。クラスタを構築したら、kubectl
コマンドで構築したクラスタへContextを切り替えます。
> kubectl config use-context kind-kindcluster
これにより、今後kubectl
コマンドを使用することで、構築したクラスタに対して操作が行われます。では実際にノードが作成されたかkubectl
コマンドで確認してみます。
> kubectl get nodes
NAME STATUS ROLES AGE VERSION
kindcluster-control-plane Ready control-plane 5m30s v1.27.2
kindcluster-worker Ready <none> 4m45s v1.27.2
kindcluster-worker2 Ready <none> 4m46s v1.27.2
kindcluster-worker3 Ready <none> 4m45s v1.27.2
出来ていますね!
ちなみにdocker container ls
を実行すると、Kubernetesのノードが、dockerのコンテナで動いていることが分かります。
> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
967795c7f376 kindest/node:v1.27.2 "/usr/local/bin/entr…" About a minute ago Up About a minute kindcluster-worker
edf39f1aae7e kindest/node:v1.27.2 "/usr/local/bin/entr…" About a minute ago Up About a minute 127.0.0.1:59624->6443/tcp, 0.0.0.0:80->30080/tcp kindcluster-control-plane
3347ad25a6c2 kindest/node:v1.27.2 "/usr/local/bin/entr…" About a minute ago Up About a minute kindcluster-worker2
00a2350e320e kindest/node:v1.27.2 "/usr/local/bin/entr…" About a minute ago Up About a minute kindcluster-worker3
nginxを動かしてみる
せっかくですので、作成したばかりのクラスタにnginxをデプロイしてみましょう。以下のYamlファイルを用意します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas: 3
selector:
matchLabels:
app: sample-deployment
template:
metadata:
labels:
app: sample-deployment
spec:
containers:
- name: nginx-container
image: nginx:1.16
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: sample-service
spec:
type: NodePort
selector:
app: sample-deployment
ports:
- name: "nginx-port"
protocol: "TCP"
port: 8080
targetPort: 80
nodePort: 30080
詳細は省きますが、nginxのdeploymentとNodePortを定義しています。以下のコマンドを実行して、クラスタにデプロイします。
> kubectl apply -f .\examples\training\workloads_deployment_sample.yaml
nginxが立ち上がりました!

おわりに
今日はKindをつかってKubernetesのクラスタを構築する方法を紹介しました。Kubernetesについての説明を省きましたので、Kubernetesを知らない人にはちんぷんかんぷんな内容だったかもしれません。次回以降はKubernetesについてお話ししようと思いますので、Kindで構築した環境で色々と試して頂ければと思います。
ではまた。