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-amd64kind.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で構築した環境で色々と試して頂ければと思います。

ではまた。

Recommendおすすめブログ