使用 KubeKey 搭建 Kubernetes/KubeSphere 環境的"心路(累)歷程"

Daniel_Hu 發表於 2022-06-13
Kubernetes

今天要幹嘛?

今天我要給 KubeKey 挑個刺!

身為一個 KubeSphere Community Member,至今為止我居然沒有用過 KubeKey,是不是很過分?說出來都覺得沒臉在 KubeSphere 社群立足啊!

想當年開始玩 KubeSphere 時,每走一步我都覺得“不和諧”。雖說 KubeSphere 早已經有了足夠的知名度和大量的企業使用者,但是我總能挑出“刺”,天天給 KubeSphere 社群提意見建議……

沒錯,最終他們“受不了”了,決定邀請我加入 KubeSphere 社群,成為一名光榮的 Member!

現在我自己也搞開源社群了。自從開始管理 DevStream 開源社群後,我基本就沒有精力參與 KubeSphere 社群了。哎,一顆躁動的心,一雙不安分的手!我得做點啥,但是開發我是沒精力參與了,要不,發揮一下我的“臭毛病” - 晚期的強迫症和極致的細節洞察力,去挑挑刺吧!

沒錯!

我決定試用一下 KubeKey!一方面把這些“刺”反饋給 KubeSphere 社群,幫助他們進一步完善 KubeKey 的使用體驗!另外一方面在這個過程中熟悉 KubeKey 的用法,看下能不能找到 DevStream 和 KubeSphere 協作的點,比如用 DevStream 簡化 KubeSphere 的安裝部署和配置過程。

在哪裡幹?

KubeSphere 社群給了我一個開發機,一臺 Linux vm,酷!我就在這個 Linux vm 上“幹”它吧!

從哪裡開始幹?

這還不簡單,README 文件呀!

快速開幹!

我們在文件裡找 Quick Start,沒錯,有,大致長這樣:

{{< KubeKey Quick Start

開炮!

KubeKey Installation 1

看到這個日誌,是不是看著特別像“no errors, no warnings”,一派祥和,歌舞昇平,馬上可以用 kubectl 命令看下嶄新的 Kubernetes 叢集了!(不要和我槓單節點 k8s 環境是不是叢集,官方稱之為“單節點叢集”)

我就不演示 kubectl get xxx 了,結果慘不忍睹!我們仔細看這個輸出日誌,對,細品,有沒有發現這裡用了幾行非 error 級別的日誌告訴我們需要先安裝:

  • conntrack
  • socat

給 KubeKey 的建議1:這裡是不是用 error level logs 更合理一些?

給 KubeKey 的建議2:能不能日誌裡直接告訴使用者需要先安裝 conntrack 和 socat,並且同時列印出安裝命令?(我知道 centos 和 ubuntu 安裝方式不一樣,不過可選的命令集合其實很有限,kk 獲取系統型別也很容易,給使用者更友好的提示其實很容易做到)

給 KubeKey 的建議3:表格裡那麼多項沒有 y 的,到底哪些是必須有的哪些是不必須的?這個結果讓使用者看得心慌:我需要先安裝那麼多東西才能開始用 kk?望而卻步啊!

解決依賴問題再繼續幹!

回到文件,其實仔細看可以在這裡發現前置依賴,就是這段文字太長了,讓人有點沒耐心仔細看完。

conntrack installation

還是 Google 大法好用!我們照著這個思路執行下面命令:

yum -y install conntrack-tools
yum -y install socat

不出意外的話這一步很難失敗。對,如果你失敗了,那就是意外。真的失敗了,那就是 yum 配置問題了,明白怎麼處理吧?

然後繼續執行 ./kk create cluster,看下能不能得到和諧的輸出。(記得如果環境不夠“科學”,要先執行export KKZONE=cn,否則你會在某一步卡半天,卡到懷疑人生,無法判斷是網路太慢還是網路不通)

給 KubeKey 的建議4:當命令卡住的時候,比如映象下載太慢時,有沒有超時邏輯?或者能不能定時輸出一個日誌告訴使用者“沒有卡死”?或者顯示一下下載的進度條?總之不要長時間沒有日誌,使用者會忍不住去 Ctrl+c,然後一臉迷茫,下一步幹啥?

KubeKey Installation 2

比剛才和諧了,不過第一行日誌很不和諧。

如果 Failed 影響大,比如會讓某個功能不可用,那麼應該用 error 級別,這樣我會嘗試去修復;反之 WARN 級別的意思就是“你可以忽略,忽略也能用”。OK,我選擇忽略。(我不一定真的忽略,但是很多使用者肯定會這樣想。)

給 KubeKey 的建議5:儘量避免 WARN 日誌,尤其是 WARN 配合 Failed 一起用,讓使用者又覺得這個錯誤很嚴重,又覺得可以忽略。

接著就看網路環境了。

順利的話,最後可以看到這樣的日誌:

Installation is complete.

Please check the result using the command:

    kubectl get pod -A

讓我們執行 kubectl get pod -A,看下“豌豆莢”們是不是正常:

$ kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-75ddb95444-6dg9b   1/1     Running   0          30m
kube-system   calico-node-rqqrk                          1/1     Running   0          30m
kube-system   coredns-5495dd7c88-9hlrp                   1/1     Running   0          30m
kube-system   coredns-5495dd7c88-nlp5d                   1/1     Running   0          30m
kube-system   kube-apiserver-i-hmqwjh0m                  1/1     Running   0          30m
kube-system   kube-controller-manager-i-hmqwjh0m         1/1     Running   0          30m
kube-system   kube-proxy-x69p9                           1/1     Running   0          30m
kube-system   kube-scheduler-i-hmqwjh0m                  1/1     Running   0          30m
kube-system   nodelocaldns-vd77n                         1/1     Running   0          30m

我勒個乖乖,Amazing 啊!清一色的 Running、1/1 且 0 restarts,堪稱完美!

如何幹翻重來?

裝好了,然後呢?

幹翻重來吧,因為直接執行 ./kk create cluster 並不帶 KubeSphere。我們體驗過 k8s 的安裝過程了,整體還是挺簡單易用的。下面試下帶 KubeSphere 的玩法吧。

幹翻操作:

./kk delete cluster

執行完這個命令後,k8s 叢集會被刪掉。當然,對應的 kubectl 和 docker images 我不希望被刪掉,事實證明 KubeKey 也不會把它們刪掉。對,我驗證了:

kubekey images

連著 KubeSphere 一起幹!

命令是如此的簡單,只需要加一個 flag 就夠了:

./kk create config --with-kubesphere

幹不過,輸了。

結果不美麗啊:

{{< KubeSphere Installation 1

我。。。

你。。。

你給我一個 WARN 後就直接掛了?

給 KubeKey 的建議6:WARN 日誌前面提到了,這裡再次印證我的觀點,日誌級別要嚴謹,WARN 要少用。

這個錯誤,,,看起來是要 Google 一會了。但是我懶啊!這不就是和 docker 安裝方式有關嘛(我猜可能和版本也有關係),我卸掉 docker,讓 KubeKey 來安裝總行了吧!

給 KubeKey 的建議7:如果你們知道這個錯誤的解決方案,請把方法(或者參考資料連結)貼到日誌裡,不要期待使用者可以輕鬆 Google 一下解決。當然,我不能接受你說我解決不了,哈哈,不過現在是晚上10:30分,我想快點打完收工了,不查了。

其實這個機子本來沒有 docker,為什麼我會提前安裝呢?因為我勤勞?不存在的。我是被這段內容誤導的:

KubeKey Installation Docs

看這個縮排級別,你瞟一眼,是不是最顯眼的是下面的 Note?Note 裡說先安裝 docker,然後假如你很熟悉 docker,是不是就順手先裝了 docker 在繼續看文件?

對,我就跪在了這裡。裝了 docker 才發現,這個 Note 是針對 Build Binary from Source Code 的 Note。。。

給 KubeKey 的建議8:這裡的文件也優化下吧,讓 Note 看起來不那麼像全域性 Note。

重整旗鼓,繼續幹!

上來就是一套組合拳:

yum remove docker
./kk create cluster --with-kubesphere

不出我所料,錯誤繞過去了!

對,我就是這麼心安理得,可以忍住不去查前面這個錯誤是怎麼回事,我選擇繞過後晚上還是可以睡得香噴噴!我相信 KubeSphere 社群過幾天會告訴我答案的。

KubeSphere Installation 2

截圖看不到效果,大家腦補一下上面這個箭頭會左右移動,對,動態的!太可愛了吧!明天我要去問下誰寫的這個程式碼,真是個可愛的程式設計師!

在等這個箭頭停下來的時間裡,再給 KubeKey 加一個建議吧:

KubeKey Installation Docs

給 KubeKey 的建議9:這裡的文件也優化下吧,風格一致更優雅,要麼都寫一個“示例”版本,要麼都用[version]佔位。

KubeSphere Installation 3

給 KubeKey 的建議10:y 和 yes 在使用者意圖裡絕對是一模一樣,要不要相容下?包括大小寫(我沒有測試大小寫是不是相容)

KubeSphere Installation 4

給 KubeKey 的建議11:如果一次安裝長時間卡住,可能是網路問題。這時候如果 Ctrl+c 然後重新執行安裝,會出現這種情況,沒錯,兩個 ks-installer。當然,我知道需要先 delete 一下就能繞過去,但是或許 kk 能夠識別到使用者沒有 delete 並且給出提示,那就更“優雅”了。

再次重整旗鼓,繼續幹!

由於我用的雲主機,前面安裝過程太久,我去洗了個澡,回來後終端斷開連線了。沒錯,再次進去的時候我忘記執行 export KKZONE=cn 了,所以失敗了一次。再次執行的時候忘記 delete 了,所以再失敗了一次。

於是,我要 delete 了:

KubeSphere Installation 5

慘不忍睹,慘絕人寰啊!!!

你給我裝的 docker 呀,怎麼還能有這個錯誤?

同樣,你告訴我 WARN,我是不會上心的。

無視

and

繼續!

KubeSphere Installation 6

好玩的事情是,這次看著錯誤資訊似乎,,,和前面沒啥區別呀。。。但是沒有直接退出程式,而是繼續往下走了!好吧,我是不會去研究這個錯誤的!

又到了這個“可愛到爆”的箭頭了,繼續漫長的等待吧~

KubeSphere Installation 7

不對勁啊,為什麼那麼久,是不是掛了?

好吧,喚醒一下我沉睡多年(準確說是大半年)的 k8s 排錯技能!

我看到了 ks-installer pod 的錯誤 events 資訊:

KubeSphere Installation 8

有意思,這是個大 bug 了吧,映象不存在?我得去問一下內部人員:

KubeSphere Installation 9

給 KubeKey 的建議11:對著文件走不通安裝過程,這算大 bug 了,不用我細說怎麼 fix 了吧。

一鼓作氣,再而衰,三而竭,竭前最後掙扎著幹一次

沒力氣打“組合拳”了,一條簡單的命令,然後小拳拳敲個回車:

./kk create cluster --with-kubesphere v3.2.1

KubeSphere Installation 10

好傢伙,一把給我整到了晚上11點。。。我不要面子的啊,我在家辦公還要加班啊,我是朝十晚四午休三小時的男人啊……

不過說實話,看到這個熟悉的日誌,還是很親切的!畢竟去年不知道看了多少遍這個日誌!(別不信,我是深度玩過的,有視訊為證)

繼續看下 pod

KubeSphere Installation 11

很和諧!Amazing 啊!

(其實沒有特別和諧,restarts 不是全0。不過沒關係,我知道這不影響功能,只是安裝過程還有優化的空間而已。)

你想看最後的 Dashboard ?我也想!

不過我沒有 ELB,焦急等待中……(委託大佬給我配置 ELB 去了)

半小時後……

登入頁面來了!

KubeSphere Login

進去後,熟悉的感覺,熟悉的味道!

KubeSphere Dashboard

後面我一定要再寫幾篇文章介紹下 KubeSphere 怎麼玩!當年那一堆筆記,那些付在 KubeSphere 上的青春,不寫點啥可惜了!

最後的總結

  1. 官方文件比 GitHub 的 README 更適合“普通使用者”;
  2. 好睏啊!!!我要睡覺了,總結啥嘛,沒啥好總結的。

最後的最後

轉載請註明出處!

更多我的文章,請移步我的個人網站:https://www.danielhu.cn

更多 DevStream 團隊的文章,請移步 DevStream 部落格網站:https://blog.devstream.io

想要及時收到我的最新文章,請關注我的個人公眾號:胡說雲原生