天天看點

使用 kubeadm 建立一個 kubernetes 叢集簡介使用總結

<code>kubeadm</code>是一個<code>kubernetes</code>官方提供的快速安裝和初始化擁有最佳實踐(best practice)的<code>kubernetes</code>叢集的工具,雖然目前還處于 beta 和 alpha 狀态,還不能用在生産環境,但是我們可以通過學習這種部署方法來體會一些官方推薦的kubernetes最佳實踐的設計和思想。

<code>kubeadm</code>的目标是提供一個最小可用的可以通過<code>Kubernetes一緻性測試</code>的叢集,是以并不會安裝任何除此之外的非必須的addon。

<code>kubeadm</code>預設情況下并不會安裝一個網絡解決方案,是以用<code>kubeadm</code>安裝完之後 需要自己來安裝一個網絡的插件。

<code>kubeadm</code>支援多種系統,這裡簡單介紹一下需要的系統要求:

Ubuntu16.04+ / Debian 9 / CentOS 7 / RHEL 7 / Fedora 25/26(best-effort) / HypriotOS v1.0.1+ / Other

2GB或者以上的RAM(否則将沒有足夠空間留給app)

2核以上CPU

叢集的機器之間必須能通過網絡互相通信

SWAP必須被關閉,否則<code>kubelet</code>會出錯!

具體的詳細資訊可以在官方網站上看到。

本篇内容基于aws的ap-northeast-1的ec2,<code>CentOS 7</code>的作業系統(ami-4dd5522b),執行個體類型t2.medium 2核4GB,3台機器,1 master,2 nodes,kubernetes 1.9 版本。為了友善起見,在安全組裡面打開了所有的端口和IP通路。

機器配置:

首先 ,我們關閉selinux:

使用 kubeadm 建立一個 kubernetes 叢集簡介使用總結

把SELINUX改成disabled,然後儲存退出。

在我用的ami中,swap是預設關閉的,是以不需要我手動關閉,大家需要确認 自己的環境中swap是否有關閉掉,否則會在之後的環節中出問題。

為了友善我們安裝,我們将sshd設定為keepalive:

接下來我們重新開機一下機器:

至此,準備階段結束。

首先,我們需要在所有機器上都安裝<code>docker</code>, <code>kubeadm</code>, <code>kubelet</code>和<code>kubectl</code>。

切記:<code>kubeadm</code>不會自動去安裝和管理 <code>kubelet</code>和<code>kubectl</code>,是以需要自己去確定安裝的版本和你想要安裝的<code>kubernetes</code>版本相同。

安裝<code>docker</code>:

在RHEL/CentOS 7 系統上可能會路由失敗,我們需要設定一下:

接下來我們需要安裝<code>kubeadm</code>, <code>kubelet</code>和<code>kubectl</code>了,我們需要先加一個repo:

然後安裝:

至此,在所有機器上安裝所需的軟體已經結束。

安裝完所有的依賴之後,我們就可以用<code>kubeadm</code>初始化master了。

最簡單的初始化方法是:

除此之外,<code>kubeadm</code>還支援多種方法來配置,具體可以檢視一下官方文檔。

我們在初始化的時候指定一下kubernetes版本,并設定一下pod-network-cidr(後面的flannel會用到):

在這個過程中<code>kubeadm</code>執行了一系列的操作,包括一些pre-check,生成ca證書,安裝etcd和其它控制元件等。

界面差不多如下:

使用 kubeadm 建立一個 kubernetes 叢集簡介使用總結

最下面的這行<code>kubeadm join</code>什麼的,就是用來讓别的node加入叢集的,可以看出非常友善。我們要儲存好這一行東西,這是我們之後讓node加入叢集的憑據,一會兒會用到。

這個時候,我們還不能通過<code>kubectl</code>來控制叢集,要讓<code>kubectl</code>可用,我們需要做:

接下來要注意,我們必須自己來安裝一個network addon。

network addon必須在任何app部署之前安裝好。同樣的,<code>kube-dns</code>也會在network addon安裝好之後才啟動。<code>kubeadm</code>隻支援CNI-based networks(不支援<code>kubenet</code>)。

比較常見的network addon有:<code>Calico</code>, <code>Canal</code>, <code>Flannel</code>, <code>Kube-router</code>, <code>Romana</code>, <code>Weave Net</code>等。這裡我們使用<code>Flannel</code>。

安裝完network之後,你可以通過<code>kubectl get pods --all-namespaces</code>來檢視<code>kube-dns</code>是否在running來判斷network是否安裝成功。

預設情況下,為了保證master的安全,master是不會被排程到app的。你可以取消這個限制通過輸入:

終于部署完了我們的master!

現在我們開始加入一些node到我們的叢集裡面吧!

ssh到我們的node節點上,執行剛才下面給出的那個 <code>kubeadm join</code>的指令(每個人不同):

輸出差不多如下圖:

使用 kubeadm 建立一個 kubernetes 叢集簡介使用總結

這時候,我們去master上輸入<code>kubectl get nodes</code>檢視一下:

成功!

我們可以看到,用<code>kubeadm</code>部署可以讓我們比手動部署友善得多,雖然比不上<code>kops</code>這樣的一鍵部署生産Kubernetes叢集的工具,但是<code>kubeadm</code>最初的設計也并非是傻瓜式使用。

<code>kubeadm</code>給了使用者很多的靈活性,讓使用者可以完全自定義地去配置自己的叢集。

不過目前(截止部落格釋出為止),<code>kubeadm</code>還隻是在測試,官方還不建議在生産環境中使用,不過預計會在2018年春季可以投入生産使用。

最後,我們總結一下<code>kubeadm</code>最核心的幾個概念:

官方認為的 最佳實踐(best-practice)

合理的安全(reasonably secure)

可擴充(extensible)

最小可用(minimum viable)