天天看點

如何在CentOS上建立Kubernetes叢集

歡迎大家前往騰訊雲+社群,擷取更多騰訊海量技術實踐幹貨哦~

本文由程式設計男孩 發表于雲+社群專欄

介紹

Kubernetes(常簡稱為K8s)是用于自動部署、擴充和管理容器化(containerized)應用程式的開源系統。Google設計并捐贈給Linux基金會來使用的。它旨在提供“跨主機叢集的自動部署、擴充以及運作應用程式容器的平台”。它支援一系列容器工具, 包括Docker等。

Kubeadm是 Kubernetes 官方推出的部署工具 ,例如API伺服器,Controller Manager和Kube DNS,該工具實作類似Docker swarm 一樣的部署方式,透過初始化Master 節點來提供給Node快速加入。但是,它的缺點也很明顯,它不會建立使用者或處理作業系統級依賴關系及其配置的安裝。對于這些步驟,可以使用Ansible或SaltStack等配置管理工具。使用這些工具可以更輕松地更改其他叢集或重新建立現有叢集。

在本教程中,您将使用Ansible和Kubeadm從頭開始設定Kubernetes叢集,然後給它部署一個容器化的Nginx程式。

您的群集将包含以下實體資源:

一個主節點

主節點(Kubernetes中的節點指的是伺服器)負責管理叢集的狀态。我們将用它運作Etcd,該伺服器目的是将工作負載排程到工作節點的元件之間存儲叢集資料。

兩個工作節點

工作節點是運作工作負載(即容器化應用程式和服務)的伺服器。一旦工作節點配置設定了工作負載,工作節點将繼續運作您的工作負載,即使計劃在排程完成後停止工作也是如此。通過添加工作節點可以增加群集的容量。

完成本教程後,您将擁有一個可以運作容器化應用程式的叢集,前提是叢集中的伺服器具有足夠的CPU和RAM資源供應用程式使用。幾乎任何傳統的Unix應用程式(包括Web應用程式,資料庫,守護程式和指令行工具)都可以進行容器化,并在叢集上運作。群集本身将在每個節點上消耗大約300-500MB的記憶體和10%的CPU。

設定群集後,您将部署Web伺服器Nginx以確定它正确運作。

本地Linux / macOS /BSD計算機上的SSH密鑰對。如果您之前沒有使用過SSH密鑰,同時使用的是騰訊雲的伺服器的話,請參考建立 SSH 密鑰文檔。如果您使用的不是騰訊雲的伺服器,請自行搜尋,本文暫不涉及。本教程的本地計算機是Linux作業系統,請勿使用Windows進行試驗。

運作CentOS 7的三台伺服器,記憶體至少為1GB。沒有伺服器的同學可以在這裡購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後在購買伺服器。您應該能夠以SSH密鑰對的root使用者身份SSH到每個伺服器。請務必将您的公鑰添加到主節點上的centos使用者帳戶。如果您需要有關向特定使用者帳戶添加SSH密鑰的指導,請參閱密鑰綁定/解綁伺服器文檔。

Ansible需要安裝在您的本地計算機上。有關安裝說明,請按照Ansible官方安裝文檔。

了解如何從Docker鏡像啟動容器。如果需要複習,請參閱如何安裝使用Docker的“第5步 - 運作Docker容器” 。

在本節中,您将在本地計算機上建立一個用作工作區的目錄。您還将在本地配置Ansible,以便它可以與遠端伺服器上的指令進行通信。為此,您将建立一個<code>hosts</code>檔案包,其包含例如伺服器的IP位址和每個伺服器所屬的組等資訊。

在三台伺服器中,一台伺服器将作為主伺服器<code>master_ip</code>。另外兩台伺服器則是是工作節點,并擁有IP<code>worker_1_ip</code>和<code>worker_2_ip</code>。

在本地計算機的主目錄中建立一個名為<code>~/kube-cluster/hosts</code>的目錄并進入其中:

該目錄将是本教程的工作區,包含所有<code>Ansible</code>設定。它也将是您運作所有本地指令的目錄。

使用<code>vi</code>指令建立一個名為<code>~/kube-cluster/hosts</code>的檔案或用您最喜歡的文本編輯器:

按<code>i</code>将以下文本插入到檔案中,該檔案将指定有關群集邏輯結構的資訊:

完成後,按,ESC然後輸入<code>:wq</code>将更改寫入檔案并退出。

您可能還記得在Ansible中用于指定伺服器資訊的庫存檔案,例如IP位址,遠端使用者和伺服器分組,以作為執行指令的單個單元進行目标。<code>~/kube-cluster/hosts</code>将是您的庫存檔案,并且您已向其添加了兩個Ansible組(主伺服器和工作伺服器),用于指定叢集的邏輯結構。

在主伺服器組中,有一個名為“master”的伺服器,其中列出了主節點的IP(<code>master_ip</code>),并指定Ansible應以根使用者身份運作遠端指令。

同樣,在workers組中,有兩個工作伺服器(<code>worker_1_ip</code>和<code>worker_2_ip</code>),它們也需要指定<code>ansible_user</code>為root使用者。

在設定伺服器清單之後,讓我們繼續安裝作業系統級依賴關系并建立配置設定。

在本節中,您将使用CentOS的yum軟體包管理器安裝Kubernetes所需的軟體包。這些包是:

Docker - 容器運作時。這是運作容器的元件。Kubernetes正在積極開發對rkt等其他運作容器服務的支援。

<code>kubeadm</code> - CLI工具,以标準方式安裝和配置群集的各個元件。

<code>kubelet</code> - 在所有節點上運作并處理節點級操作的系統服務/程式。

<code>kubectl</code>- 通過其API伺服器向叢集發出指令的CLI工具。

建立工作空間中指定的檔案<code>vi ~/kube-cluster/kube-dependencies.yml</code>:

将下面的内容插到檔案内:

檔案中的的第一部分内容如下:

容器運作時,安裝Docker。

啟動Docker服務。

請禁用SELinux,因為Kubernetes尚未完全支援它。

設定網絡所需的一些與netfilter相關的<code>sysctl</code>值。這将允許Kubernetes設定iptables規則,以便在節點上接收橋接的IPv4和IPv6網絡流量。

将Kubernetes YUM存儲庫添加到遠端伺服器的存儲庫清單中。

安裝<code>kubelet</code>和<code>kubeadm</code>。

第二部分意思是在主節點上設定一下<code>kubectl</code>的任務。

完成後儲存并關閉檔案。

接下來,執行<code>playbook</code>:

完成後,您将看到類似于以下内容的輸出:

執行後,Docker,<code>kubeadm</code>和<code>kubelet</code>将安裝在所有遠端服務。<code>kubectl</code>不是必需元件,僅用于執行叢集指令。但是我們建議您還是安裝它,因為您将僅從主節點運作<code>kubectl</code>指令。

現在安裝了所有系統依賴項。讓我們設定主節點并初始化叢集。

在本節中,您将設定主節點。然而在建立配置之前,我們需要熟悉幾個概念,如Pods和Pod 網絡插件。

Kubernetes的基本排程單元稱為“pods”。它可以把更進階别的抽象内容增加到容器化元件。一個pod一般包含一個或多個容器,這樣可以保證它們一直位于主機上,并且可以共享資源。Kubernetes中的每個pod都被配置設定一個唯一的(在叢集内的)IP位址這樣就可以允許應用程式使用端口,而不會有沖突的風險。Pod可以定義一個卷,例如本地磁盤目錄或網絡磁盤,并将其暴露在pod中的一個容器之中。pod可以通過Kubernetes API手動管理,也可以委托給控制器來管理。

每個pod都有自己的IP位址,一個節點上的pod應該能夠使用pod的IP通路另一個節點上的pod。單個節點上的容器可以通過本地接口輕松進行通信。然而,pod之間的通信更複雜,并且需要單獨的網絡元件,該元件可以透明地将流量從一個節點上的pod傳送到另一個節點上的pod。此功能由pod網絡插件提供。對于這個群集,建議您将使用Flannel選項。

在本地計算機上建立一個命名為<code>master.yml</code>的Ansible playbook :

将以下内容添加到檔案中以初始化叢集并安裝Flannel:

這是上面内容的詳解:

第一個任務通過運作<code>kubeadm init</code>初始化叢集。傳遞<code>--pod-network-cidr=10.244.0.0/16</code>參數指定将從中配置設定pod IP的私有子網。Flannel預設使用上述子網,我們告訴<code>kubeadm</code>使用相同的子網。

第二個任務建立一個<code>.kube</code>目錄在<code>/home/centos</code>。此目錄将儲存配置資訊,例如連接配接到群集所需的管理密鑰檔案以及群集的API位址。

第三個任務将<code>/etc/kubernetes/admin.conf</code>生成的檔案複制<code>kubeadm init</code>到centos使用者的主目錄。這将允許您用<code>kubectl</code>通路新建立的群集。

最後一個任務運作<code>kubectl apply</code>安裝<code>Flannel</code>。<code>kubectl apply -f descriptor.[yml|json]</code>是告訴<code>kubectl</code>建立<code>descriptor.[yml|json]</code>檔案中描述的對象的文法。<code>kube-flannel.yml</code>檔案包含<code>Flannel</code>在群集中設定所需的對象的說明。

完成後儲存并關閉檔案。執行配置:

要檢查主節點的狀态,請使用以下指令通過SSH連接配接到該節點:

進入主節點後,執行:

您現在将看到以下輸出:

輸出表明<code>master</code>節點已完成所有初始化任務,并且處于<code>Ready</code>可以開始接受工作節點并執行發送到API伺服器的任務的狀态。您現在可以從本地計算機添加工作程式。

将工作程式添加到叢集涉及在每個叢集上執行單個指令。此指令包括必要的群集資訊,例如主伺服器API伺服器的IP位址和端口以及安全令牌。隻有傳入安全令牌的節點才能加入群集。

f反回您的工作區并建立一個名為workers.yml的配置:

将以下文本添加到檔案中:

以下是配置的作用:

第一個配置擷取join指令,以便在worker節點上運作。該指令将采用以下格式:<code>kubeadm join --token &lt;token&gt; &lt;master-ip&gt;:&lt;master-port&gt; --discovery-token-ca-cert-hash sha256:&lt;hash&gt;</code>一旦它獲得具有的令牌和哈希值的指令,該任務就将其設定為可用,以便下一個配置能夠通路該資訊。

第二個配置有一個任務,它在所有工作節點上運作join指令。完成此任務後,兩個工作節點将成為群集的一部分。

通過添加工作節點,您的群集現在已完全設定并正常運作,工作節點可以随時運作工作負載。讓我們驗證群集是否按預期工作。

叢集有時可能在安裝過程中失敗,因為節點已關閉或主伺服器與工作伺服器之間的網絡連接配接無法正常工作。讓我們驗證叢集并確定節點正常運作。

您需要從主節點檢查群集的目前狀态,以確定節點已準備就緒。如果從主節點斷開連接配接,則可以使用以下指令通過SSH将其重新連接配接到主節點:

然後執行以下指令以擷取叢集的狀态:

您将看到類似于以下内容的輸出:

如果所有的節點都具有<code>Ready</code>的<code>STATUS</code>(狀态),這意味着它們是叢集的一部分,并準備運作工作負載。

但是,如果幾個節點擁有<code>NotReady</code>的<code>STATUS</code>(狀态),它可能意味着工作節點還沒有完成自己的設定。等待大約五到十分鐘再重新運作<code>kubectl get node</code>并檢查新輸出。如果一些節點仍具有<code>NotReady</code>狀态,則需要驗證并重新運作前面步驟中的指令。

現在您的叢集已成功驗證,讓我們在叢集上部署一個示例Nginx應用程式。

您現在可以将任何容器化應用程式部署到您的群集。讓我們使用部署和服務部署Nginx,以了解如何将此應用程式部署到叢集。如果更改Docker鏡像名稱和任何相關标志(例如<code>ports</code>和<code>volumes</code>),您也可以使用以下指令用于其他容器化應用程式。

在主節點内,執行以下指令以建立名為nginx的部署:

部署是一種Kubernetes對象,可確定始終根據已定義的模闆運作指定數量的pod,即使pod在群集生命周期内崩潰也是如此。上面的部署将使用Docker鏡像庫的Nginx Docker Image建立一個包含一個容器的pod 。

接下來,運作以下指令以建立名為<code>nginx</code>将公開公共應用程式的服務。它将通過NodePort實作,該方案将通過在群集的每個節點上打開的任意端口通路pod:

服務是另一種類型的Kubernetes對象,它向内部和外部用戶端公開叢集内部服務。它們還能夠對多個pod進行負載均衡請求,并且是Kubernetes中不可或缺的元件,經常與其他元件互動。

運作以下指令:

這将輸出類似于以下内容的文本:

從上面輸出的第三行,您可以檢索運作Nginx的端口。Kubernetes将配置設定一個大于<code>30000</code>自動的随機端口,同時確定該端口尚未受到其他服務的限制。

要測試一切正常,請通路或通過本地計算機上的浏覽器。您将看到Nginx熟悉的歡迎頁面。<code>http://worker_1_ip:nginx_port</code>或者<code>http://worker_2_ip:nginx_port</code>。

如果要删除Nginx應用程式,請先nginx從主節點删除該服務:

運作以下指令以確定已删除該服務:

您将看到以下輸出:

然後删除部署:

運作以下指令以确認這是否有效:

在本教程中,您已使用Kubeadm和Ansible成功在CentOS 7上設定Kubernetes叢集以實作自動化。

如果您想知道要在叢集設定的情況下如何處理叢集,那麼下一步就是将自己的應用程式和服務部署到叢集上。這是一個連結清單,其中包含可以指導您完成此過程的更多資訊:

Dockerizing應用程式 - 列出了詳細說明如何使用Docker對應用程式進行容器化的示例。

Pod概述 - 較長的描述了Pod如何工作以及它們與其他Kubernetes對象的關系。Pods在Kubernetes中無處不在,是以了解它們将有助于您的工作。

部署概述 - 這提供了部署的概述。了解部署之類的控制器如何有效地工作,因為它們經常在無狀态應用程式中用于擴充和不健康應用程式的自動修複。

服務概述 - 這包括服務,Kubernetes叢集中另一個常用對象。了解服務類型及其選項對于運作無狀态和有狀态應用程式至關重要。

其他重要概念是Volumes,Ingresses和Secrets,所有這些在部署生産應用程式時都派上用場。Kubernetes提供了許多功能和特性。Kubernetes官方文檔是了解概念,查找特定于任務的教程以及查找各種對象的API參考的最佳位置。更多Linux教程請前往騰訊雲+社群學習更多知識。

參考文獻: 《How To Create a Kubernetes 1.10 Cluster Using Kubeadm on CentOS 7》 《隻要用 kubeadm 小朋友都能部署 Kubernetes》
如何使用Kubernetes? 安全報告 | 2018上半年網際網路惡意爬蟲分析:從全景視角看爬蟲與反爬蟲 安全報告 | SSH 暴力破解趨勢:從雲平台向物聯網裝置遷移 給你的CVM安裝一個面闆吧!

此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1177930?fromSource=waitui

歡迎大家前往騰訊雲+社群或關注雲加社群微信公衆号(QcloudCommunity),第一時間擷取更多海量技術實踐幹貨哦~

海量技術實踐經驗,盡在雲加社群!

https://cloud.tencent.com/developer

下一篇: 屏蔽home鍵

繼續閱讀