1. 程式人生 > >如何建立高效、經濟的Kubernetes叢集

如何建立高效、經濟的Kubernetes叢集

Kubernetes是我主要學習的主題之一。我知道不光是我,還有一定數量的人願意在工作之餘進一步使用和研究它。


本文是介紹關於如何建立一個高效的Kubernetes叢集,用於在Scaleway上使用Terraform和Rancher 2.x的開發目的。我假設你已經知道了(或者至少聽過):

  • Kubernetes

  • Terraform

  • Rancher

  • Scaleway

  • Cloudflare


概    述


下圖的概要描述了本文嘗試實現的內容:

部署工作大部分將由Terraform自動完成。我們將建立一個Rancher伺服器,在上面新增Rancher代理來建立和管理Kubernetes叢集。域解析也將由Terraform自動配置到Cloudflare。所有的伺服器都將部署到Scaleway上,而且它們非常的便宜(在撰寫本文時Start1-S伺服器只花費€3.99/mo和€0.008/小時!)


為什麼選擇Rancher?


如果你想從頭開始學習Kubernetes成為一名kubectl魔術師,這個出發點不錯,我不反對。不過在我看來,僅僅是學習Kuberenetes是不夠的,更重要的是你想用它做什麼,你想實現什麼。比如,我經常開發微服務和功能來進行測試(特別是webhook整合),並在Kubernetes上執行它。當然,在管理Kubernetes方面kubectl起到了很大的幫助,但是當我想檢查某些服務的日誌或建立一些secrets時,我不得不使用kubectl

輸入大量命令創建出大量的清單,這些常讓我感到疲憊。有時候我只是想簡單地部署一下資源,並不使用清單。我知道有很多工具(如stern、ksonnet等等)可以幫助實現這些工作流,但是我從Rancher 1.x開始就是忠實使用者了,知道他們的UI可以讓工作變得更簡單直觀。這也是我為什麼在這個工具集中包含Rancher的原因。


讓我們開始吧!


話不多說,我們開始部署一些資源吧。這兒有一些準備工作:

  • 準備一個Scaleway賬號

  • 準備一個Cloudflare賬號

  • 在Cloudflare中設定至少1個zone(你可以得到一個免費的服務域比如Freenom)

  • 克隆kenfdev/rancher-scaleway倉庫

  • 安裝terraform

  • 安裝kubectl

我不會詳細解釋這些內容,因為如果都寫的話這篇文章得爆炸了。你可以自己搜尋找到相關的資源。


在這裡有一個重要的提示。我們將在Scaleway上部署伺服器,這些都不是免費的。所以事先要確認這一點,它會花費一些錢(不過Scaleway非常便宜)。我不會對這些成本承擔任何責任,所以如果你完成了,一定要破壞掉它們。


從Scaleway獲取資訊


我們將在Scaleway上自動部署伺服器,為此,我們需要有一個token。在Scaleway中轉到Credentials頁面並點選Create new token。把Secret key記錄下來,因為我們之後會用到這個。

同時,前往Account頁面找到ORGANIZATION ID做好記錄。到現在為止你已經完成了Scaleway的部分,Terraform會處理好其他事情。


從Cloudflare獲取API token


我們需要為建立的Rancher伺服器設定DNS,為了實現這一點,我們需要獲得Cloudflare的API token。前往Cloudflare下的My Profile,可以在這裡找到API Keys。如下圖所示點選Global API KeyView按鈕。

現在記錄下這個token,到這裡收集資訊的工作結束了。


為Rancher伺服器準備Terraform資源


現在我們已經有了需要收集的資訊,那麼下一步就是用Terraform來部署了。先去克隆kenfdev/rancher-scaleway倉庫。


首先,前往rancherserver目錄,按照terraform.tfvars.sample建立一個tfvars檔案,開啟它:

tfvars檔案看起來像這樣:

需要對這些內容做修改:

  • scw_token – 你的Scaleway Secret Token

  • scw_org – 你的Scaleway Organization ID

  • admin_password – 你將在Rancher伺服器使用的密碼

  • rancher_server_url – Rancher伺服器所使用的URL。Terraform會為你的cloudflare zone設定一個rancher子域名。所以如果你的zone名為example.com,那麼terraform會建立一個記錄連結到rancher.example.com

  • cloudflare_email – 你Cloudflare中的Email

  • cloudflare_token – 你Cloudflare的API token

  • cloudflare_zone – 你的Cloudflare zone

你也可以根據你自己的需求修改其他變數。


部署Rancher Server


現在我們準備好了,用Terraform來進行部署吧!點選terraform apply你會看到像下面這樣的顯示:

5個資源?

“為什麼是5個資源?我們剛剛不是隻部署了1個伺服器嗎?”你可能會這麼問,其實我們確實部署了不止一個資源,我們部署了:

  • 1個伺服器(Rancher伺服器)

  • 1個為cloud-init程序引導Rancher伺服器的使用者資料

  • 1個安全組

  • 1條附加到安全組來控制流量的規則

  • 1條指向Rancher伺服器的Cloudflare DNS記錄

這樣便添加了5個資源,現在點選yes。如果一切進行順利,你應該能看到這樣的資訊:

如果檢查Scaleway的話:

看起來伺服器是部署好了,那DNS如何呢?

它看起來也新增到了Cloudflare!現在我們用這個地址訪問Rancher伺服器:

https://rancher.your.zone/


如果你使用的是Chrome的話應該會看到警告提示

這是因為你還沒有給伺服器設定合法的SSL證書。單擊左下角的按鈕,忽略警告並強制訪問頁面。

瞧!我們用1條命令部署了一個帶有DNS的Rancher伺服器!很酷吧!輸入你儲存在tfvars中設定的密碼,應該能登陸了。

現在你有了一個正在工作的Rancher伺服器!你可以在UI上開始為各個位置建立Kubernetes叢集,不過本文不會介紹這些用例。取而代之的,我們將在這裡使用Terraform,在Scaleway上建立Rancher代理,自動設定這些由Rancher伺服器管理的叢集。


為Rancher代理準備Terraform資源


返回kenfdev/rancher-scaleway倉庫。現在,前往rancheragent目錄。同樣複製一份terraform.tfvars.sampleterraform.tfvars

現在開啟terraform.tfvars:

和Rancher伺服器時一樣填入憑證資訊,這裡列出一些要記住的變數:

  • rancher_server_address – Rancher Serve的地址,它可能是一個IP或者域名,不過我建議你在之前的步驟中設定成域名

  • count_agent_all_nodes – 統計建立的擁有all roles(etcd, controlplane, worker)的節點數。如果你只是取體驗一下Kubernetes叢集,那麼有一個就足夠了。

  • count_agent_etcd_nodes – 統計建立的擁有etcd role的節點數

  • count_agent_controlplane – 統計建立的擁有controlplane role的節點數

  • count_agent_worker_nodes – 統計建立的擁有worker role的節點數


部署Rancher代理


現在再一次點選terraform apply,將rancher代理部署到Scaleway上。

選擇yes,伺服器就部署好了。幾分鐘後你可以看到資源部署完畢:

同時,在Rancher伺服器的UI下,你可以看到一個新的叢集註冊好了。

再過一會,你可以看到Kubernetes叢集部署完畢(Active)!

這也很酷對吧?我們可以在Internet(Scaleway)上建立自己的Kubernetes叢集,而這僅僅通過幾行命令!


測試Ingress控制器


現在我們可以使用Kubernetes叢集了,讓我們看看Nginx Ingress控制器是否按照預期工作。在rancheragent目錄中,開啟dns.tf 檔案並新增下面的資訊:

這將建立一個Cloudflare記錄來指向具有all roles的Rancher代理節點。點選terraform apply,在Cloudflare設定DNS。


現在我們訪問http://default.your.zone,我們還沒有在叢集上配置任何Ingress,因此需要訪問預設後端。

嘿!我們可以看到Ingress控制器正按我們期望的運作著。


通過kubectl訪問叢集


最後,我們來試試能不能通過kubectl訪問這個叢集。拉取kubeconfig十分容易。只要在叢集層找到按鈕即可:

把config檔案複製或者下載到model上:

kubectlKUBECONFIG獲取一些資訊

成功獲得了關於節點的資訊,pods又是如何呢?

只用了簡單的kubectl就能輕鬆獲得資訊,你也可以通過Rancher UI或者kubectl部署資源。


清   理


如果你想繼續使用叢集,你可以從這時起繼續使用,不過我下面要介紹的是如果你已經使用完畢,該如何把這一切清理掉。


破壞掉Rancher代理和Cloudflare資源


執行下面的命令:


銷燬Rancher伺服器和Cloudflare資源


確保Scaleway上沒有任何資源了(只有預設的安全組)。否則你還要為這些資源付費。


總  結


有好幾種方法可以利用這種工作流,而我更傾向於不直接使用Rancher Server,而是經常建立和銷燬Rancher Agent(以及Kubernetes叢集)。