0.はじめに
2020年〜2021年の冬休みを使って
Qiitaにたくさん存在するラズパイによるKubernetes環境を
諸先輩方の投稿を参考に構築してみました。
が。。。。。
インストールはできたけど超不安定。
初心者には手に負えるわけもなく、
最終的にはKubernetesとDockerのバージョンを下げるという負け犬の話です。
※2020年の年末の話です。将来のバージョンでは普通に動くんだと思います。
※あと、超初心者なので何か忘れているとか、余計なことやっているとか
その他諸々あるのかもしれません。ゴメンナサイ。
※もっとこうすればいいのにとかこうやれば解決できますよ〜とかありましたら、
こっそり教えてください^^
※作ったときの話はまた今度〜
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になるラズパイにも同じようにインストール
ここから初心者による戦いがはじまりますw
2. kubeadm initができない
今回使ったラズパイは
Raspberry Pi 4 Model B / 8GB
というわけで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のバージョンが高いぜ!は良いとして(良くない)
このシステム、メモリが1MBしかないんですが、最低でも1700MB要ります〜!
ってどういうこと???
さっきの空きメモリはどこ行ってしまったんだ。。。
というわけでいろいろ漁ってみたんですがよくわからないので、
オプションに
--ignore-preflight-errors=Mem
を指定して、エラー無視して逃げちゃおうw
$ 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:
ーーー以下略ーーー
今度はうまくインストールできた模様(できてないw)
もろもろ環境設定を済ませ、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もすべてみられたので、
k8sインストール、恐るるに足らずとか
ほくそ笑みながらメシ食べて戻ってきて
もう一度ノードみてみるかな〜
$ 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?
...
ーーー2,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
...
ーーー数10秒この状態ーーー
$ 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が出て、再起動しているのはわかるのだけど、手に負えず。。。
上の状態を10分おきくらいに繰り返すので、これを使うのはツライ。。。
散々悩んだ結果、バージョンを下げるということに。
4. Kubernetes アンインストール
master, worker全てのノードで行います。
ホントはサービス止めたりした方がいいんだろうけど。ムシムシw
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. ラズパイ再起動
なんか気持ち悪いのでラズパイ全台再起動w
(というかホントはココでKubernetesの1.19.6を入れたけど、
上のget nodeのconnection refused問題が改善しなかったのさw)
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. ラズパイ再起動
なんか気持ち悪いのでラズパイ全台再起動w
6. 再インストール
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だった)
というわけで、Dockerは19.03.14に決定!
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
が良さそう。
というわけで、Kubernetesは1.19.6に決定!
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
最新でもいいやw(適当)
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
おしまい。