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