從零開始入門 K8s| 阿里技術專家詳解 K8s 核心概念

  一、什麼是 Kubernetes

  Kubernetes,從官方網站上可以看到,它是一個工業級的容器編排平臺。Kubernetes 這個單詞是希臘語,它的中文翻譯是“舵手”或者“飛行員”。在一些常見的資料中也會看到“ks”這個詞,也就是“K8s”,它是通過將 8 個字母“ubernete ”替換爲“8”而導致的一個縮寫。

  Kubernetes 爲什麼要用“舵手”來命名呢?大家可以看一下這張圖:

  

file


  這是一艘載着一堆集裝箱的輪船,輪船在大海上運着集裝箱奔波,把集裝箱送到它們該去的地方。我們之前其實介紹過一個概念叫做 container,container 這個英文單詞也有另外的一個意思就是“集裝箱”。Kubernetes 也就藉着這個寓意,希望成爲運送集裝箱的一個輪船,來幫助我們管理這些集裝箱,也就是管理這些容器。

  這個就是爲什麼會選用 Kubernetes 這個詞來代表這個項目的原因。更具體一點地來說:Kubernetes 是一個自動化的容器編排平臺,它負責應用的部署、應用的彈性以及應用的管理,這些都是基於容器的。

  二、Kubernetes 有如下幾個核心的功能:

  服務的發現與負載的均衡;

  容器的自動裝箱,我們也會把它叫做 scheduling,就是“調度”,把一個容器放到一個集羣的某一個機器上,Kubernetes 會幫助我們去做存儲的編排,讓存儲的聲明週期與容器的生命週期能有一個連接;

  Kubernetes 會幫助我們去做自動化的容器的恢復。在一個集羣中,經常會出現宿主機的問題或者說是 OS 的問題,導致容器本身的不可用,Kubernetes 會自動地對這些不可用的容器進行恢復;

  Kubernetes 會幫助我們去做應用的自動發佈與應用的回滾,以及與應用相關的配置密文的管理;

  對於 job 類型任務,Kubernetes 可以去做批量的執行;

  爲了讓這個集羣、這個應用更富有彈性,Kubernetes 也支持水平的伸縮。

  下面,我們希望以三個例子跟大家更切實地介紹一下 Kubernetes 的能力。

  1、調度

  Kubernetes 可以把用戶提交的容器放到 Kubernetes 管理的集羣的某一臺節點上去。Kubernetes 的調度器是執行這項能力的組件,它會觀察正在被調度的這個容器的大小、規格。

  比如說它所需要的 CPU以及它所需要的 memory,然後在集羣中找一臺相對比較空閒的機器來進行一次 placement,也就是一次放置的操作。在這個例子中,它可能會把紅顏色的這個容器放置到第二個空閒的機器上,來完成一次調度的工作。

  

file


  2、自動修復

  Kubernetes 有一個節點健康檢查的功能,它會監測這個集羣中所有的宿主機,當宿主機本身出現故障,或者軟件出現故障的時候,這個節點健康檢查會自動對它進行發現。

  下面 Kubernetes 會把運行在這些失敗節點上的容器進行自動遷移,遷移到一個正在健康運行的宿主機上,來完成集羣內容器的一個自動恢復。

  

file


  

file


  3、水平伸縮

  Kubernetes 有業務負載檢查的能力,它會監測業務上所承擔的負載,如果這個業務本身的 CPU 利用率過高,或者響應時間過長,它可以對這個業務進行一次擴容。

  比如說在下面的例子中,黃顏色的過度忙碌,Kubernetes 就可以把黃顏色負載從一份變爲三份。接下來,它就可以通過負載均衡把原來打到第一個黃顏色上的負載平均分到三個黃顏色的負載上去,以此來提高響應的時間。

  

file


  

file


  以上就是 Kubernetes 三個核心能力的簡單介紹。

  三、Kubernetes 的架構

  Kubernetes 架構是一個比較典型的二層架構和 server-client 架構。Master 作爲中央的管控節點,會去與 Node 進行一個連接。

  所有 UI 的、clients、這些 user 側的組件,只會和 Master 進行連接,把希望的狀態或者想執行的命令下發給 Master,Master 會把這些命令或者狀態下發給相應的節點,進行最終的執行。

  

file


  Kubernetes 的 Master 包含四個主要的組件:API Server、Controller、Scheduler 以及 etcd。如下圖所示:

  

file


  API Server:顧名思義是用來處理 API 操作的,Kubernetes 中所有的組件都會和 API Server 進行連接,組件與組件之間一般不進行獨立的連接,都依賴於 API Server 進行消息的傳送;

  Controller:是控制器,它用來完成對集羣狀態的一些管理。比如剛剛我們提到的兩個例子之中,第一個自動對容器進行修復、第二個自動進行水平擴張,都是由 Kubernetes 中的 Controller 來進行完成的;

  Scheduler:是調度器,“調度器”顧名思義就是完成調度的操作,就是我們剛纔介紹的第一個例子中,把一個用戶提交的 Container,依據它對 CPU、對 memory 請求大小,找一臺合適的節點,進行放置;

  etcd:是一個分佈式的一個存儲系統,API Server 中所需要的這些原信息都被放置在 etcd 中,etcd 本身是一個高可用系統,通過 etcd 保證整個 Kubernetes 的 Master 組件的高可用性。

  我們剛剛提到的 API Server,它本身在部署結構上是一個可以水平擴展的一個部署組件;Controller 是一個可以進行熱備的一個部署組件,它只有一個 active,它的調度器也是相應的,雖然只有一個 active,但是可以進行熱備。

  Kubernetes 的架構:Node

  Kubernetes 的 Node 是真正運行業務負載的,每個業務負載會以 Pod 的形式運行。等一下我會介紹一下 Pod 的概念。一個 Pod 中運行的一個或者多個容器,真正去運行這些 Pod 的組件的是叫做 kubelet,也就是 Node 上最爲關鍵的組件,它通過 API Server 接收到所需要 Pod 運行的狀態,然後提交到我們下面畫的這個 Container Runtime 組件中。

  

file


  在 OS 上去創建容器所需要運行的環境,最終把容器或者 Pod 運行起來,也需要對存儲跟網絡進行管理。Kubernetes 並不會直接進行網絡存儲的操作,他們會靠 Storage Plugin 或者是網絡的 Plugin 來進行操作。用戶自己或者雲廠商都會去寫相應的 Storage Plugin 或者 Network Plugin,去完成存儲操作或網絡操作。

  在 Kubernetes 自己的環境中,也會有 Kubernetes 的 Network,它是爲了提供 Service network 來進行搭網組網的。(等一下我們也會去介紹“service”這個概念。)真正完成 service 組網的組件的是 Kube-proxy,它是利用了 iptable 的能力來進行組建 Kubernetes 的 Network,就是 cluster network,以上就是 Node 上面的四個組件。

  Kubernetes 的 Node 並不會直接和 user 進行 interaction,它的 interaction 只會通過 Master。而 User 是通過 Master 向節點下發這些信息的。Kubernetes 每個 Node 上,都會運行我們剛纔提到的這幾個組件。

  下面我們以一個例子再去看一下 Kubernetes 架構中的這些組件,是如何互相進行 interaction 的。

  

file


  用戶可以通過 UI 或者 CLI 提交一個 Pod 給 Kubernetes 進行部署,這個 Pod 請求首先會通過 CLI 或者 UI 提交給 Kubernetes API Server,下一步 API Server 會把這個信息寫入到它的存儲系統 etcd,之後 Scheduler 會通過 API Server 的 watch 或者叫做 notification 機制得到這個信息:有一個 Pod 需要被調度。

  這個時候 Scheduler 會根據它的內存狀態進行一次調度決策,在完成這次調度之後,它會向 API Server report 說:“OK!這個 Pod 需要被調度到某一個節點上。”

  這個時候 API Server 接收到這次操作之後,會把這次的結果再次寫到 etcd 中,然後 API Server 會通知相應的節點進行這次 Pod 真正的執行啓動。相應節點的 kubelet 會得到這個通知,kubelet 就會去調 Container runtime 來真正去啓動配置這個容器和這個容器的運行環境,去調度 Storage Plugin 來去配置存儲,network Plugin 去配置網絡。

  這個例子我們可以看到:這些組件之間是如何相互溝通相互通信,協調來完成一次Pod的調度執行操作的。

  四、Kubernetes 的核心概念與它的 API

  核心概念

  第一個概念:Pod

  Pod 是 Kubernetes 的一個最小調度以及資源單元。用戶可以通過 Kubernetes 的 Pod API 生產一個 Pod,讓 Kubernetes 對這個 Pod 進行調度,也就是把它放在某一個 Kubernetes 管理的節點上運行起來。一個 Pod 簡單來說是對一組容器的抽象,它裏面會包含一個或多個容器。

  比如像下面的這幅圖裏面,它包含了兩個容器,每個容器可以指定它所需要資源大小。比如說,一個核一個 G,或者說 0.5 個核,0.5 個 G。

  當然在這個 Pod 中也可以包含一些其他所需要的資源:比如說我們所看到的 Volume 卷這個存儲資源;比如說我們需要 100 個 GB 的存儲或者 20GB 的另外一個存儲。

  

file


  在 Pod 裏面,我們也可以去定義容器所需要運行的方式。比如說運行容器的 Command,以及運行容器的環境變量等等。Pod 這個抽象也給這些容器提供了一個共享的運行環境,它們會共享同一個網絡環境,這些容器可以用 localhost 來進行直接的連接。而 Pod 與 Pod 之間,是互相有 isolation 隔離的。

  第二個概念:Volume

  Volume 就是卷的概念,它是用來管理 Kubernetes 存儲的,是用來聲明在 Pod 中的容器可以訪問文件目錄的,一個卷可以被掛載在 Pod 中一個或者多個容器的指定路徑下面。

  而 Volume 本身是一個抽象的概念,一個 Volume 可以去支持多種的後端的存儲。比如說 Kubernetes 的 Volume 就支持了很多存儲插件,它可以支持本地的存儲,可以支持分佈式的存儲,比如說像 ceph,GlusterFS ;它也可以支持雲存儲,比如說阿里雲上的雲盤、AWS 上的雲盤、Google 上的雲盤等等。

  

file


  第三個概念:Deployment

  Deployment 是在 Pod 這個抽象上更爲上層的一個抽象,它可以定義一組 Pod 的副本數目、以及這個 Pod 的版本。一般大家用 Deployment 這個抽象來做應用的真正的管理,而 Pod 是組成 Deployment 最小的單元。鄭州婦科醫院哪家好:http://www.zztjfk.com/

  Kubernetes 是通過 Controller,也就是我們剛纔提到的控制器去維護 Deployment 中 Pod 的數目,它也會去幫助 Deployment 自動恢復失敗的 Pod。

  比如說我可以定義一個 Deployment,這個 Deployment 裏面需要兩個 Pod,當一個 Pod 失敗的時候,控制器就會監測到,它重新把 Deployment 中的 Pod 數目從一個恢復到兩個,通過再去新生成一個 Pod。通過控制器,我們也會幫助完成發佈的策略。比如說進行滾動升級,進行重新生成的升級,或者進行版本的回滾。

  

file


  第四個概念:Service

  Service 提供了一個或者多個 Pod 實例的穩定訪問地址。

  比如在上面的例子中,我們看到:一個 Deployment 可能有兩個甚至更多個完全相同的 Pod。對於一個外部的用戶來講,訪問哪個 Pod 其實都是一樣的,所以它希望做一次負載均衡,在做負載均衡的同時,我只想訪問某一個固定的 VIP,也就是 Virtual IP 地址,而不希望得知每一個具體的 Pod 的 IP 地址。

  我們剛纔提到,這個 pod 本身可能 terminal go(終止),如果一個 Pod 失敗了,可能會換成另外一個新的。

  對一個外部用戶來講,提供了多個具體的 Pod 地址,這個用戶要不停地去更新 Pod 地址,當這個 Pod 再失敗重啓之後,我們希望有一個抽象,把所有 Pod 的訪問能力抽象成一個第三方的一個 IP 地址,實現這個的 Kubernetes 的抽象就叫 Service。

  實現 Service 有多種方式,Kubernetes 支持 Cluster IP,上面我們講過的 kuber-proxy 的組網,它也支持 nodePort、 LoadBalancer 等其他的一些訪問的能力。

  

file


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章