news banner

  • 容器化技術的流行

容器是近年來非常盛行的技術,相關代表產品有docker、rkt等。簡單而言,容器類似一個沙箱(Sandbox),每個沙箱執行一個應用(或者說是微服務Microservice),各個微服務可以用自己喜好的程式語言開發,不同的沙箱相互隔離,容器之間也可以建立溝通機制。對本機資源的要求遠遠低於虛擬機(Virtual Machine),更多細節請參考另一篇部落格文章”容器技術革命:Docker”

 

  • 認識Kubernetes

Kubernetes

Kubernetes是Google開源項目之中容器叢集架構管理系統,Google 於2015年釋出Kubernetes(簡稱K8S),Kubernetes可以說是同容器Docker一起發展起來的,它提供應用部署、輕量級、維護、擴展機制等功能,他建構在容器技術之上,例如下圖:

萬物之本,最底層是作業系統Linux,而Docker容器建構在作業系統上,Kubernetes又建構在Docker之上,也因此為這些Docker所起的容器提供管理的功能,就像這些獨立容器個體之中的導航!非常巧的是Kubernetes官方的logo就是船陀,其字本意是古希臘語陀手的意思,我想這大概是命名的由來。Kubernetes也利用Google在容器技術上的實戰經驗,同時吸收Docker社群的最佳實踐,已成為雲端服務的重要陀手!

利用Kubernetes可以方便的管理跨機器執行容器化的應用,主要的功能大概如下:

  1. 1.使用容器(例如:Docker)對應用程式包裝、實例化、隔離、運行。
  2. 2.以叢集的方式執行、管理本機或是跨機器之間的容器。
  3. 3.解決跨機器容器之間的通訊問題
  4. 4.Kubernetes的自我修復能力,使得容器叢集總是運行在用戶期望的狀態

註:與Kubernetes齊名的是Mesos,它是一個成熟的架構,提供了同kubernetes類似的容器叢集管理方案,另一方面它正積極同Kubernetes進行整合,兩者亦敵亦友的關係。

 

  • 為何需要Kubernetes?

在Kubernetes還未問世的時代,只有容器技術(例如:Docker),雖然每個容器中所執行的Microservice,彼此獨立不受其它互相干擾,只須透過容器技術提供的私有網路做溝通即可。但有沒有想過?如果在同一台主機,用戶使用的需求隨著時間也會越來越大,跑的服務、資料量等會越來越多,很快地就需要擴容。舉個比較容易理解的養魚理論,原本你只有六七條魚時,只要一個小魚缸就夠了,但是過了一段時間,新生了三四十條小魚,你現有的小魚缸已經不夠用了,傳統的作法,你會再去買一個大魚缸,把既有魚缸的水草、沙子、飾品、打氣機設備等,跟所有的魚,重新搬移到新的魚缸去,這是非常耗費功夫的。

現在換個方式思考,如果你新買的魚缸可以和既有的魚缸串起來,意即每個魚缸之間有個通道,魚就可以自動分散到不同的兩個魚缸,你也就省掉了搬移上面那系列設備的功夫了。

沒錯,Kubernetes就是為了多機的擴容而誕生的,提供良好的資源調度,換句話說,就是上面那些你養的魚,可以自由游到比較不擁擠的魚缸。

雖然Docker容器,現在也有提供Docker Swarm來提供多機的能力,但是功能上比起Kubernetes,可以說是小巫見大巫。

Kubernetes 2

註:Kubernetes雖然是多機架構,但是未嘗不可跑在單機架構,只是多機架構的能力才是Kubernetes真正的強項。

 

  • Kubernetes的分布式架構

Kubernetes 3

Kubernetes屬於分布式系統,其元件:

  1. 1.Master – 做為主節點,像是一個大管家,用於控制Kubernetes節點,所有任務分配都來自於此。
  2. 2.Node – 有的人稱minion,主節點底下真正在做事的機器,每一台node上面可以運行許多容器,K8S可操控高達1,000個nodes以上

上圖,每個藍色方塊就是一台主機,若是由master與node相互組成就是一個Kubernetes的叢集(Cluster),假設一個node掛掉,例如上圖Node 1突然硬體故障無法繼續提供服務,那麼整個Kubernetes新產生的服務,會被Master分配到Node 2~Node N上,而不會造成用戶使用服務的停擺。

那既有在Node 1的服務怎麼辦?Kubernetes會自己去計算,把Node 1負責的服務遷移到Node 2~Node N,並且根據適合的演算法挑選出負載最輕的node。

或許有人會問,那如果Master掛掉了,怎麼辦?Master就不能為分配工作給Node了!Kubernetes非常強大,既然node可以一個以上互相備援,比較大型生產環境的公司,master通常有一個以上,例如:Master1與Master2,不管是Master1或是Master壞掉其中一台,另外一台都可以互相備援,讓用戶的服務不停擺。

Kubernetes除了在多機發揮了它強大的功能,搭配分布式儲存系統(例如:Gluster、Ceph、StorageOS等),更可以幫用戶的資料做分布式的存儲,讓資料達到持久化與最佳化。

 

  • Kubernetes的最小顆粒 - Pod

相較於Docker裡,Docker container是最小的單位,但在Kubernetes世界中,Pod是最小的部署單位,一個Pod是由一個或是多個以上的容器所組成,並且有下面幾個特點:

  • l 共享同樣的私有IP位址
  • l 共享儲存空間(Volumes)
  • l Pod裡面所有容器與Pod本身同生共死

如下示意圖所表示,這個node啟動了兩個Pod,分別是Pod1與Pod2,每個Pod都是獨立個體,互相不干擾,而每個Pod中有三個Docker container,而每個Docker container在分別去運行用戶的服務

Kubernetes 4

 

  • 總結

以上是Kubernetes很基本的介紹,因為篇幅關係,只介紹核心元件之中Pod,其它核心元件Deployment、Service、Label、DaemonSet等,可以參考Kubernetes官方網站,有非常詳細的介紹。

 

參考資料:

https://kubernetes.io/docs/home/

作者:德鴻科技 研發部 Andrew