什麼是 Kubernetes – 基本原理

上一篇文章中我們講了什麼是 Docker Compose,介紹了為什麼我們需要這個工具還有它的實際應用。今天我們來介紹 Kubernetes!這是一個由 Google 在 2014 年開發出來的開源平台,也叫做 k8s。它的功能是用來自動化部屬、擴展、以及管理多個 Docker 容器的系統。還不知道什麼是容器 Container 的朋友可以先到這一章理解 Docker 以及 Container 的觀念後再回來看這章噢!

由於 Kubernetes 相對複雜很多,有很多觀念以及專有名詞需要解釋,所以我們會拆成上下兩篇。這一篇我們會先從這個工具要解決什麼問題,並介紹基本原理以及專有名詞等等。在下一篇,我們才會帶入一個小小的例子來看一下實際應用。

為什麼需要 k8s

有在看我們文章的朋友一定都知道每次我們在介紹新的工具的時候,我們一定都會先問一個重要的問題!那就是為什麼我們需要用這個工具?這個工具幫我們解決了什麼問題?這邊一樣,我們先來了解我們遇到了什麼問題!

之前我們提到 Docker Compose,這個工具在當我們需要啟動數十個甚至上百個容器的時候起到非常大的幫助。我們只需要寫出一份 .yaml 的文件,設置好參數,最後讓 Docker Compose 執行這份設置檔就好了!但是 Docker Compose 有一個限制,那就是他只能管理現在這個主機上面的 Docker。然而在實際應用中,一個龐大的網站或是應用程式常常都是需要幾百甚至上千台電腦一起運行的,而每一台電腦上想當然都會有自己的 Docker。那麼我們要如何讓這上千台的 Docker 合作無間呢?沒錯!這就是我們今天要介紹的 Kubernetes 的功能!

Kubernetes 是一個用來管理多個主機上的容器的工具平台。當然也可以做到所有 Docker Compose 可以做到的事,包括啟動容器,管理網路以及容器之間的訊息傳遞。甚至可以做到更多,包括自動監測各個容器的健康狀況,如果某一個容器突然因為某種原因死掉了(停止運作),那 Kubernetes 就會自動啟動一個備用容器替代那個容器。Kubernetes 也可以做到將工作量平均分配給各個容器,確保某幾個容器不會過量工作但其他容器卻無所事事。更迷人的是,這個過程是完全在背景執行的,使用者在設定完後便完全不會參與到其中,而這也是 Kubernetes 的強大之處!

基本運作原理

了解了 Kubernetes 解決了什麼問題後,我們就可以來聊聊他的運作原理啦!首先,我們要先來認識幾個重要的專有名詞:

  • 容器集 Pod
  • 節點 Node
  • 控制平台 Control Plane
  • 集群 Cluster

Pod

Pod 中文叫做容器集,顧名思義就是一個或多個容器的集合。在 Kubernetes 中,這也是我們可以部署的最小單位。這句話是什麼意思呢?就是我們沒辦法在 Kubernetes 中像 Docker 或是 Docker Compose 一樣直接部署一個 container。我們必須部署一個 Pod,然後再在其中創建一個 Container。

如果用工廠來比喻的話,Pod 就像是一個一個包裹,這個包裹裡可能有很多不一樣的東西,比如說化妝品、飲料、書等等。這些不同的東西就是一個一個 Container。所以一個 Pod 可以擁有一個或多個以上的 Containers!這些容器因為共享一個 Pod,因此需要常常需要共享資源比如說儲存空間。但也因為共享一個 Pod,在互相傳遞資料方面也會更為容易。

在實際應用中,每個 Pod 都有自己的 ip。同一個 Pod 通常也只會有一個目標,而在這個 Pod 裡面的 Containers 都是為了要完成這個目標才存在的。比如說這個 Pod 的目標是要做出一杯咖啡,那麼這個 Pod 裡面可能就會有要準備咖啡豆的容器、準備熱水的容器、提供電源的容器等等。

Node

Node 中文叫做節點。在現實生活中,一個 Node 基本上就代表著一台實體電腦或是虛擬機,而一個 Node 當中會有一個或多個 Pod。

我們可以將 Node 想像成在一個工廠裡工作的工人。在現實生活中,這個工人可能會有不同的工作,比如說清理機器、封裝包裹等等。在 Kubernetes 中,Node 也同樣可以做著不同的工作,可以想像這個工人有好幾隻手 XD,可以在清理機器的同時封裝包裹!還記得前面我們提到一個 Pod 通常都只會有一個目標嗎?在這個例子中,這個 Node 就有兩個 Pod,而這兩個 Pod 的功能分別就是清理機器還有封裝包裹。

Control Plane

Control Plane 中文叫做控制平台。這個控制平台控制著 Kubernetes 裡的一切。利用前面的工廠例子來說,控制平台就像是工廠裡的經理一樣。他控制哪些工人(Node)需要做哪些工作,並且確保這些工作被確實完成。當工作量有所改變時,他也會負責調整工人的數量。比如說當工廠被要求一小時內要生產 1000 杯咖啡時,他就可以將可能原本只有一個工人在工作調整為有十個工人在工作。

Cluster

Cluster 中文叫做集群。我們可以把它想像成在工廠裡的一個小組,這個小組包括著前面介紹的工人(Node)以及經理(Control Plane)。就像現實生活中一樣,一個小組的內部成員會彼此合作以完成共同目標。在 Kubernetes 中,Cluster 也負責調度和部署我們的應用程式,確保他運行的穩定性。

架構

理解了幾個重要的名詞後,我們可以簡單的畫出他們之間的關係來幫助我們更加理解 Kubernetes 的基本架構。這邊我們也做一個簡單的總結。

我們知道一個 Cluster 包括了 Control Plane 以及多個 Node,Node 其實在現實中就代表一台電腦。而每個 Node 裡面又可能涵括一個或多個 Pod。在每個 Pod 裡面,可能又有多個 Containers,這些 Containers 都在幫助所屬的 Pod 完成一個特定的任務。而每個 Node 也都在互相協作確保應用程式的運行。而這一切之所以可行,都是因為我們有一個大腦控制著這一切,也就是 Control Plane。

進階成員

前面介紹了一些專有名詞後,我們了解了 Kubernetes 的基本組成以及大致的運作原理。但這在現實應用中肯定是遠遠不夠的!這邊我們再介紹幾個常見的進階名詞。

  • Deployment 部署
  • Service 服務
  • Ingress 入口

Deployment

我們可以想像,Deployment 就是運行應用程式的藍圖或配方。就好像有一套指導 Kubernetes 如何創建和管理應用程式的多個 Pod 的說明書。想像一下你在烘烤餅乾,Deployment 就是的食譜。如果我們想製作更多的餅乾或替換一些已經被吃掉的,我們可以按照同樣的食譜來確保一致性和可靠性。在Kubernetes 中,Deployment 幫助我們輕鬆地擴展或縮減應用程序,並自動排解故障。

我們當然可以單獨的一個一個建立 Pod,但這種方式只適合臨時用來測試,因為要一個一個建立 Pod 並且維護多個 Pod 非常困難。如果是用於實際的生產環境,可能有幾千個 Pod 同時在運行,那麼我們肯定就需要 Deployment 幫忙建立、管理、維護、以及監控這些 Pod。

在下一章中,我們會來學習如何建立一個 Deployment,並看看有哪些可以調整的參數。

Service

在 Kubernetes 中,Service 就像應用程式的電話簿。就像我們可以在電話簿中找到一個人的名字並找到對應他們的電話號碼一樣,Service 幫助應用程式的其他部分找到並連接到運行應用程式的特定 Pod 。這就像有一個前台接待員,把來電轉接給應該接聽的人。Service 確保我們的應用程式可以被系統的其他部分訪問,同時可以均衡負載流向不同的 Pod,以確保應用程式一直都運行的正常。

在 Kubernetes 中,Service 被分為四類,其中兩種是比較常見的:

  • NodePort
  • LoadBalancer

NodePort 是將外部流量直接傳輸到我們的 Node 的最基本方法。 NodePort,顧名思義,打開一個特定的端口,任何發送到該端口的流量都會轉發到 Node,最後給到適當的 Pod。

LoadBalancer 則是透過外部的負載平衡器(Load Balancer)將應用程式暴露給公共網路。Kubernetes 會和我們的雲端基礎架構協作,幫我們創建負載平衡器並分配公共 IP 地址。來自公共網路的流量會定向到這個公共 IP 地址,然後透過負載平衡器將流量分發給與服務相關的 Pod。

是不是聽起來好像都是要用在傳輸資料呢?誒你說的沒錯!那這兩個差別在哪呢?簡單來說,NodePort 是一種簡單而且具有成本效益的選擇,比較適用在測試和開發的階段,不需要高階負載平衡的情況。而 LoadBalancer 通常來說則更適用於生產環境、高流量應用程式以及需要高階負載平衡和直接網際網路存取的情況。所以哪一種服務對你比較好就需要看看應用程式的複雜情況,可以用的資金等等來做評斷。有時候我們也可以看到兩種同時出現呢!

Ingress

Ingress 中文叫做入口。顧名思義這就像是我們的應用程式的前門。想像一下我們的應用程式就是我們的房子,而每個房子當然都需要一個人們可以進入的方式。Ingress 就像是門口的安全警衛,決定誰能進來,以及他們應該去哪裡。在 Kubernetes 中,Ingress 用於管理外部存取你的服務,將傳入的網路流量傳送給 Cluster 內的對應服務。這樣 Ingress 可以幫助我們有一個統一對外的街口,並且根據主機或是路徑名稱決定流量要轉發到哪個 Service 上。

如何開始

好啦瞭解了基本架構後,終於來到這步啦!那所以我們要怎麼搭建和使用 Kubernetes 呢?最粗暴的方法當然就是去租借服務器去從頭搭建環境,但這樣的步驟會非常繁瑣。另一種方法是使用現成並已經設定好的雲服務公司所提供的工具,比如說 Google 的 Google Kubernetes Engine (GKE)、 AWS 的 Elastic Kubernetes Service (EKS)、或是 Microsoft 的 Azure Kubernetes Service (AKS) 等等。這些工具所提供的都是已經搭建好的 Kubernetes 環境,還提供各種報表、儀表板、自動報錯系統等等完善的服務,因此需要用到 Kubernetes 的公司通常都會直接向這些雲服務公司購買這些工具。

那難道像我們這樣個人層面只想要學習以及簡單應用就沒有方法了嗎?那怎麼可能!一種完全免費的方法就是使用 minikube 在自己電腦上模擬一個 Kubernetes 的環境,透過這個工具,我們可以使用全部的 Kubernetes 功能,唯一差別只是這並不是一個真實的生產環境而已。

那所以我們該如何開始建置呢?概念是這樣的,當我們想要建置一個 Pod 到一個 Kubernetes 的 Cluster 中時,我們需要透過指令工具 kubectl 發送「建造 Pod」給 Control Plane。Control Plane 會檢查一下是否還擁有足夠的資源可以建立 Pod,如果情況允許才會建立。建立完成後,Control Plane 中有一個成員叫做 Scheduler,這個東西的功能是負責配送新建立的 Pod 到 Node 中,這個東西可以確保每個 Node 被分派到的工作量幾乎是一樣的!

雖然這看起來分了好多步驟,但等等我們會發現其實非常簡單!在下一章,我們會實際運行幾個簡單的例子,體會一下 Kubernetes 的運作!

attribution

Icon made by Good Ware from www.flaticon.com

Icon made by Freepik from www.flaticon.com

Icon made by Aficons-studio from www.flaticon.com

Icon made by VectorPortal from www.flaticon.com