鯨魚水上飄的修煉 Day 4:Raspberry Pi上的Kubernetes

兩個月學習Docker & Kubernetes 的心得分享

最近一個開發項目,被迫在三個月的時間內把系統Docker化並且用Kubernetes來做Cluster管理,只好硬著頭皮把這些新技術學會,目前是兩個月結束了,乾脆來寫一些文章,希望能讓大家用比較低的學習成本,學會這些東西。
被Raspberry Pi折騰了兩天,終於成功安裝好kubernetes了,不過也好,如果一切順利,就沒有價值特別寫一篇文章來介紹如何在Raspberry Pi上安裝kubernetes了,本篇把自己遇到的各種問題與解決方法記錄下來,希望能幫助到大家。
P.S. 本來是在Raspberry Pi 3 Model B上安裝HypriotOS,原本以為會比較順利,結果還是各種障礙,索性換回熟悉的Raspbian,循序漸進地安裝kubernetes。

環境

Raspberry Pi 3 Model B
Raspbian OS (image:2018–04–18-raspbian-stretch-lite.zip)
Docker version 18.05.0-ce, build f150324
Kubernetes version: v1.10.2

安裝Raspbian

下載Raspbian Image:https://downloads.raspberrypi.org/raspbian_lite/images/

本例是下載2018–04–18-raspbian-stretch-lite.zip

利用Etcher來寫入Image:

安裝kubernetes

直接貼上以下程式碼:

接著重新啟動電腦

sudo reboot

初始化kubernetes master

直接貼上以下程式碼:

到這裡即完成kubernetes的安裝,和kubernetes master的建置。

如果有任何問題,開始troubleshooting…

如果安裝過程遭遇各種問題,記得一定要善用log訊息,可以幫助我們找到問題:

systemctl status kubelet
journalctl -xeu kubelet

當我們修改任何設定時,記得要先reset kubeadm:

kubeadm reset

否則會產生以下錯誤:

cannot pull or find the following control plane images…

當發生以下錯誤時:

先嘗試pull kubelet無法處理的docker image(錯誤訊息中有提示哪些image):

docker pull mirrorgooglecontainers/kube-apiserver-arm:v1.10.2
docker pull kube-apiserver-arm:v1.10.2
docker pull k8s.gcr.io/kube-controller-manager-arm:v1.10.2
docker pull k8s.gcr.io/kube-scheduler-arm:v1.10.2
docker pull k8s.gcr.io/etcd-arm:3.1.12

The connection to the server <IP>:8080 was refused

配置設定檔:

當出現The connection to the server <IP>:8080 was refused — did you specify the right host or port?時,請執行以下設定:

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

重啟kubeadm:

sudo kubeadm reset && systemctl daemon-reload && sudo kubeadm init --config kubeadm_conf.yaml

如果還是有問題,或者等到天荒地老了都沒初始化完成,再來看看journalctl -xeu kubelet

journalctl -xeu kubelet

如果不斷產生以下錯誤訊息:

Unable to update cni config: No networks found in /etc/cni/net.d

通常是因為proxy server導致kubelet無法連線到API Server,我們直接關閉http proxy:

export no_proxy=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')

關閉swap

Kubernetes 1.7以上的版本必須關閉swap,否則會發生錯誤:

swapoff -a

或者用以下指令關閉swap

sudo dphys-swapfile swapoff && \
sudo dphys-swapfile uninstall && \
sudo update-rc.d dphys-swapfile remove

當swap關閉時,以下指令不會輸出任何內容(no entries)

sudo swapon --summary #用來確認swap已經關閉

[ERROR KubeletVersion]: couldn’t get kubelet version

systemctl status kubelet

這幾天安裝新的機器,一直遇到這個錯誤,還在找解決的方法中…

總結

在raspberry pi上裝kubernetes真是各種新滋味,docker的版本 x kubernetes的版本 x raspbianOS的版本,三個做排列組合,每個都得到不一樣的error message,最近更新後,感覺又有一堆相容性問題,翻log翻到眼脫,各種troubleshooting都無解。千萬別想不開把新技術用在arm架構的電腦上。

參考來源:

我是James,一位自由接案工作者
對於軟體開發與接案工作充滿熱忱,截至2018年,不知不覺已經累積11年的時間在這個領域打轉,擁有6年的接案經驗。 寫作是我一個新的嘗試,初衷是希望能讓這個環境變得更好,從三個面向出發:
1.個人:強化團隊成員的生產力與技術力,提供技術觀點與教學、工作方法等硬實力。
2.組織:培養良好的團隊合作態度與企業文化、分享合作與溝通技巧。
3.社會:讓客戶、發包單位知道如何有效處理系統外包,把資源花在刀口上,並透過接案經驗分享促進良好的合作。
FB粉絲頁艾菲肯先生——您最佳的技術夥伴
個人刊物 艾菲肯先生的咖啡時間
工作室網站
Efacani.com