做者 | Lukasz Raczylogit
編譯 | 雲原生計算編輯部github
昨晚在個人樹莓派上進行更新的時候,全部節點忽然中止檢測網絡接口,而且沒法恢復!!!docker
那時我有兩個選擇,但都很費時:api
方法1:提前起牀,並按照我本身以前的文章手動重建,也許還會發現一些改進的餘地。我已經親身試驗了不少次:這種方法很容易出錯,主要是輸入錯誤或跳過一個或兩個步驟,而後在接下來的半個小時試圖找出到底發生了什麼事,再抹去一切並從頭開始一遍又一遍。服務器
方法2:及早醒悟並從頭開始編碼,這樣可讓個人最終解決方案實現執行一次並永久使用,使整個集羣的重建和生產儘量容易地進行復制。固然,這將意味着更多的停機時間。可是,它的好處將是長期的,這使我沒必要擔憂集羣自己,並最終將其視爲一個穩定的解決方案,能夠向其遷移整個本地基礎架構。微信
自動化傳奇開始
在開始任何工做以前,我都很是專一於基礎知識,並提出了在整個過程當中遵循的一些原則。這樣建立的環境各部分之間的代碼之間邏輯上有不少分隔,所以親愛的讀者,您能夠更容易地更改代碼或註釋掉整個文件以禁用此處或此處的少許功能。網絡
原則1:在樹莓派上設置 Kubernetes 集羣能夠分爲三個部分:設置存儲卡,在系統級別上進行節點配置,最後擴展 Kubernetes 資源。架構
原則2:在個人舊版 Intel NUC 上運行着一個NFS服務,該服務已鏈接到 DROBO 存儲。很適合將它用做全部節點的永久共享存儲。app
原則3: 樹莓派的集羣在個人家庭網絡中的 VLAN 中運行,所以保護它不是個人優先事項,全部服務以及節點都應易於訪問,而無需處理 credentials。ssh
要重現結果(或使其發揮做用),您將須要:
-
Mac:當我有空安裝Linux VM時,我可能會在腳本中添加平臺監測部分
-
Ansible:我使用的版本爲2.10.6
-
Terraform:用0.13.4編寫,也適用於0.14.8
-
Make:任意版本應該都可使用
樹莓派集羣:步驟1
樹莓派使用存儲卡做爲其硬盤驅動器。這可能不是最佳選擇,而且絕對不會給您最大的讀寫操做速度,但對於業餘愛好項目而言,應該足夠了。
步驟1須要注意什麼?
-
格式化存儲卡
-
將存儲卡分爲兩個分區-1GB +其他存儲卡
-
將Alpine Linux鏡像複製到存儲卡上
-
建立系統覆蓋
系統覆蓋負責設置 Promisc 模式下的 eth0(對於MetalLB來講是必需的),並配置 SSH 免密登錄。
重要提示:檢查001-prepare-card.sh的來源,請確保剛纔插入的存儲卡其實是/dev/disk5,不然可能會丟失數據。
結果:準備6張存儲卡大約須要一分鐘。
樹莓派集羣:步驟2
這一步纔是真正有趣的開始。我猜你已經把存儲卡插入到你的樹莓派,鏈接了全部的電纜(網絡和電源),並容許它們啓動?你如今須要獲取你的設備的 IP 地址——你能夠經過鏈接屏幕到每個設備並執行 ifconfig eth0 或者登陸到你的路由器並檢查來實現。用合適的值調整 pi-hosts.txt。
[masters]pi0 ansible_host=192.168.50.132 # Pi0[workers]pi1 ansible_host=192.168.50.135 # Pi1pi3 ansible_host=192.168.50.60 # Pi3pi4 ansible_host=192.168.50.36 # Pi4pi2 ansible_host=192.168.50.85 # Pi2pi5 ansible_host=192.168.50.230 # Pi5
重要提示:從此不多有事情須要 pi0 主機名。
將如下內容添加到~/.ssh/config,強制將全部pi *主機做爲根鏈接。
Host pi? User root Hostname %h.local
由於咱們已經準備好了微機,因此咱們須要爲 Ansible 運行作好準備。使用 001-prepare- anable .sh 腳本能夠輕鬆完成此操做,該腳本將將 ssh 到 pi-hosts 文件中指定的每一個服務器,爲NTP配置 chrony 並安裝 Python 解釋器。
重要提示:您可能須要檢查 rpi.yaml 文件並根據須要調整vars部分。
成功執行此步驟後,您能夠執行 ansible-playbook rpi.yaml -f 10 來運行Ansible,該運行將按如下順序進行:
常見操做:
-
安裝必要的軟件包
-
分區並格式化 RPI 存儲卡
-
將「更大」的分區設置爲系統磁盤
-
添加全部 fstab 條目
-
提交更改
-
從新啓動樹莓派以從「permanent」分區啓動
KUBEMASTER:
-
使用 kubeadm 設置主節點
-
將令牌存儲在本地(在static/token_file
中
) -
root
在樹莓派上設置能夠訪問 kubectl 的用戶 -
將 Kubernetes 配置保存在本地(在static/kubectl.conf
中
)
KUBEWORKER:
-
將 token 複製到 worker 節點
-
它使 worker 經過 token 文件加入您的主服務器
-
將kubectl.conf複製到 workers 的root用戶
基本操做:
-
從 Master 上移除污點,使其參與工做負載
-
在節點上安裝py3-pip,PyYaml和helm
若是您還在閱讀(恭喜您),您剛剛完成了基本的Kubernetes集羣。我相信,這就像執行幾個腳本而後等待它們完成同樣簡單,並且確定比手動方法更好。
重要提示:您能夠任意屢次運行它。一旦完成,你的存儲卡就不會從新格式化。
結果:安裝6節點的基本 Kubernetes 集羣大概須要花費幾分鐘,具體的時間取決於你的網絡連接狀態。
樹莓派集羣:步驟3
成功執行前兩個步驟後,您應該已經準備好將樹莓派的集羣用於第一個部署。只需不多的基本設置步驟便可使其按需運行,可是請猜想一下……它們也被自動設置,並由 Terraform 來負責。
首先讓咱們看一下配置:
# Variables used for barebone kubernetes setupnetwork_subnet = "192.168.50"net_hosts = { adguard = "240" adguard_catchall = "249" traefik = "234" torrent_rpc = "245"}nfs_storage = { general = "/media/nfs" torrent = "/mnt/drobo-storage/docker-volumes/torrent" adguard = "/mnt/drobo-storage/docker-volumes/adguard"}# ENV variable: TRAEFIK_API_KEY sets traefik_api_key# ENV variable: GH_USER, GH_PAT for authentication with private containers
您能夠看到我正在192.168.50.0/24網絡中運行集羣,可是默認狀況下,MetalLB 將使用地址 200-250 做爲網絡地址池的「end」。當我有了個人家庭 torrent 服務器和來自Adguard 的 DNS 時,我但願它們具備特定的地址,連同 Traefik 平衡器爲儀表板提供「東西」。
重要提示:
nfs_*_path值應與您在步驟2中更新的設置兼容。
確保您的 Kubernetes 配置文件
~/.kube/config更新了
static/kubernetes.conf
的訪問細節,
我正在使用home-k8s做爲上下文名稱。
Terraforming有什麼做用?
-
網絡
安裝 flannel 和host-gw的配置補丁;
安裝 metalLB 並將網絡設置爲 var.network_subnet200–250; -
Traefik
安裝 Traefik 代理,並經過 metalLB 負載平衡器將其公開到您的家庭網絡。Traefik 儀表板自己能夠經過如下方式訪問traefik.local
在樹莓派集羣上運行的 Traefik 儀表板
Adguard
使用 NFS 安裝具備持久卷聲明的 Adguard DNS 服務;
經過 traefik 公開儀表板,並經過家庭網絡中的專用IP公開服務自己,以下所示:adguard.local
在樹莓派集羣上運行的 Adguard Home
Prometheus
在全部節點上安裝和部署 Prometheus 監控堆棧和 grafana。更新 Prometheus DaemonSet,從而消除了進行卷掛載的必要性。它也經過 traefik 將 grafana 曝光爲 grafana.local。默認的 grafana 用戶/密碼組合爲 admin:admin。Grafana 附帶一個預裝的插件 devopsprodigi - kubegrafi -app,我認爲這是用於集羣監控的最佳插件。
在樹莓派集羣上運行的 Grafana 儀表板
Kubernetes Dashboard
安裝 Kubernetes Dashboard 並經過 traefik 將其公開k8s.local
在樹莓派集羣上運行的 Kubernetes 儀表板
1.Torrent
使用 Flood Web 界面安裝和部署torrent服務器(rTorrent)。經過公開儀表板torrent.local。它使用大量的掛載來存儲數據和配置。有一個將複製設置爲1的理由:-rTorrent的lock file有問題,而且因爲它使用共享目錄,所以若是檢測到lock file件,它就不會啓動。(在個人私有配置中)rTorrent被設置爲監聽端口23340。
2.備份
因爲樹莓派運行在存儲卡上,因爲常常讀寫操做,存儲卡可能會磨損,因此我決定在NFS中添加etcd的按期備份。它們天天運行一次,在t erraform 應用的配置下——每一個備份「重量」約爲32兆字節。
爲了使操做更簡單,我建立了 Makefile,該文件應該能夠幫助您進行設置。您可能須要設置如下環境變量。
TRAEFIK_API_KEY // Traefik API keyGH_USER // Github userGH_PAT // Github Personal Access Token
重要提示:Github 證書如今尚未使用,但我計劃很快添加身份驗證,以便從 GHCR 提取私有鏡像。
ADDITIONAL_ARGS=-var 'traefik_api_key=$(TRAEFIK_API_KEY)' -var "github_user=$(GH_USER)" -var "github_pat=$(GH_TOKEN)"apply: cd infrastructure; terraform apply $(ADDITIONAL_ARGS) -auto-approve -var-file ../variables.tfvarsplan: cd infrastructure; terraform plan $(ADDITIONAL_ARGS) -var-file ../variables.tfvarsdestroy: cd infrastructure; terraform destroy $(ADDITIONAL_ARGS) -var-file ../variables.tfvarsdestroy-target: cd infrastructure; terraform destroy $(ADDITIONAL_ARGS) -var-file ../variables.tfvars -target $(TARGET)refresh: cd infrastructure; terraform refresh $(ADDITIONAL_ARGS) -var-file ../variables.tfvarsinit: cd infrastructure; rm -fr .terraform; terraform initimport: cd infrastructure; terraform import $(ADDITIONAL_ARGS) -var-file ../variables.tfvars $(ARGS)lint: terraform fmt -recursive infrastructure/
總結
全部代碼可在 GitHub 上的 lukaszraczylo / rpi-home-cluster-setup 中使用,任何人都可無償使用和修改)。我還發布了具備支持 ARM64 處理器的多體系結構的定製構建的 docker 映像(rTorrent和Flood)。
自動化能夠節省時間,節省精力,並且絕對能夠完成工做。我常常清除整個集羣,並使用前面提到的存儲庫從頭開始構建,以確保它按預期工做。我將保持這篇文章和存儲庫的最新功能和特性。
原文連接:
https://itnext.io/i-broke-my-kubernetes-cluster-running-on-raspberry-pi-355234a24d
重磅!雲原生計算交流羣成立
掃碼添加小助手便可申請加入,必定要備註:名字-公司/學校-地區,根據格式備註,才能經過且邀請進羣。
瞭解更多微服務、雲原生技術的相關信息,請關注咱們的微信公衆號【雲原生計算】!