macOS の podman で kind をやってみる

## 概要

* [kind](https://kind.sigs.k8s.io/) を一言でいうと、コンテナを k8s ノードと見なしてクラスタを実行させる箱庭的な便利ツール
* kind を試すのに docker 使うのは普通ですが、 ここはやっぱり podman machine でやってみたい
* 仕事で使う macOS で kind が動くところまで検証した


## 検証した環境

### macOS のバージョン

```bash
$ sw_vers
ProductName:	macOS
ProductVersion:	12.3.1
BuildVersion:	21E258
```

## podman の導入

導入方法は以前書いた以下記事を参照ください :pray: 

https://qiita.com/tigerroll/items/b511d7e2812b690df4c2

## podman machine による QEMU インスタンスをセットアップする

* pod を起動すると、リソースを使うので QEMU には大きめにリソースを割り当てておく
* `podman machine init` コマンドを使用して初期セットアップを行う
* podman machin で実行する Fedora CoreOS の仮想マシンイメージ(qcow2)がダウンロードされる

```bash
$ podman machine init --cpus 2 --disk-size 20 --memory 8192
```

作った QEMU インスタンスを起動する

```bash
$ podman machine start
```

正常に起動していることが確認できる

```bash
$ podman machine ls
NAME                     VM TYPE     CREATED         LAST UP            CPUS        MEMORY      DISK SIZE
podman-machine-default*  qemu        23 minutes ago  Currently running  2           8.59GB      21.47GB
```

## podman machine との接続設定

* podman machine への接続エントリが追加されていることが確認できる
* これらは起動時に自動で追加され、イメージを削除すると自動でエントリも削除される

```bash
$ podman system connection list
Name                         URI                                                                Identity                                              Default
podman-machine-default       ssh://core@localhost:57656/run/user/1849830061/podman/podman.sock  /Users/tigerroll/.ssh/podman-machine-default  true
podman-machine-default-root  ssh://root@localhost:57656/run/podman/podman.sock                  /Users/tigerroll/.ssh/podman-machine-default  false
```

docker 互換のツールと接続するためにDOCKER_HOST に socket のパスを設定する
もちろん、この設定を `.bash_profile` に追加しても良いだろう

```bash
$ export DOCKER_HOST="unix:///Users/${LOGNAME}/.local/share/containers/podman/machine/podman-machine-default/podman.sock"
```

podman machine のバージョン情報を確認

```bash
$ podman version
Client:       Podman Engine
Version:      4.0.3
API Version:  4.0.3
Go Version:   go1.18
Built:        Sat Apr  2 00:28:59 2022
OS/Arch:      darwin/amd64

Server:       Podman Engine
Version:      4.0.3
API Version:  4.0.3
Go Version:   go1.18
Built:        Sat Apr  2 03:21:54 2022
OS/Arch:      linux/amd64
```

## kind コマンドのインストール

brew でインストールする

```bash
$ brew install kind
```

kind のバージョン確認

```bash
$ kind --version
kind version 0.12.0
```

## podman で kind を起動する

kind デフォルトの provider は docker なので、`KIND_EXPERIMENTAL_PROVIDER` にて podman を指定する
この設定を `.bash_profile` に追加しても良いだろう

```bash
$ export KIND_EXPERIMENTAL_PROVIDER=podman
```

kind の設定ファイルを用意する（4 node 起動する）

```bash
$ cat <<'EOF'> kind-1m3w.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  disableDefaultCNI: false
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
EOF
```

先程用意したファイルをベースにクラスタを起動する

```bash
$ kind create cluster --config kind-1m3w.yaml
using podman due to KIND_EXPERIMENTAL_PROVIDER
enabling experimental podman provider
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.23.4) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/
```

`podman ps` で node の動作を確認すると正常に node が起動されていることが確認できる

```bash
$ podman ps
CONTAINER ID  IMAGE                                                                                           COMMAND     CREATED            STATUS                PORTS                      NAMES
9e3a46da0fb3  docker.io/kindest/node@sha256:0e34f0d0fd448aa2f2819cfd74e99fe5793a6e4938b328f657c8e3f81ee0dfb9              About an hour ago  Up About an hour ago                             kind-worker3
a418ff9339d9  docker.io/kindest/node@sha256:0e34f0d0fd448aa2f2819cfd74e99fe5793a6e4938b328f657c8e3f81ee0dfb9              About an hour ago  Up About an hour ago                             kind-worker
9f188aa52f62  docker.io/kindest/node@sha256:0e34f0d0fd448aa2f2819cfd74e99fe5793a6e4938b328f657c8e3f81ee0dfb9              About an hour ago  Up About an hour ago  127.0.0.1:55153->6443/tcp  kind-control-plane
e0bbda18d4d5  docker.io/kindest/node@sha256:0e34f0d0fd448aa2f2819cfd74e99fe5793a6e4938b328f657c8e3f81ee0dfb9              About an hour ago  Up About an hour ago                             kind-worker2
```

以上で cluster の構築は完了

## kubectl で cluster を操作する

cluster-info で動作できてることを確認

```bash
$ kubectl cluster-info --context kind-kind
Kubernetes control plane is running at https://127.0.0.1:55153
CoreDNS is running at https://127.0.0.1:55153/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

get pods -A で全ての pods の状態を取得する

```bash
$ kubectl get pods -A
NAMESPACE            NAME                                         READY   STATUS    RESTARTS   AGE
kube-system          coredns-64897985d-gfrdv                      0/1     Pending   0           1m
kube-system          coredns-64897985d-l7nrf                      0/1     Pending   0           1m
kube-system          etcd-kind-control-plane                      1/1     Running   0           1m
kube-system          kube-apiserver-kind-control-plane            1/1     Running   0           1m
kube-system          kube-controller-manager-kind-control-plane   1/1     Running   0           1m
kube-system          kube-proxy-k8hlj                             1/1     Running   0           1m
kube-system          kube-proxy-qgl4x                             1/1     Running   0           1m
kube-system          kube-proxy-qp8cj                             1/1     Running   0           1m
kube-system          kube-proxy-rth6c                             1/1     Running   0           1m
kube-system          kube-scheduler-kind-control-plane            1/1     Running   0           1m
local-path-storage   local-path-provisioner-5ddd94ff66-rq4v7      0/1     Pending   0           1m
```

kind が動いている :star2:

## podman machie 環境で kind を動かした感想

* podman machine でも kind ができるのはありがたい :pray: 感謝！！
* 脱 Docker :whale: を求めてる人には、とても相性が良いと思う
* podman で kind を動かすのは想像よりも簡単だった :smile: