podmanでk8sクラスタを構築してみよう。

## はじめに

シングルノード構成のk8sは本番環境で使用しないので、マルチノードで構築してみたい。

## 環境

複雑な環境だが、podmanでmaster及びnodeを構築してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183599/f2d47e51-2571-8100-08eb-27fd9dd0c68e.png)

## master構築
### troubleshooting１

podman buildでエラー終了してしまった。原因調査中

```
STEP 26/29: systemctl enable kubelet
ERRO[0008] +(UNHANDLED LOGLEVEL) &imagebuilder.Step{Env:[]string{"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "container=podman"}, Command:"systemctl", Args:[]string{""}, Flags:[]string{}, Attrs:map[string]bool(nil), Message:"SYSTEMCTL ", Original:"systemctl enable kubelet"}
Error: error building at STEP "SYSTEMCTL ": Build error: Unknown instruction: "SYSTEMCTL" &imagebuilder.Step{Env:[]string{"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "container=podman"}, Command:"systemctl", Args:[]string{""}, Flags:[]string{}, Attrs:map[string]bool(nil), Message:"SYSTEMCTL ", Original:"systemctl enable kubelet"}
```

[podmanfile](https://github.com/Kon-y/study_k8s/blob/main/podmanfile_for_k8s_master)はgithubにuploadした。

### wa１

podman buildを実施するにあたり、systemctlで実施しなくてもいいのではないか。と推測して外した。
外すことでbuild処理は正常終了する。
正常性は構築後に確認しようと思う。

```
RUN echo "KUBELET_EXTRA_ARGS=--cgroup-driver=systemd" > /etc/sysconfig/kubelet
systemctl enable kubelet　★
```

---

### troubleshooting２

masterのセットアップでエラーが出た。

```
[root@k8m001 ~]# kubeadm init \
>   --apiserver-advertise-address=$(nslookup k8w001 | grep Address |  tail -n +2 | cut -f2 -d ' ') \
>   --pod-network-cidr=192.168.0.0/16
[init] Using Kubernetes version: v1.25.1
[preflight] Running pre-flight checks
        [WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
        [WARNING FileExisting-tc]: tc not found in system path
        [WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: time="2022-09-19T13:03:49+09:00" level=fatal msg="unable to determine runtime API version: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/containerd/containerd.sock: connect: no such file or directory\""
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
[root@k8m001 ~]# 
```

## wa２

・podman container上でどうやってswapoffしてよいのかわかっていない。
　swapoff -aを実行してみたが、free -mで見るとswapが起動しているように見えるし。
>  [WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubele

　swapoffが通じない。。。もしかしたら、kubeadm init処理をする上で無視してよいものかもしれない。fatalがwarningだし。
```
[root@k8m001 ~]# swapon -sv
Filename                                Type            Size    Used    Priority
/swap/file                              file            7340032 0       -2
[root@k8m001 ~]# swapoff -av
swapoff /swap/file
[root@k8m001 ~]#
[root@k8m001 ~]# swapon -sv
Filename                                Type            Size    Used    Priority
/swap/file                              file            7340032 0       -2
[root@k8m001 ~]#
```

・これは、yum install tcでいける。podmanfileでyumコマンドのところに追加すればよいだけ。
> [WARNING FileExisting-tc]: tc not found in system path


・これは、kubeletサービスを起動しとけ。ってことだから、RUN systemctl enable kubelet.serviceをpodmanfileに含めればよいだけ。
> [WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'

・ここだけ解決できていない。
> [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: time="2022-09-19T21:08:15+09:00" level=fatal msg="unable to determine runtime API version: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/containerd/containerd.sock: connect: no such file or directory\""

試しに以下のURLを参照して、[cri-dockerd](https://github.com/Mirantis/cri-dockerd)をインストールしてみようと思う。
https://discuss.kubernetes.io/t/unable-to-determine-runtime-api-version-rpc-error/20736

↑ 結果失敗した。事象改善ならず。
masterにてsocket[sock]が無いのが問題だった。masterにてpodmanを起動しcri-socketを指定したら、一部改善した。
```
--cri-socket=unix:///run/podman/podman.sock \
```

　　↓ 残課題は明日調査しようと思う。(同じ職場の人からvirtualbox使えばいいんじゃないの？と提案が・・・もはやpodmanであげようと意地になっている俺。)

```
I0923 22:34:07.860781     386 checks.go:243] validating the existence and emptiness of directory /var/lib/etcd
[preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: time="2022-09-23T22:34:07+09:00" level=fatal msg="unable to determine runtime API version: rpc error: code = Unavailable desc = connection closed before server preface received"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
error execution phase preflight
```

wa2は以下の追加手順をすることで処理を抜けることができた。が、config.tomlを削除することでデメリットもあるらしい。。。

```
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
rm /etc/containerd/config.toml
systemctl restart containerd
```

## troubleshooting３

overlayfsが関係したエラーのように見える。これをfuse-overlayfsに変更できれば・・・解決方法を探してみる。

```
[preflight] Some fatal errors occurred:
        [ERROR ImagePull]: failed to pull image registry.k8s.io/kube-apiserver:v1.25.2: output: E0925 21:07:20.978811    3007 remote_image.go:222] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"registry.k8s.io/kube-apiserver:v1.25.2\": failed to unpack image on snapshotter overlayfs: failed to extract layer sha256:f703b674637586b3f69a116e078ce213ef314a05d30d97db58f0fa43fb40c09f: failed to mount /var/lib/containerd/tmpmounts/containerd-mount636580304: invalid argument: unknown" image="registry.k8s.io/kube-apiserver:v1.25.2"
```

## wa3
/etc/containers/storage.confに「mount_program = "/usr/bin/fuse-overlayfs"」を追記した。


[podmanfile](https://github.com/Kon-y/study_k8s/blob/main/podmanfile_for_k8s_master)はmodifyした。

9/30/2022 諦めてdocker-desktopのkubernetesを使うことにした。。。実力不足。


## worker構築

[podmanfile](https://github.com/Kon-y/k8s_study/blob/main/podmanfile_for_k8s_worker)をgithubにuploadした。