プロキシあり環境で kindを使ってKubernetesクラスタを作成する。

# はじめに
kindとは、Dockerコンテナを用いてKubernetesクラスタをローカルの環境に作成するツールです。
この記事は Rocky Linux 8 minimalのインストール後の環境で、kindをインストールしてkubernetsクラスタの作成までの手順を示したものになります。

タイトルのとおりプロキシありの環境で試したので、所々でプロキシの設定手順がはさまりますが、不要であれば該当の手順は飛ばして実行していただければと思います。

# 手順

本手順は以下の環境で動作確認を行ったものになります。

|対象|バージョン|
|:--|:--|
|OS|Rocky Linux 8.5|
|kind|0.11.1|
|Docker|20.10.12|
|kubectl|v1.23.3|

## プロファイルにproxyの設定を登録する
プロキシ環境下であれば、yumでプロキシを通すために以下の設定を追加しておく。

```shell
cat <<EOF >> /etc/profile
PROXY='proxy.url:port"
export http_proxy=$PROXY
export HTTP_PROXY=$PROXY
export https_proxy=$PROXY
export HTTPS_PROXY=$PROXY
EOF
```

## kubectlをインストールする
kindインストール時にkubectlは必要となりませんが、kubernetesの運用で必須となるためこのタイミングでインストールしておきます。

Dockerの[公式ドキュメント](https://kubernetes.io/docs/tasks/tools/)に沿って、手順を実施します。

```shell
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl
```

## Dockerをインストールする
Dockerの[公式ドキュメント](https://docs.docker.com/engine/install/centos/)に沿って、手順を実施します。

```shell
# yum-utilsをインストールする
yum install -y yum-utils

# Dockerの取得先となるリポジトリを登録する
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# Dockerをインストールする
yum install docker-ce docker-ce-cli containerd.io
```

## Dockerのサービスファイルにプロキシ設定を追加する

```shell
# dockerのサービスファイルを作成する
systemctl enable docker

# サービスファイルに以下のコメントにあるようなプロキシの情報を追記する
vi /usr/lib/systemd/system/docker.service

#---------------------------------------
# [Service]
# Environment="HTTP_PROXY=http://proxy.url:port/" "HTTPS_PROXY=https://proxy.url:port/"
#----------------------------------------
# もしこれで通らない場合は HTTPSをhttpにすると通るかも "HTTPS_PROXY=http://proxy.url:port/"

# サービスファイルをリロードする
systemctl daemon-reload

# 以下のコマンドで登録したproxyの情報が取得できればOK
docker info | grep proxy
```

### 疎通確認
Dockerが正しく動作するか確認する。

```shell
# Docker起動
systemctl start docker

# 疎通用のコマンド
docker run hello-world
# Hello from Docker!が返ってくればOK。
```

## kindをインストールする

kindの[quick start手順](https://kind.sigs.k8s.io/docs/user/quick-start/#installation)どおりにインストールを行う。

```shell
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
chmod +x ./kind
mv ./kind /usr/bin/kind
```

### 動作確認としてクラスタを作成する

作成するだけであれば、このコマンドだけでクラスタを作成できます。

```shell
kind create cluster
```

実行時のログは以下の通りです。

```console
# kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
```

クラスタ作成後にはコンテナが起動されていることを確認できます。

```console
# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                       NAMES
3210094bf5a1   kindest/node:v1.21.1   "/usr/local/bin/entr…"   23 minutes ago   Up 23 minutes   127.0.0.1:37273->6443/tcp   kind-control-plane
```

デフォルトで動作させた場合はcontrol-planeのみが起動されます。

Kubernetes ではマスターノードである「control-plane」と、実際にコンテナが起動するワーカーノード「data-plane」で構成されます。
デフォルトの設定では、control-planeにはコンテナを作成しないようになっているので、実際に何かを動かす場合はワーカーノードを含めた形でクラスタを作成する必要があります。

### 参考：control-plane1台、data-palne2台で起動する場合の手順

参考までに3台構成でクラスタを作成する場合の手順も書きます。

```bash
# kindクラスタの設定ファイル作成
cat <<EOF > /tmp/config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF

# 設定ファイルを用いたクラスタの作成
kind create cluster --config /tmp/config.yaml
```

この手順で実行すると以下のように3台構成でクラスタを作成されます。

```console
# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                       NAMES
a8453887439d   kindest/node:v1.21.1   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes                               kind-worker
cf3f8a47c905   kindest/node:v1.21.1   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes   127.0.0.1:33673->6443/tcp   kind-control-plane
ed2fb5d895fb   kindest/node:v1.21.1   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes                               kind-worker2
```

### クラスタ削除手順

最後に作成したクラスタを削除します。

```
kind delete cluster
```

# さいごに
今回kindは初めて触ってみましたが、実に簡単にKubernetesクラスタの構築ができました。
開発用としてや、手元で何かを動かしてみるという用途であれば、kindを利用すれば楽に環境を汚すことなくできるので非常に便利なツールだと思います。

# 参考
- Install Docker Engine on CentOS
    - https://docs.docker.com/engine/install/centos/
- kind Quick Start
    - https://kind.sigs.k8s.io/docs/user/quick-start/#installation