近年來(lái)騰訊、阿里巴巴、華為、網(wǎng)易、百度等大廠,中國(guó)信通院、各大技術(shù)大會(huì)和社區(qū)都在推廣的云原生究竟如何入門?本文是入門向,適合所有想要入門云原生的新人閱讀。另外,云原生社區(qū)還發(fā)布過(guò)一篇投資人視角下的云原生解讀,可以幫助您了解云原生。
為什么寫這篇文章看到這個(gè)標(biāo)題后,大家可能會(huì)問(wèn)“都已經(jīng) 2020 年了,Kubernetes 開(kāi)源有 6 年時(shí)間了,為什么還要寫一篇 Kubernetes 入門的文章?”我想說(shuō)的是,Kubernetes 還遠(yuǎn)遠(yuǎn)沒(méi)有達(dá)到我們想象的那么普及。眾多的開(kāi)發(fā)者,平時(shí)忙于各自的業(yè)務(wù)開(kāi)發(fā),學(xué)習(xí)新技術(shù)的時(shí)間有限;還有大量的學(xué)生群體,可能還僅僅停留在“知道有這門技術(shù)”的階段,遠(yuǎn)遠(yuǎn)沒(méi)有入門。這篇文章將助于各位有志于從事云原生領(lǐng)域工作或需要了解該領(lǐng)域背景的人群快速入門 Kubernetes 和云原生。 因?yàn)樵圃闹R(shí)體系過(guò)于龐雜,本文主要講解容器、Kubernetes 及服務(wù)網(wǎng)格的入門概念,關(guān)于云原生的更多細(xì)節(jié)將在后續(xù)文章中推出。另外大家也可以關(guān)注云原生社區(qū)推出的 云原生知識(shí)圖譜[1] 項(xiàng)目,進(jìn)一步了解云原生。 引言Kubernetes[2] 一詞來(lái)自希臘語(yǔ),意思是“飛行員”或“舵手”。這個(gè)名字很貼切,Kubernetes 可以幫助你在波濤洶涌的容器海洋中航行。 Kubernetes 是做什么的?什么是 Docker?什么是容器編排?Kubernetes 是如何工作和擴(kuò)展的?你可能還有很多其他的問(wèn)題,本文將一一為你解答。 這篇文章適合初學(xué)者,尤其是那些工作忙碌,沒(méi)有辦法抽出太多時(shí)間來(lái)了解 Kubernetes 和云原生的開(kāi)發(fā)者們,希望本文可以幫助你進(jìn)入 Kubernetes 的世界。 簡(jiǎn)而言之,Kubernetes 提供了一個(gè)平臺(tái)或工具來(lái)幫助你快速協(xié)調(diào)或擴(kuò)展容器化應(yīng)用,特別是在 Docker[3] 容器。讓我們深入了解一下這些概念。 容器和容器化那么什么是容器呢? 要討論容器化首先要談到虛擬機(jī) (VM),顧名思義,虛擬機(jī)就是可以遠(yuǎn)程連接的虛擬服務(wù)器,比如 AWS 的 EC2 或阿里云的 ECS。 接下來(lái),假如你要在虛擬機(jī)上運(yùn)行一個(gè)網(wǎng)絡(luò)應(yīng)用——包括一個(gè) MySQL 數(shù)據(jù)庫(kù)、一個(gè) Vue 前端和一些 Java 庫(kù),在 Ubuntu 操作系統(tǒng) (OS) 上運(yùn)行。你不用熟悉其中的每一個(gè)技術(shù)——你只要記住,一個(gè)應(yīng)用程序由各種組件、服務(wù)和庫(kù)組成,它們運(yùn)行在操作系統(tǒng)上。 現(xiàn)在,將應(yīng)用程序打包成一個(gè)虛擬機(jī)鏡像,這個(gè)鏡像中包括了 Ubuntu 操作系統(tǒng)。這使得虛擬機(jī)變得非常笨重——通常有幾個(gè) G 的大小。 虛擬機(jī)鏡像包含了整個(gè)操作系統(tǒng)及所有的庫(kù),對(duì)應(yīng)用程序來(lái)說(shuō),這個(gè)鏡像過(guò)于臃腫,其中大部分組件并沒(méi)有被應(yīng)用程序直接調(diào)用。如果你需要重新創(chuàng)建、備份或擴(kuò)展這個(gè)應(yīng)用程序,就需要復(fù)制整個(gè)環(huán)境(虛擬機(jī)鏡像),在新環(huán)境中啟動(dòng)應(yīng)用通常需要幾十秒甚至幾分鐘時(shí)間。如果你想單獨(dú)升級(jí)應(yīng)用中的某個(gè)組件,比如說(shuō) Vue 應(yīng)用,就需要重建整個(gè)虛擬機(jī)鏡像。另外,如果你的兩個(gè)應(yīng)用依賴同一個(gè)底層鏡像,升級(jí)底層鏡像會(huì)同時(shí)影響這兩個(gè)應(yīng)用,而有時(shí)候,你只需要升級(jí)其中一個(gè)應(yīng)用的依賴而已。這就是所謂的“依賴陷阱”。 解決這個(gè)問(wèn)題的辦法就是容器。容器是繼虛擬機(jī)之后更高層次的抽象,在這層抽象中,整個(gè)應(yīng)用程序的每個(gè)組件被單獨(dú)打包成一個(gè)個(gè)獨(dú)立的單元,這個(gè)單元就是所謂的容器。通過(guò)這種方式,可以將代碼和應(yīng)用服務(wù)從底層架構(gòu)中分離出來(lái),實(shí)現(xiàn)了完全的可移植性(在任何操作系統(tǒng)或環(huán)境上運(yùn)行應(yīng)用的能力)。所以在上面的例子中,Ubuntu 操作系統(tǒng)就是一個(gè)單元(容器)。MySQL 數(shù)據(jù)庫(kù)是另一個(gè)容器,Vue 環(huán)境和隨之而來(lái)的庫(kù)也是一個(gè)容器。 但是,MySQL 數(shù)據(jù)庫(kù)是如何自己“運(yùn)行”的?數(shù)據(jù)庫(kù)本身肯定也要在操作系統(tǒng)上運(yùn)行吧?沒(méi)錯(cuò)! 更高層次的容器,比如 MySQL 容器,實(shí)際上會(huì)包含必要的庫(kù)來(lái)與底層的操作系統(tǒng)容器通信和集成。所以你可以把容器看成是整個(gè)應(yīng)用堆棧中的一層,每層都依賴于下層的單元。而這就類似于船舶或港口中集裝箱的堆疊方式,每個(gè)容器的穩(wěn)定性都依賴于下面的容器的支持。所以應(yīng)用容器的核心是一個(gè)受控的執(zhí)行環(huán)境。它們?cè)试S你從頭開(kāi)始定義整個(gè)環(huán)境,從操作系統(tǒng)開(kāi)始,到你要使用的各個(gè)版本的庫(kù),再到你要添加的代碼版本。 與容器相關(guān)的一個(gè)重要概念是微服務(wù)。將應(yīng)用程序的各個(gè)組件拆分并打包成獨(dú)立的服務(wù),這樣每個(gè)組件都可以很容易地被替換、升級(jí)、調(diào)試。上面的例子中,我們會(huì)為 Vue 前端創(chuàng)建一個(gè)微服務(wù),為 MySQL 數(shù)據(jù)庫(kù)創(chuàng)建另一個(gè)微服務(wù),為 Java 中間件部分創(chuàng)建另一個(gè)微服務(wù),以此類推。很明顯,微服務(wù)與容器化是相輔相成的。 從 Docker 開(kāi)始現(xiàn)在你已經(jīng)對(duì)容器有一定了解了吧?Docker 是最常用的容器化工具,也是最流行的容器運(yùn)行時(shí)。 Docker 開(kāi)源于 2013 年。用于打包和創(chuàng)建容器,管理基于容器的應(yīng)用。所有 Linux 發(fā)行版、Windows 和 macOS 都支持 Docker。 還有其他的容器化工具,如 CoreOS rkt[4]、Mesos Containerizer[5] 和 LXC[6]。但是目前,絕大多數(shù)的容器化應(yīng)用都是在 Docker 上運(yùn)行的。 再到 Kubernetes首先,簡(jiǎn)單介紹一下歷史。Kubernetes 是 Google 基于其內(nèi)部容器調(diào)度平臺(tái) Borg 的經(jīng)驗(yàn)開(kāi)發(fā)的。2014 年開(kāi)源,并作為 CNCF(云原生計(jì)算基金會(huì))的核心發(fā)起項(xiàng)目。 那么 Kubernetes 又跟容器是什么關(guān)系呢?讓我們?cè)倩氐缴厦娴睦?。假設(shè)我們的應(yīng)用爆火,每天的注冊(cè)用戶越來(lái)越多。 現(xiàn)在,我們需要增加后端資源,使瀏覽我們網(wǎng)站的用戶在瀏覽頁(yè)面時(shí)加載時(shí)間不會(huì)過(guò)長(zhǎng)或者超時(shí)。最簡(jiǎn)單的方式就是增加容器的數(shù)量,然后使用負(fù)載均衡器將傳入的負(fù)載(以用戶請(qǐng)求的形式)分配給容器。 這樣做雖然行之有效,但也只能在用戶規(guī)模有限的情況下使用。當(dāng)用戶請(qǐng)求達(dá)到幾十萬(wàn)或幾百萬(wàn)時(shí),這種方法也是不可擴(kuò)展的。你需要管理幾十個(gè)也許是幾百個(gè)負(fù)載均衡器,這本身就是另一個(gè)令人頭疼的問(wèn)題。如果我們想對(duì)網(wǎng)站或應(yīng)用進(jìn)行任何升級(jí),也會(huì)遇到問(wèn)題,因?yàn)樨?fù)載均衡不會(huì)考慮到應(yīng)用升級(jí)的問(wèn)題。我們需要單獨(dú)配置每個(gè)負(fù)載均衡器,然后升級(jí)該均衡器所服務(wù)的容器。想象一下,當(dāng)你有 20 個(gè)負(fù)載均衡器和每周 5 或 6 個(gè)小的更新時(shí),你將不得不進(jìn)行大量的手工勞動(dòng)。 我們需要的是一種可以一次性將變更傳遞給所有受控容器的方法,同時(shí)也需要一種可以輕松地調(diào)度可用容器的方法,這個(gè)過(guò)程還必須要是自動(dòng)化的,這正是 Kubernetes 所做的事情。 接下來(lái),我們將探討 Kubernetes 究竟是如何工作的,它的各種組件和服務(wù),以及更多關(guān)于如何使用 Kubernetes 來(lái)編排、管理和監(jiān)控容器化環(huán)境。為了簡(jiǎn)單起見(jiàn),假設(shè)我們使用的是 Docker 容器,盡管如前所述,Kubernetes 除了支持 Docker 之外,還支持其他幾種容器平臺(tái)。 Kubernetes 架構(gòu)和組件首先,最重要的是你需要認(rèn)識(shí)到 Kubernetes 利用了“期望狀態(tài)”原則。就是說(shuō),你定義了組件的期望狀態(tài),而 Kubernetes 要將它們始終調(diào)整到這個(gè)狀態(tài)。 例如,你想讓你的 Web 服務(wù)器始終運(yùn)行在 4 個(gè)容器中,以達(dá)到負(fù)載均衡的目的,你的數(shù)據(jù)庫(kù)復(fù)制到 3 個(gè)不同的容器中,以達(dá)到冗余的目的。這就是你想要的狀態(tài)。如果這 7 個(gè)容器中的任何一個(gè)出現(xiàn)故障,Kubernetes 引擎會(huì)檢測(cè)到這一點(diǎn),并自動(dòng)創(chuàng)建出一個(gè)新的容器,以確保維持所需的狀態(tài)。 現(xiàn)在我們來(lái)定義一些 Kubernetes 的重要組件。 當(dāng)你第一次設(shè)置 Kubernetes 時(shí),你會(huì)創(chuàng)建一個(gè)集群。所有其他組件都是集群的一部分。你也可以創(chuàng)建多個(gè)虛擬集群,稱為命名空間 (namespace),它們是同一個(gè)物理集群的一部分。這與你可以在同一物理服務(wù)器上創(chuàng)建多個(gè)虛擬機(jī)的方式非常相似。如果你不需要,也沒(méi)有明確定義的命名空間,那么你的集群將在始終存在的默認(rèn)命名空間中創(chuàng)建。 Kubernetes 運(yùn)行在節(jié)點(diǎn) (node) 上,節(jié)點(diǎn)是集群中的單個(gè)機(jī)器。如果你有自己的硬件,節(jié)點(diǎn)可能對(duì)應(yīng)于物理機(jī)器,但更可能對(duì)應(yīng)于在云中運(yùn)行的虛擬機(jī)。節(jié)點(diǎn)是部署你的應(yīng)用或服務(wù)的地方,是 Kubernetes 工作的地方。有 2 種類型的節(jié)點(diǎn)——master 節(jié)點(diǎn)和 worker 節(jié)點(diǎn),所以說(shuō) Kubernetes 是主從結(jié)構(gòu)的。 主節(jié)點(diǎn)是一個(gè)控制其他所有節(jié)點(diǎn)的特殊節(jié)點(diǎn)。一方面,它和集群中的任何其他節(jié)點(diǎn)一樣,這意味著它只是另一臺(tái)機(jī)器或虛擬機(jī)。另一方面,它運(yùn)行著控制集群其他部分的軟件。它向集群中的所有其他節(jié)點(diǎn)發(fā)送消息,將工作分配給它們,工作節(jié)點(diǎn)向主節(jié)點(diǎn)上的 API Server 匯報(bào)。 Master 節(jié)點(diǎn)本身也包含一個(gè)名為 API Server 的組件。這個(gè) API 是節(jié)點(diǎn)與控制平面通信的唯一端點(diǎn)。API Server 至關(guān)重要,因?yàn)檫@是 worker 節(jié)點(diǎn)和 master 節(jié)點(diǎn)就 pod、deployment 和所有其他 Kubernetes API 對(duì)象的狀態(tài)進(jìn)行通信的點(diǎn)。 Woker 節(jié)點(diǎn)是 Kubernetes 中真正干活的節(jié)點(diǎn)。當(dāng)你在應(yīng)用中部署容器或 pod(稍后定義)時(shí),其實(shí)是在將它們部署到 worker 節(jié)點(diǎn)上運(yùn)行。Worker 節(jié)點(diǎn)托管和運(yùn)行一個(gè)或多個(gè)容器的資源。 Kubernetes 中的邏輯而非物理的工作單位稱為 pod。一個(gè) pod 類似于 Docker 中的容器。記得我們?cè)谇懊嬷v到,容器可以讓你創(chuàng)建獨(dú)立、隔離的工作單元,可以獨(dú)立運(yùn)行。但是要?jiǎng)?chuàng)建復(fù)雜的應(yīng)用程序,比如 Web 服務(wù)器,你經(jīng)常需要結(jié)合多個(gè)容器,然后在一個(gè) pod 中一起運(yùn)行和管理。這就是 pod 的設(shè)計(jì)目的——一個(gè) pod 允許你把多個(gè)容器,并指定它們?nèi)绾谓M合在一起來(lái)創(chuàng)建應(yīng)用程序。而這也進(jìn)一步明確了 Docker 和 Kubernetes 之間的關(guān)系——一個(gè) Kubernetes pod 通常包含一個(gè)或多個(gè) Docker 容器,所有的容器都作為一個(gè)單元來(lái)管理。 Kubernetes 中的 service 是一組邏輯上的 pod。把一個(gè) service 看成是一個(gè) pod 的邏輯分組,它提供了一個(gè)單一的 IP 地址和 DNS 名稱,你可以通過(guò)它訪問(wèn)服務(wù)內(nèi)的所有 pod。有了服務(wù),就可以非常容易地設(shè)置和管理負(fù)載均衡,當(dāng)你需要擴(kuò)展 Kubernetes pod 時(shí),這對(duì)你有很大的幫助,我們很快就會(huì)看到。 ReplicationController 或 ReplicaSet 是 Kubernetes 的另一個(gè)關(guān)鍵功能。它是負(fù)責(zé)實(shí)際管理 pod 生命周期的組件——當(dāng)收到指令時(shí)或 pod 離線或意外停止時(shí)啟動(dòng) pod,也會(huì)在收到指示時(shí)殺死 pod,也許是因?yàn)橛脩糌?fù)載減少。所以換句話說(shuō),ReplicationController 有助于實(shí)現(xiàn)我們所期望的指定運(yùn)行的 pod 數(shù)量的狀態(tài)。 什么是 Kubectl?kubectl 是一個(gè)命令行工具,用于與 Kubernetes 集群和其中的 pod 通信。使用它你可以查看集群的狀態(tài),列出集群中的所有 pod,進(jìn)入 pod 中執(zhí)行命令等。你還可以使用 YAML 文件定義資源對(duì)象,然后使用 kubectl 將其應(yīng)用到集群中。 Kubernetes 中的自動(dòng)擴(kuò)展請(qǐng)記住,我們使用 Kubernetes 而不是直接使用 Docker 的原因之一,是因?yàn)?Kubernetes 能夠自動(dòng)擴(kuò)展應(yīng)用實(shí)例的數(shù)量以滿足工作負(fù)載的需求。 自動(dòng)縮放是通過(guò)集群設(shè)置來(lái)實(shí)現(xiàn)的,當(dāng)服務(wù)需求增加時(shí),增加節(jié)點(diǎn)數(shù)量,當(dāng)需求減少時(shí),則減少節(jié)點(diǎn)數(shù)量。但也要記住,節(jié)點(diǎn)是 “物理” 結(jié)構(gòu)——我們把“物理”放在引號(hào)里,因?yàn)橐涀?,很多時(shí)候,它們實(shí)際上是虛擬機(jī)。 無(wú)論如何,節(jié)點(diǎn)是物理機(jī)器的事實(shí)意味著我們的云平臺(tái)必須允許 Kubernetes 引擎創(chuàng)建新機(jī)器。各種云提供商對(duì) Kubernetes 支持基本都滿足這一點(diǎn)。 我們?cè)倮^續(xù)說(shuō)一些概念,這次是和網(wǎng)絡(luò)有關(guān)的。 什么是 kubernetes Ingress 和 Egress?外部用戶或應(yīng)用程序與 Kubernetes pod 交互,就像 pod 是一個(gè)真正的服務(wù)器一樣。我們需要設(shè)置安全規(guī)則允許哪些流量可以進(jìn)入和離開(kāi)“服務(wù)器”,就像我們?yōu)橥泄軕?yīng)用程序的服務(wù)器定義安全規(guī)則一樣。 進(jìn)入 Kubernetes pod 的流量稱為 Ingress,而從 pod 到集群外的出站流量稱為 egress。我們創(chuàng)建入口策略和出口策略的目的是限制不需要的流量進(jìn)入和流出服務(wù)。而這些策略也是定義 pod 使用的端口來(lái)接受傳入和傳輸傳出數(shù)據(jù) / 流量的地方。 什么是 Ingress Controller?但是在定義入口和出口策略之前,你必須首先啟動(dòng)被稱為 Ingress Controller(入口控制器)的組件;這個(gè)在集群中默認(rèn)不啟動(dòng)。有不同類型的入口控制器,Kubernetes 項(xiàng)目默認(rèn)只支持 Google Cloud 和開(kāi)箱即用的 Nginx 入口控制器。通常云供應(yīng)商都會(huì)提供自己的入口控制器。 什么是 Replica 和 ReplicaSet?為了保證應(yīng)用程序的彈性,需要在不同節(jié)點(diǎn)上創(chuàng)建多個(gè) pod 的副本。這些被稱為 Replica。假設(shè)你所需的狀態(tài)策略是“讓名為 webserver-1 的 pod 始終維持在 3 個(gè)副本”,這意味著 ReplicationController 或 ReplicaSet 將監(jiān)控活動(dòng)副本的數(shù)量,如果其中有任何一個(gè) replica 因任何原因不可用(例如節(jié)點(diǎn)的故障),那么 Deployment Controller 將自動(dòng)創(chuàng)建一個(gè)新的系統(tǒng)(定義如下)。 所需狀態(tài)是在 deployment 中定義的。Master 節(jié)點(diǎn)的中有一個(gè)子系統(tǒng)叫做 Deployment Controller,負(fù)責(zé)實(shí)際執(zhí)行并使當(dāng)前狀態(tài)不斷趨向于所需狀態(tài)。 因此,舉例來(lái)說(shuō),如果你目前有 2 個(gè) pod 的副本,而你所希望的狀態(tài)應(yīng)該有 3 個(gè),那么 Replication Controller 或 ReplicaSet 會(huì)自動(dòng)檢測(cè)到這個(gè)要求,并指示 Deployment Controller 根據(jù)預(yù)定義的設(shè)置部署一個(gè)新的 pod。 什么是服務(wù)網(wǎng)格?服務(wù)網(wǎng)格 (Service Mesh)[7] 用于管理服務(wù)之間的網(wǎng)絡(luò)流量,是云原生的網(wǎng)絡(luò)基礎(chǔ)設(shè)施層,也是 Kubernetes 次世代的云原生應(yīng)用[8] 的重要組成部分。 服務(wù)網(wǎng)格利用容器之間的網(wǎng)絡(luò)設(shè)置來(lái)控制或改變應(yīng)用程序中不同組件之間的交互。下面,我們用一個(gè)例子來(lái)說(shuō)明。假設(shè)你想測(cè)試 Nginx 的新版本,檢查它是否與你的 Web 應(yīng)用兼容。你用新的 Nginx 版本創(chuàng)建了一個(gè)新的容器 (Container2),并從當(dāng)前容器 (Container1) 中復(fù)制了當(dāng)前的 Nginx webserver 配置。但你不想影響組成 web 應(yīng)用的其他微服務(wù)(假設(shè)每個(gè)容器對(duì)應(yīng)一個(gè)單獨(dú)的微服務(wù))——就是 MySQL 數(shù)據(jù)庫(kù)、Node.js 前端、負(fù)載均衡器等。 所以使用服務(wù)網(wǎng)格,你可以立即只把 webserver 微服務(wù)改成 Container2(新 Nginx 版本的那個(gè))進(jìn)行測(cè)試。如果確定它不能工作,比如因?yàn)樗鼘?dǎo)致網(wǎng)站出現(xiàn)一些兼容性問(wèn)題,那么你就調(diào)用服務(wù)網(wǎng)格來(lái)快速切換回原來(lái)的 Container1。而這一切都不需要對(duì)其他容器進(jìn)行任何配置變更——這些變更對(duì)其他容器是完全透明的。 如果沒(méi)有服務(wù)網(wǎng)格,對(duì)容器來(lái)說(shuō)這項(xiàng)工作將十分繁瑣,因?yàn)檫@涉及到逐一更改所有其他容器上的配置,將它們所包含的服務(wù)從 Container1 指向 Container2,然后在測(cè)試失敗后,將它們?nèi)扛幕貋?lái)。 在前面這部分 Kubernetes 指南中,我們介紹了一些與 Kubernetes 網(wǎng)絡(luò)相關(guān)的概念。Kubernetes 中的網(wǎng)絡(luò)可能很棘手,很難理解,如果你剛剛開(kāi)始,你可能需要一些實(shí)踐來(lái)理解這里。關(guān)于服務(wù)網(wǎng)格的更多內(nèi)容請(qǐng)參考 Istio Handbook——Istio 服務(wù)網(wǎng)格進(jìn)階實(shí)戰(zhàn)[9]。 在下一部分中,我們將展開(kāi)更多關(guān)于 Kubernetes 的話題:如何開(kāi)始學(xué)習(xí) Kubernetes,如何在本地安裝和測(cè)試 Kubernetes,以及 Kubernetes 的一些優(yōu)秀的監(jiān)控工具。 如何學(xué)習(xí) Kubernetes?自學(xué) Kubernetes 知識(shí)基本上有三種不同的途徑,我們?cè)谶@里只提供了一個(gè)指導(dǎo)大綱。 一、從零開(kāi)始學(xué)習(xí)和安裝 Kubernetes要想真正掌握 Kubernetes,最好的辦法莫過(guò)于自己從頭開(kāi)始安裝 Kubernetes。不過(guò)要注意的是,從零開(kāi)始安裝 Kubernetes 并不是一件容易的事情。安裝 Kubernetes 并不是簡(jiǎn)單的“下載文件 -> 點(diǎn)擊安裝”式的操作,Kubernetes 由多個(gè)組件組成,這些組件必須單獨(dú)安裝和配置。而在此之前,你也需要相當(dāng)?shù)募夹g(shù)儲(chǔ)備來(lái)做安裝前的準(zhǔn)備,比如熟悉 Linux 操作系統(tǒng)。如果你決定使用這種方式學(xué)習(xí)的話,推薦你閱讀 Kubernetes Handbook——Kubernetes 中文指南 / 云原生架構(gòu)實(shí)踐手冊(cè)[10]。此外,請(qǐng)記住,盡管 Kubernetes 作為一個(gè)開(kāi)源解決方案在技術(shù)上是免費(fèi)的,但它確實(shí)有一些隱藏的成本,只不過(guò)對(duì)初學(xué)者來(lái)說(shuō)可能并不明顯。 二、Kubernetes 自托管解決方案這些解決方案是一些工具和實(shí)用程序,大大簡(jiǎn)化了在本地計(jì)算機(jī)上安裝和配置小型 Kubernetes 集群的任務(wù)。它們是學(xué)習(xí) Kubernetes 的好方法,同時(shí)對(duì)于新手來(lái)說(shuō)也不會(huì)太難,又足夠小巧可以到安裝在個(gè)人電腦上。最流行的自托管 Kubernetes 工具和環(huán)境是 Minikube[11]、MicroK8s[12]、Docker Desktop[13] 和 Kind[14]。這些解決方案往往有一些限制,例如,Minikube 只允許創(chuàng)建一個(gè)節(jié)點(diǎn)。盡管有這些缺點(diǎn),但這些工具還是非常值得推薦,因?yàn)樗鼈儗⒁讓W(xué)性和成本效益結(jié)合起來(lái),對(duì)于剛開(kāi)始使用 Kubernetes 的初學(xué)者來(lái)說(shuō),是一個(gè)很好的選擇。 三、云托管的解決方案如今各大云供應(yīng)商都提供了定制化的 Kubernetes 解決方案來(lái)。你也可以通過(guò)線上教學(xué)平臺(tái)如 Katacoda[15] 上的免費(fèi)課程來(lái)學(xué)習(xí) Kubernetes,它們都是云托管的,你不需要自己安裝,只不過(guò)你需要云供應(yīng)商的集群需要付費(fèi)。 本地測(cè)試和調(diào)試 Kubernetes作為本地安裝 Kubernetes 的一部分,你很可能還需要一些測(cè)試和調(diào)試能力,以確保一切都在順利運(yùn)行,特別是定義入口和出口策略等棘手的任務(wù)。此外,還有 Kubernetes 附加組件的生態(tài)系統(tǒng),你可能想使用這些組件來(lái)擴(kuò)展 Kubernetes 集群的功能。添加所有這些都需要進(jìn)行更多的測(cè)試,以確保它們能與你的 Kubernetes 集群完美的集成。 用于在本地開(kāi)發(fā)和調(diào)試 Kubernetes 服務(wù)的工具有:Microsoft Bridge to Kubernetes[16] 和 telepresence[17]。這些工具可以讓你在本地運(yùn)行單個(gè)服務(wù),同時(shí)將該服務(wù)連接到遠(yuǎn)程 Kubernetes 集群。這樣你就可以讓自己的本地機(jī)器作為 Kubernetes 集群中的一部分來(lái)運(yùn)行——這對(duì)于在本地而不是在生產(chǎn)集群上開(kāi)發(fā)服務(wù)非常有用。 Kubernetes 項(xiàng)目也了解到了 Kubernetes 安裝對(duì)端到端 (E2E) 測(cè)試的需求。為此,項(xiàng)目核心團(tuán)隊(duì)一直在確保在最近的版本中更恰當(dāng)?shù)刂С?E2E 測(cè)試。這包括諸如允許測(cè)試重用和納入更多附加組件和驅(qū)動(dòng)程序的測(cè)試等。 Kubernetes 監(jiān)控工具Kubernetes 提供了應(yīng)用程序在集群的每個(gè)層次上的資源使用情況的詳細(xì)信息——容器、pod、服務(wù)。這些詳細(xì)信息使你能夠評(píng)估應(yīng)用程序的性能,確定哪些瓶頸可以解決以提高整體性能。 畢竟,監(jiān)控可以幫助你了解應(yīng)用和集群運(yùn)行情況的詳細(xì)信息,這對(duì)于學(xué)習(xí) Kubernetes 是十分有幫助的。 Kubernetes 包含兩個(gè)內(nèi)置度量收集工具用于監(jiān)控:資源管道和全度量管道[18]。資源管道是一個(gè)較低級(jí)和較有限的工具,主要集中在與各種控制器相關(guān)的指標(biāo)上。全指標(biāo)管道,顧名思義,從幾乎所有集群組件中獲取并顯示更豐富的指標(biāo)。 還有一些第三方工具可以安裝并集成到 Kubernetes 集群中。對(duì)于 Kubernetes 來(lái)說(shuō),最普遍使用的兩個(gè)工具是 Prometheus 和 Grafana。 Prometheus 監(jiān)控Prometheus 是一個(gè)功能豐富的開(kāi)源監(jiān)控和警報(bào)工具。Prometheus 包含一個(gè)內(nèi)部數(shù)據(jù)存儲(chǔ)用來(lái)收集指標(biāo),如生成的時(shí)間序列數(shù)據(jù)。Prometheus 還擁有眾多插件,允許它將數(shù)據(jù)暴露給各種外部解決方案,并從其他數(shù)據(jù)源導(dǎo)入數(shù)據(jù),包括所有主要公有云監(jiān)控解決方案。 Grafana 儀表盤Grafana 是一個(gè)優(yōu)秀的儀表盤、分析和數(shù)據(jù)可視化工具。它沒(méi)有 Prometheus 的全功能數(shù)據(jù)收集能力,但 Prometheus 又沒(méi)有 Grafana 的數(shù)據(jù)呈現(xiàn)界面。事實(shí)上,他們最好是結(jié)合在一起使用——Prometheus 負(fù)責(zé)數(shù)據(jù)收集和匯總,Grafana 負(fù)責(zé)數(shù)據(jù)展示。它們共同創(chuàng)造了一個(gè)強(qiáng)大的組合,涵蓋了數(shù)據(jù)收集、基本警報(bào)和可視化。 高級(jí)警報(bào)對(duì)于高級(jí)警報(bào),你可以添加 Nagios[19] 或 Prometheus Alertmanager[20] 等工具。這些警報(bào)工具通常有大量的集成。你可以為自定義值班團(tuán)隊(duì),然后定義你想要監(jiān)控的參數(shù),例如“當(dāng)任何 pod 不可用時(shí)”或“當(dāng)任何節(jié)點(diǎn)無(wú)法訪問(wèn)時(shí)”、“當(dāng)容量達(dá)到 90%”等,然后通過(guò)電子郵件、短信、手機(jī)應(yīng)用提醒、電話呼叫等方式向值班人員發(fā)送自定義通知。你還可以創(chuàng)建升級(jí)策略,比如,如果一個(gè)被定義為“危急”的警報(bào)在 10 分鐘內(nèi)沒(méi)有值班人員確認(rèn),那么就將警報(bào)升級(jí)(發(fā)送警報(bào))到該人員的經(jīng)理。 現(xiàn)在,你應(yīng)該已經(jīng)對(duì) Docker 和 Kubernetes 有了大體的認(rèn)識(shí)。了解了 Kubernetes 的作用,知道它是如何進(jìn)行容器化應(yīng)用部署和管理的。 調(diào)試和監(jiān)控技術(shù)不僅僅是運(yùn)維需要,你也可以把它當(dāng)作學(xué)習(xí)方式。有什么比邊做邊學(xué)更好呢? 請(qǐng)記住,如果你的應(yīng)用規(guī)模太小,而且預(yù)計(jì)用戶需求不會(huì)有太大變化或重大波動(dòng)(比如一個(gè)只在公司內(nèi)部使用的應(yīng)用),那么 Kubernetes 對(duì)你來(lái)說(shuō)可能沒(méi)有必要,這種情況下,直接使用 Docker 就足夠了。 對(duì)云原生應(yīng)用的架構(gòu)模式感興趣的話也可以閱讀我翻譯的《云原生模式》一書(shū)。 更多云原生領(lǐng)域的開(kāi)源項(xiàng)目眾多(見(jiàn) Awesome Cloud Native/云原生開(kāi)源項(xiàng)目大全[21]),其中有大量的優(yōu)秀項(xiàng)目可供我們學(xué)習(xí)。此外,Kubernetes 開(kāi)源已經(jīng)多年時(shí)間,網(wǎng)上有大量的學(xué)習(xí)資料,業(yè)界出版過(guò)很多 書(shū)籍[22],建議大家通過(guò)閱讀 官方文檔[23] 和實(shí)踐來(lái)學(xué)習(xí),也可以參考我編寫的 Kubernetes Handbook——Kubernetes 中文指南 / 云原生架構(gòu)實(shí)踐手冊(cè)[24]。 推薦大家加入我發(fā)起創(chuàng)辦的 云原生社區(qū)[25],這是一個(gè)立足中國(guó),放眼世界的云原生終端用戶社區(qū),致力于云原生技術(shù)的傳播和應(yīng)用。云原生社區(qū)主辦的 云原生學(xué)院[26] 定期邀請(qǐng)?jiān)圃烷_(kāi)源領(lǐng)域的大咖在 B 站上進(jìn)行直播分享,成員自發(fā)組織了多個(gè) SIG(特別興趣小組)進(jìn)行討論學(xué)習(xí)。歡迎加入我們,共同學(xué)習(xí)和交流云原生技術(shù)。如果你想從事服務(wù)網(wǎng)格領(lǐng)域,加入一家由開(kāi)源技術(shù)而構(gòu)建的全球化公司,歡迎大家關(guān)注我所在的服務(wù)網(wǎng)格公司 Tetrate,下面是我們公司的微信公眾號(hào),會(huì)經(jīng)常發(fā)布一些 Istio、Envoy、Apache SkyWalking 等開(kāi)源項(xiàng)目的博客。 活動(dòng)預(yù)告云原生學(xué)院直播間,第八期直播,今天晚上 8 點(diǎn),B 站直播間見(jiàn)! 在騰訊文檔中記錄你的問(wèn)題,講師在線解答:https://docs.qq.com/doc/DR2dKdWdWWlNzZEZo 云原生社區(qū) #云原生社區(qū) 上海meetup 講師招募中,活動(dòng)暫定11月底,主題可以包括#Kubernetes #ServiceMesh #DevOps #云原生 點(diǎn)擊下面的鏈接與我們聯(lián)系。? 視頻號(hào) 引用鏈接
|
|
來(lái)自: 長(zhǎng)沙7喜 > 《新技術(shù)》