1. 程式人生 > >僅需60秒,使用k3s建立一個多節點K8S叢集!

僅需60秒,使用k3s建立一個多節點K8S叢集!

作者: Dawid Ziolkowski丨Container Solution雲原生工程師

最近,我一直在Kubernetes上進行各種測試和部署。因此,我不得不一次又一次建立和銷燬Kubernetes叢集,有的時候甚至在一個小時內執行好幾次。但由於我需要測試的某個事項需要一個全新的叢集,所以簡單地刪除所有的pod、service、deployment等,來讓叢集變得“像新的一樣”並沒有任何作用。

同時,我還需要一個儘可能與生產環境相似的叢集,所以所有的本地解決方案(如Minikube、Vagrant等)都沒有任何作用。

一開始,我使用了一個雲提供商的託管Kubernetes,因為它易於部署,並且一旦叢集啟動,我只需要單擊一下按鈕就可以下載kubectl配置。但是它存在三個問題:

  • 它會花費很多時間——每個叢集大約需要10分鐘進行部署。如果我每天都要部署並銷燬它,那麼這些時間加起來就十分可觀了。

  • 需要手動下載與載入kubectl配置檔案(這個操作儘管很簡單,但手動還是略微麻煩)

  • 這是一項託管服務,因此我沒有對叢集的完全訪問許可權。

所以我決定建立一個解決方案,可以讓我在雲上快速又簡單地部署和銷燬Kubernetes叢集:

https://github.com/DavidZisky/60sk3s

最終,我得到了一個簡單的Bash指令碼,該指令碼可以在Google Cloud上建立虛擬機器,部署一個4節點的Kubernetes叢集(1個主節點和3個worker節點),下載kubectl配置,並將其載入到我的系統中,而完成這一切僅需60秒!從零開始(甚至沒有虛擬機器)到能夠執行kubectl apply -f any_deployment.yaml,僅需不到1分鐘!那麼具體要怎麼操作呢?

具體需求

於我而言,這一解決方案需要考慮的一個重要因素是儘可能可移植。因此我儘量讓自己不使用太多工具(因此不需要Terraform、Ansible,也不需要安裝和配置)。這是為什麼我用Bash編寫它的原因,而我唯一的依賴項是安裝和配置了GCloud CLI(帶有預設區域和專案集)。

30秒啟動虛擬機器

我們從虛擬機器開始。一般情況下,在雲上建立虛擬機器大約需要45秒到60秒的時間。例如,在DigitalOcean上,啟動虛擬機器(意味著ping開始響應)需要40秒,但你需要額外的15秒來啟動其他系統服務(最重要的是,SSH server能夠接收連線)。

所以,首先我們需要讓整個流程更快,至少快兩倍。

我們可以通過使用記憶體更小的OS映象來實現。這就是我堅持用Google Cloud的原因,因為它們提供最小的Ubuntu映象(小於200MB)。同時,我嘗試了許多輕量級發行版,但它們要不就是沒有核心模組,要不就是需要花很長的時間啟動。

在Google Cloud上建立和啟動Ubuntu迷你虛擬機器花費大約30秒(從GCloud API呼叫到SSH Server準備就緒)。那麼,我們第一步就完成了,現在我們接下來看剩下的30秒。

30秒部署K8S叢集

我們應該如何在30秒內部署一個Kubernetes叢集呢?答案是使用k3s!如果你還沒有聽說過k3s,可以翻閱我們往期文章或報名參加今天晚上8點半的線上培訓(http://z-mz.cn/Pmwv)進行了解。

通過使用k3s,我們不需要為Kubernetes啟動和執行操心太多,因為k3s安裝程式會為我們完成這些操作。所以,我的指令碼僅需下載並執行它即可。

將一切都連線起來

我們通過使用輕量的OS映象來在30秒之內啟動虛擬機器。我們使用了k3s,可以讓我們在20秒之內執行Kubernetes。現在,我們需要將所有的部件連線在一起。為了完成這一操作,我們準備了一個Bash指令碼:

  • GCloud命令以部署虛擬機器
  • 在主節點下載並執行k3s安裝程式
  • 獲取由k3s生成的token,它可用於給叢集新增節點
  • 在worker節點上下載並執行k3s安裝程式(將token作為引數)

唯一的挑戰是獲取生成的kubectl配置——Google虛擬機器上的公共IP地址在計算機上是不可見/無法訪問的(當你執行“ip addr”或“ifconfig”時,你也無法找到該IP地址)。所以,當k3s生成證書以及kubeconfig時,從外部訪問叢集是無效的。

但經過多方面搜尋,我發現了引數“--tls-san=”,它可以為證書生成提供額外的IP地址。因此,我們可以通過GCloud命令獲取IP地址,然後安裝k3s時,將其作為引數的值傳遞。如果k3s部署在所有節點上,並且worker節點已在master節點上正確註冊,那麼叢集就已經準備就緒。

剩下的最後一件事就是下載kubectl配置(使用scp以從master節點獲得檔案)。完成所有步驟僅需55到58秒。正如你所見,這個解決方案沒有什麼特別之處,只有幾個GCloud和curl命令貼上在一個bash指令碼中。但這可以很快完成工作。

下一步是?

首先,當前整個解決方案都經過硬編碼,以具有4個節點的叢集(一個主節點和3個worker節點)。使其易於配置,但我還從未測試過更大的叢集。但我會盡快新增該選項。

其次,現在kubectl配置僅供下載(因此你可以將其作為引數傳遞給kubectl命令),或覆蓋現有的kubectl配置(已經能夠滿足我的需求,因為我沒有長期執行的叢集)。但是,新增一個將配置附加到現有配置中的功能選項,然後更改上下文,長期來看是有益的