ラズパイKubernetesとDockerのバージョンを下げた話

#0.はじめに
2020年〜2021年の冬休みを使って
Qiitaにたくさん存在するラズパイによるKubernetes環境を
諸先輩方の投稿を参考に構築してみました。
![IMG_4092.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605817/eeb91123-714f-a467-c2ff-600201250a4c.jpeg)
が。。。。。
インストールはできたけど超不安定。
初心者には手に負えるわけもなく、
最終的にはKubernetesとDockerのバージョンを下げるという負け犬の話です。

※２０２０年の年末の話です。将来のバージョンでは普通に動くんだと思います。
※あと、<font color="red"><b>超初心者なので</font></b>何か忘れているとか、余計なことやっているとか
　その他諸々あるのかもしれません。ゴメンナサイ。
※もっとこうすればいいのにとかこうやれば解決できますよ〜とかありましたら、
　こっそり教えてください^^
※作ったときの話はまた今度〜
　

#1.そもそもインストール時
###1-1. Docker編
早速インストール！

```
$ curl -sSL https://get.docker.com/ | sh
# Executing docker install script, commit: 3d8fe77c2c46c5b7571f94b42793905e5b3e42e4

ーーー中略ーーー

+ sudo -E sh -c docker version
Client: Docker Engine - Community
 Version:           20.10.1
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        831ebea
 Built:             Tue Dec 15 04:35:27 2020
 OS/Arch:           linux/arm
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.1
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       f001486
  Built:            Tue Dec 15 04:33:02 2020
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
ーーー以下略ーーー
```

というわけでDockerのバージョンは20.10.1
あとから思えばここから、ずれていたんだなぁ。 
今(2020年の年末)のKubernetesの対応外だけど何とかなるでしょと、、、
Workerになるラズパイにも同じようにインストール！

###1-2. Kubernetes編
Dockerのインストールが終わったので次はKubernetes！
Dockerのusermodやapt-mark、googleのapt-key取り込みなんかを済ませ、

```
$ sudo apt-get install kubelet kubeadm kubectl kubernetes-cni

ーーー中略ーーー

Unpacking kubeadm (1.20.1-00) ...
Setting up conntrack (1:1.4.5-2) ...
Setting up kubectl (1.20.1-00) ...
Setting up ebtables (2.0.10.4+snapshot20181205-3) ...
Setting up socat (1.7.3.2-2) ...
Setting up cri-tools (1.13.0-01) ...
Setting up kubernetes-cni (0.8.7-00) ...
Setting up kubelet (1.20.1-00) ...```
Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service → /lib/systemd/system/kubelet.service.
Setting up kubeadm (1.20.1-00) ...
Processing triggers for man-db (2.8.5-2) ...
Processing triggers for libc-bin (2.28-10+rpi1) ...
```

まぁ、これは普通にインストール終了。
というわけで、Kubernetesは1.20.1。
Workerになるラズパイにも同じようにインストール

ここから初心者による戦いがはじまりますｗ

#2. kubeadm initができない
今回使ったラズパイは
 <b>Raspberry Pi 4 Model B / 8GB</b>
というわけでGUIのOSでもメモリはこんな感じ

```
$ free -h
              total        used        free      shared  buff/cache   available
Mem:          7.7Gi       617Mi       5.8Gi       574Mi       1.3Gi       6.3Gi
Swap:            0B          0B          0B
```

というわけでマスターになるラズパイで早速kubeadm initを〜

```
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.20.1
[preflight] Running pre-flight checks
	[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.1. Latest validated version: 19.03
	[WARNING SystemVerification]: missing optional cgroups: hugetlb
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR Mem]: the system RAM (1 MB) is less than the minimum 1700 MB
[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
```

なんじゃこりゃ。。。
Dockerのバージョンが高いぜ！は良いとして(良くない)
<font color="red"><b>このシステム、メモリが1MBしかない</b></font>んですが、最低でも1700MB要ります〜！
ってどういうこと？？？
さっきの空きメモリはどこ行ってしまったんだ。。。
というわけでいろいろ漁ってみたんですがよくわからないので、
オプションに
　<b>--ignore-preflight-errors=Mem</b>
を指定して、エラー無視して逃げちゃおうｗ

```
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Mem
[init] Using Kubernetes version: v1.20.1
[preflight] Running pre-flight checks
	[WARNING Mem]: the system RAM (1 MB) is less than the minimum 1700 MB
	[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.1. Latest validated version: 19.03
	[WARNING SystemVerification]: missing optional cgroups: hugetlb
[preflight] Pulling images required for setting up a Kubernetes cluster

ーーー中略ーーー

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

ーーー以下略ーーー

```

今度はうまくインストールできた模様(できてないｗ)
もろもろ環境設定を済ませ、Workerの各ラズパイからkubeadm join!!!

joinできたら早速ノードをみてみよう！

```
$ kubectl get nodes
NAME     STATUS   ROLES                  AGE     VERSION
k8s-m    Ready    control-plane,master   5m23s   v1.20.1
k8s-w1   Ready    <none>                 3m56s   v1.20.1
k8s-w2   Ready    <none>                 3m41s   v1.20.1
k8s-w3   Ready    <none>                 3m20s   v1.20.1
```

なぁーんだ、普通に動くじゃないか〜
（と、このときは思っていた。。。）

#3. なんかおかしいぞ
masterからnodeもすべてみられたので、
<b>k8sインストール、恐るるに足らず</b>とか
ほくそ笑みながらメシ食べて戻ってきて
もう一度ノードみてみるかな〜

```
$ kubectl get node
The connection to the server <IP>:6443 was refused - did you specify the right host or port?
$ kubectl get node
The connection to the server <IP>:6443 was refused - did you specify the right host or port?
...

ーーー２,3分この状態ーーー

$ kubectl get node
Unable to connect to the server: net/http: TLS handshake timeout
$ kubectl get node
Unable to connect to the server: net/http: TLS handshake timeout
...

ーーー数１０秒この状態ーーー

$ kubectl get node
NAME     STATUS   ROLES                  AGE   VERSION
k8s-m    Ready    control-plane,master   1h    v1.20.1
k8s-w1   Ready    worker                 1h    v1.20.1
k8s-w2   Ready    worker                 1h    v1.20.1
k8s-w3   Ready    worker                 1h    v1.20.1

ーーー復活ーーー
```

？？？なんだ？？？
ログ見てもFatalErrorが出て、再起動しているのはわかるのだけど、手に負えず。。。
上の状態を１０分おきくらいに繰り返すので、これを使うのはツライ。。。
散々悩んだ結果、バージョンを下げるということに。

#４． Kubernetes アンインストール
master, worker全てのノードで行います。
ホントはサービス止めたりした方がいいんだろうけど。ムシムシｗ
###4-1. Kubernetesの設定削除
これをやらないと再インストール後に古い設定を参照してしまう　>オレ

```
$ sudo kubeadm reset
```

###4-2. hold解除
apt updateなどでバージョンが勝手に上がらないようにしていたので
まずはhold状態の確認をして、該当するモノをunhold

```
$ sudo apt-mark showhold
$ sudo apt-mark unhold kubelet kubeadm kubectl kubernetes-cni
```

###4-2. Kubernetesアンインストール
purgeして関連もautoremoveで消します

```
$ sudo apt-get purge -y kubeadm kubectl kubelet kubernetes-cni kube*
$ sudo apt-get autoremove -y
```

###4-3. ラズパイ再起動
なんか気持ち悪いのでラズパイ全台再起動ｗ
（というかホントはココでKubernetesの1.19.6を入れたけど、
上のget nodeのconnection refused問題が改善しなかったのさｗ）

#5. Dockerアンインストール
これも全台やります
###5-1. hold解除
Dockerもapt updateなどでバージョンが勝手に上がらないようにしていたので
まずはhold状態の確認をして該当するモノをunhold

```
$ sudo apt-mark showhold
$ sudo apt-mark unhold docker-ce docker-ce-cli
```

###5-2. Dockerアンインストール
purgeして関連削除

```
$ sudo apt-get purge -y docker-ce docker-ce-cli
$ sudo apt-get autoremove -y
```

###5-3. ラズパイ再起動
なんか気持ち悪いのでラズパイ全台再起動ｗ

#６． 再インストール
Dockerを19.03系、
Kubernetesを1.19系で再インストールしてみる
###6-1. Docker
#####6-1-1. バージョン選定
まずは19.03系で一番新しいのは何か調べてみる。

```
$ apt-cache madison docker-ce
 docker-ce | 5:20.10.1~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages
 docker-ce | 5:20.10.0~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages
 docker-ce | 5:19.03.14~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages
 docker-ce | 5:19.03.13~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages
 docker-ce | 5:19.03.12~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages
ーーー中略ーーー
 docker-ce | 5:19.03.2~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages
 docker-ce | 5:19.03.1~3-0~raspbian-buster | https://download.docker.com/linux/raspbian buster/stable armhf Packages
```

19.03系だと
　5:19.03.14~3-0~raspbian-buster
が良さそう。
（念の為、docker-ce-cliも調べたけど、同じ19.03.14だった)
というわけで、<font color="red"><b>Dockerは19.03.14</b></font>に決定！


#####6-1-2. バージョン指定してインストール

```
$ sudo apt-get install -y --no-install-recommends docker-ce=5:19.03.14~3-0~raspbian-buster docker-ce-cli=5:19.03.14~3-0~raspbian-buster
```

#####6-1-3. 確認

```
$ docker version
Client: Docker Engine - Community
 Version:           19.03.14
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        5eb3275d40
 Built:             Tue Dec  1 19:21:06 2020
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.14
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       5eb3275d40
  Built:            Tue Dec  1 19:19:00 2020
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

###6-2. Kubernetes
#####6-2-1. バージョン選定
こちらもバージョン確認

```
$ sudo apt-cache madison kubeadm
   kubeadm |  1.20.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubeadm |  1.20.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubeadm |  1.19.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubeadm |  1.19.5-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubeadm |  1.19.4-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubeadm |  1.19.3-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
ーーー中略ーーー
   kubeadm |   1.6.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubeadm |   1.5.7-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubeadm |   1.5.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
$
$
$ sudo apt-cache madison kubelet
   kubelet |  1.20.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubelet |  1.20.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubelet |  1.19.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubelet |  1.19.5-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubelet |  1.19.4-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubelet |  1.19.3-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
ーーー中略ーーー
   kubelet |   1.5.2-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubelet |   1.5.1-01 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubelet |   1.5.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
$
$
$ sudo apt-cache madison kubectl
   kubectl |  1.20.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubectl |  1.20.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubectl |  1.19.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubectl |  1.19.5-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubectl |  1.19.4-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubectl |  1.19.3-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
ーーー中略ーーー
   kubectl |   1.5.3-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubectl |   1.5.2-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
   kubectl |   1.5.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
 ```
1.19系だと
　1.19.6-00
が良さそう。
というわけで、<font color="red"><b>Kubernetesは1.19.6</b></font>に決定！
kubernetes-cniは。。。

```
$ sudo apt-cache madison kubernetes-cni
kubernetes-cni |   0.8.7-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
kubernetes-cni |   0.8.6-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
kubernetes-cni |   0.7.5-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
kubernetes-cni |   0.6.0-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
kubernetes-cni |   0.5.1-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
kubernetes-cni | 0.3.0.1-07a8a2-00 | http://apt.kubernetes.io kubernetes-xenial/main armhf Packages
```
最新でもいいやｗ（適当)

#####6-2-2. バージョン指定してインストール
```
sudo apt-get install -y --no-install-recommends kubelet=1.19.6-00  kubeadm=1.19.6-00 kubectl=1.19.6-00 kubernetes-cni
```

#####6-2-3. バージョン確認

```
$ kubelet --version
Kubernetes v1.19.6
$
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.6", GitCommit:"fbf646b339dc52336b55d8ec85c181981b86331a", GitTreeState:"clean", BuildDate:"2020-12-18T12:07:25Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/arm"}
$
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.6", GitCommit:"fbf646b339dc52336b55d8ec85c181981b86331a", GitTreeState:"clean", BuildDate:"2020-12-18T12:09:30Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/arm"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.6", GitCommit:"fbf646b339dc52336b55d8ec85c181981b86331a", GitTreeState:"clean", BuildDate:"2020-12-18T12:01:36Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/arm"}
```

###6-3. というわけで
無事
　Docker:19.03.14
　Kubernetes:1.19.6
になりましたー＼(^O^)／

で、kubeadm initもいくつかWARNINGがでているけど、
Memory 1MB問題も起こらず、インストールできました！

```
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

I0102 01:10:31.569593    5226 version.go:252] remote version is much newer: v1.20.1; falling back to: stable-1.19
W0102 01:10:31.967024    5226 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.19.6
[preflight] Running pre-flight checks
	[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
	[WARNING SystemVerification]: missing optional cgroups: hugetlb
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
```

get nodeもconnection refusedを繰り返さなくなりましたー＼(^O^)／

```
$ kubectl get node
NAME     STATUS   ROLES    AGE     VERSION
k8s-m    Ready    master   10h11m  v1.19.6
k8s-w1   Ready    <none>   10h15m  v1.19.6
k8s-w2   Ready    <none>   10h16m  v1.19.6
k8s-w3   Ready    <none>   10h18m  v1.19.6
```

おしまい。