kubeadm init で container runtime is not running のエラーが出て clusterを作れない

## エラーの内容

最近あまりにも余裕がないのですが、最低限、検証はしなければ！（⇦ 事務仕事から逃げる言い訳）と
Kubernetesクラスタを作ろうと思ってテケトーにやってると kubeadmが failしてしまいます……

```console
yasuo@m1:~$ sudo kubeadm init --config new-config.yaml
[init] Using Kubernetes version: v1.24.3
[preflight] Running pre-flight checks
        [WARNING SystemVerification]: missing optional cgroups: blkio
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: E0809 20:26:55.688131   10079 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
```

今回は、このTrouble Shootingの話です。

## Solution?

環境は以下です。

- Debian 11.4
- kernel: 5.10.0-16-amd64
- containerd.io: 1.6.7-1
- Kubernetes 1.24.3

Googleで検索すると2年ぐらい前から **config.toml 消しやがれ** って話がたくさん出てきて、今も[^reddit]それが Solutionになってる。

ただ、config.toml 消すと cgroup driver 関連おかしくならん？と思ったので、
config.tomlを消した形で構成して見てみると system.slice 配下に podが散らかってました。

```console
Control group /:
-.slice
| ～～省略～～
`-system.slice
  |-kubepods-burstable-pod257eb0ac8a2f0cfcc2960c78f8c8a611.slice:cri-containerd:00d5d3e1c22fe100bfecdc23e7c62a3b09be595>
  | `-16919 kube-apiserver --advertise-address=192.168.255.100 --allow-privileged=true --authorization-mode=Node,RBAC ->
  |-kubepods-burstable-pod75c6738c774970f2bb9f57f5698d94ab.slice:cri-containerd:fce0ea0a42dd5917fd9e38329bbab26a1246597>
  | `-16797 /pause
  |-containerd.service ...
  | |-16542 /usr/bin/containerd
  | |-16690 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 388ec98f35c5f555d5b48c8d0d50013dd6dc9f891ce8aed0e6ad>
  | |-16699 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id cad683f46d742bb80f4b7093c1526189f30b62d696a20f54efda>
  | |-16734 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id af42adb1ef15516d5fc3719476208bee57772aa33234e283bbc9>
  | `-16747 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id fce0ea0a42dd5917fd9e38329bbab26a1246597d6e23e8300fa6>
```

なんとなく、これでは いかんのでは？って気がします。

## エラーが出る原因

結論から言うと、これが起きた理由は config.tomlの余計な場所を書き換えていたことが原因でした。

containerdのconfigの編集は、通常以下の様な形でdefaultを変更するようにしています。

```bash
containerd config default > config.toml
vi config.toml
cat config.toml | sudo tee /etc/containerd/config.toml
```

なんとなく記憶を頼りに config.tomlを systemd_cgroup を trueにすんだよなと思ってGoogleで検索すると、[日本語のページ](https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/#systemd)がヒットします。

あー、これこれ！と思って以下を `true` に書き換えたのですが……

```toml:config.toml
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    systemd_cgroup = false
```

**ここを書き換えると件のエラーになってしまいます**

## Solution

というわけなので、[英語のページ](https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd-systemd)を見ます。

あれ、書き換えてる場所違うじゃんと。

```toml:config.toml
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".containerd]
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            SystemdCgroup = true
```

**runcのoptions側の設定 SystemdCgroup だけ書き換えろ** ってなってます。

## 結果

設定を変更して、`systemd_cgroup = false` かつ `SystemdCgroup = true`にしてやると `/etc/containerd/config.toml` があっても `kubeadm init` が通る様になります。

そして、ちゃんと kubepodsのsliceの下に podが まとまる形になりました。

```console
Control group /:
-.slice
| ～～省略～～
`-kubepods.slice
  |-kubepods-burstable.slice
  | |-kubepods-burstable-pod56fc75382b1ac6b3f13f20d4cdf8a364.slice
  | | |-cri-containerd-c67aaae2f743aa7e3f3df7269c38b155824f0fd18b37db002b4e8bfabd90b1f0.scope ...
  | | | `-23148 /pause
  | | `-cri-containerd-9e39dc8e269da3912aae883aa7d2eacf4d371f525e4d296e4f9b6a53d7c93903.scope ...
  | |   `-23278 kube-scheduler --authentication-kubeconfig=/etc/kubernetes/scheduler.conf --authorization-kubeconfig=/e
  | |-kubepods-burstable-pod75c6738c774970f2bb9f57f5698d94ab.slice
```

なぜ こうなるのかをちゃんと確認した上で、日本語ドキュメントの修正依頼を出すべきだなと思ったのですが、時間がないので 今回はここまでで……orz

[^reddit]: 比較的つい最近だと思うのですが、[reddit](https://www.reddit.com/r/kubernetes/comments/utiymt/kubeadm_init_running_into_issue_error_cri/)でも config.toml消しましょうとなってました。