はじめに
シングルノード構成のk8sは本番環境で使用しないので、マルチノードで構築してみたい。
環境
複雑な環境だが、podmanでmaster及びnodeを構築してみる。
master構築
troubleshooting1
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はgithubにuploadした。
wa1
podman buildを実施するにあたり、systemctlで実施しなくてもいいのではないか。と推測して外した。
外すことでbuild処理は正常終了する。
正常性は構築後に確認しようと思う。
RUN echo "KUBELET_EXTRA_ARGS=--cgroup-driver=systemd" > /etc/sysconfig/kubelet
systemctl enable kubelet ★
troubleshooting2
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 ~]#
wa2
・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://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
troubleshooting3
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はmodifyした。
9/30/2022 諦めてdocker-desktopのkubernetesを使うことにした。。。実力不足。
worker構築
podmanfileをgithubにuploadした。