Linux環境でKubernetesクラスターを動かす

#はじめに

今までローカルPC上でKubernetes環境が必要な時は[minikube](https://minikube.sigs.k8s.io/docs/start/)を使っていたのですが、今回は[kind](https://kind.sigs.k8s.io/docs/user/quick-start/)を試してみることにしました。
kind(Kubernetes IN Docker)は名前の通り、Dockerコンテナーをノードとして使ってKubernetesクラスターを動かすというツールです。

今回構築した環境はこちら：
Ubuntu 20.04.3
Docker version 20.10.12
kubectl version 1.23.0
kind version 0.11.1

#インストール手順
まずはインストール作業に必要となるパッケージをインストールしておきます。

```console
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
```
##Docker
公式の[手順](https://docs.docker.com/engine/install/)を参考に、Docker Engineをインストールします。

###Dockerリポジトリーの設定

* GPGキーのダウンロード
 
```none 
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```
* リポジトリーの登録

```none
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

###Docker Engineのインストール

ここでは最新バージョンをインストールしています。特定のバージョンを指定したい場合は前述の公式手順を参考にしてください。

```console
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io 
```
###稼働確認
hello-worldイメージを実行してみます。
初回実行時はローカルにイメージがないので、自動的にDockerHubからダウンロードしてから実行されます。以下のように、”Hello from Docker!”メッセージが表示されれば成功です。

```none
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

```

##kubectl
kubernetesのコマンドラインツールであるkubectlが使えないといろいろ困るので、[公式](https://kubernetes.io/docs/tasks/tools/)の手順を参考にインストールしておきます。

* Google Cloud公開署名鍵のダウンロード
 
```none
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
```

* リポジトリーの登録

```none 
$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
```

* インストール

```console
$ sudo apt update
$ sudo apt install kubectl
```
##kind
公式の[Quick Start](https://kind.sigs.k8s.io/docs/user/quick-start/)を参考にインストール。
ビルド済みバイナリーをダウンロードして、ファイル名 kindでPATHが通っているディレクトリー(ここでは/usr/local/sbin)に配置します。

```console
$ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
$ chmod +x ./kind
$ sudo mv ./kind /usr/local/sbin/kind
```
#稼働確認
必要なソフトウェアのインストール作業が完了したので、ここからはKubernetesクラスターを作って遊んでみます。

###Kubernetesクラスターを作る
`kind create cluster`コマンドでクラスターを作ります。

```shell-session
$ sudo 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

Thanks for using kind! 😊
```
--nameオプションでクラスター名を指定できますが、無指定だとデフォルトのkindというクラスターが作成されます。

もう一個`--name test`オプション指定してtestという名前のクラスターも作っておいて、クラスター情報を表示してみます。

* kindコマンドで

```console
$ sudo kind get clusters
kind
test
```

* docker psコマンドでも

```console
$ sudo docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                       NAMES
2316909cc9e7   kindest/node:v1.21.1   "/usr/local/bin/entr…"   3 minutes ago    Up 2 minutes    127.0.0.1:36987->6443/tcp   test-control-plane
e0c6d15b41ec   kindest/node:v1.21.1   "/usr/local/bin/entr…"   17 minutes ago   Up 16 minutes   127.0.0.1:41259->6443/tcp   kind-control-plane
```

作ったクラスターは、[kubectlコマンド](https://kubernetes.io/ja/docs/reference/kubectl/overview/)でいろいろ操作できます。

```sh
$ sudo kubectl config get-contexts
CURRENT   NAME        CLUSTER     AUTHINFO    NAMESPACE
          kind-kind   kind-kind   kind-kind
*         kind-test   kind-test   kind-test
```
デフォルト・コンテキストが後から作ったtestの方になっているので、kindに切り替えます。

```sh
$ sudo kubectl config use-context kind-kind
Switched to context "kind-kind".
$ sudo kubectl config get-contexts
CURRENT   NAME        CLUSTER     AUTHINFO    NAMESPACE
*         kind-kind   kind-kind   kind-kind
          kind-test   kind-test   kind-test
```

###hello-worldを動かす
作ったクラスターで、お約束の（？）hello-worldを実行してみます。

```console
$ sudo kubectl run hello-world --image=hello-world --restart=Never
pod/hello-world created
```

podの一覧を表示してみます。このときはまだ実行中だったのでステータスがRunningですが、終了したらCompletedになります。

```console
$ sudo kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
hello-world   1/1     Running   0          3s
```

podのログを表示してみます。
ちゃんと"Hello from Docker!"メッセージが出力されていますね。

```console
$ sudo kubectl logs hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

podの削除もkubectlコマンドでできます。

```sh
$ sudo kubectl delete pod hello-world
pod "hello-world" deleted
```

###クラスターの削除
クラスターの削除はkindコマンドでできます。作成時と同様に、--nameオプションで削除するクラスター名を指定できます。無指定時はデフォルトのkindクラスターが削除されます。

```sh
$ sudo kind delete cluster --name test
Deleting cluster "test" ...
$ sudo kind delete cluster
Deleting cluster "kind" ...
```

#まとめ
「Linux環境でKubernetesクラスターを動かす」ということで、Docker、kindのインストールから、簡単な稼働確認までやってみました。
今回はUbuntuを使いましたが、同じようにWindowsやMacでもお手軽にKubernetes環境を構築できるので、お勉強やちょっとしたテストなど色々と使えそうです。

お次はこの環境にKnativeをインストールして、ローカルでサーバーレス環境を作ってみます。
[kind + Knativeでローカルにサーバーレス環境をつくる](https://qiita.com/miekoma/items/e559c065ccbeb2ba1572)