1. 程式人生 > >十分鐘瞭解Kubernetes

十分鐘瞭解Kubernetes

何為Kubernetes?

最簡單的一句話來概括Kubernetes。 它就是一套成熟的商用服務編排解決方案。Kubernetes定位在Saas層,重點解決了微服務大規模部署時的服務編排問題。

Kubernetes元件介紹

瞭解Kubernetes都是從Pod開始的。 Pod是Kubernetes最小的排程單元,所以元件介紹就從Pod開始。Pod是一組容器的集合,這些容器共享IPC,Network和UTS,也就是這些容器相互之間可以共享程序資訊,網路資訊和主機資訊。這一組容器相互之間可以通過Localhost互訪。

Kubernetes其它元件都是圍繞著Pod來工作的。

Pod有時也稱為例項(或者服務例項)。 當我們說一個服務存在2個例項時,也就是說這個服務有兩個Pod。

在Kubernetes中可以單獨建立Pod,單獨管理Pod。 但這卻無法體現出服務編排的優勢,例如需要資源利用率動態伸縮,或者對外部提供網路訪問。 這時Kubernetes就又提供了一些管理Pod的元件。 這些元件適用於不同的場景,但本質都是在管理Pod。

以下先介紹DaemonSet、ReplicaSet、StatefulSet和Job這四個元件。

DaemonSet用來保證在叢集中每個計算節點中都執行指定的Pod。 這個元件通常用來執行監控類和資料採集類的Pod,像定時採集節點資源資訊,採集節點容器日誌等等。

ReplicaSet,有時簡稱RS。和它相對應的有RC(新版本中已經剔除了)。此元件用來維護Pod狀態,時刻讓叢集中Pod的狀態滿足使用者所期望的狀態。 例如使用者期望執行4組Pod,當叢集中Pod數量大於4或者小於4時,都會動態縮容或擴容來滿足4組Pod這樣的狀態。

StatefulSet,專為解決有狀態應用而推出的元件。 DaemonSet和ReplicaSet都是無狀態的,也就是Pod的啟停和網路資訊都是無序的。 而StatefulSet則會保證Pod的啟停順序和網路資訊與之前是保持一致的。

Job,顧名思義,是執行作業的元件。 使用Job元件會保證Pod至少執行成功一次。
新增這四個元件之後,上面的圖就變成了下面的樣子:

在上面四個元件裡面,ReplicaSet是使用最多的元件,90%的Pod的建立、銷燬都是通過RS來完成的。 但RS在使用上還是有點不方便,例如Pod p1現在要修改Container A的映象版本。 那麼就需要在建立一份新RS,然後通過新RS來建立新的Pod p2。 等p2建立完成之後,在返回來銷燬p1。 這個時候就會同時存在RS1和RS2,當變更很頻繁時,RS的管理就會變成瓶頸。 所以Kubernetes增加了Deployment來管理ReplicaSet, 請注意Deployment是直接管理ReplicaSet的,而ReplicaSet則直接管理Pod。 所以Deployment是間接管理Pod。

通過Deployment,使用者可以宣告最新的Pod狀態,例如新映象版本,新的環境變數,新的數量等等這些狀態資訊。 Deployment會通過動態建立和銷燬ReplicaSet來滿足使用者所期望的狀態,使用者不需要關心中間過程如何實現(宣告式API就是好)。

因此上面的圖就變成了下面的樣子:

和Deployment類似,Kubernetes也提供了CronJob來動態管理Job,其實就是定時作業。 因此就不多說了。在上圖中再新增一個CronJob。

說到現在,管理Pod基本就聊完了。 此時建立的Pod會有以下特點:

  • 每個Pod都是內網IP。
  • Pod銷燬/建立會產生新IP。

那麼如何訪問這些Pod呢? 訪問分兩類,叢集內訪問和叢集外訪問。 但無論是叢集內訪問還是叢集外訪問,Pod的變更都不應該對呼叫方產生干擾。 因此對於呼叫方來說Pod的IP必須要固定下來。 而Service就應運而生,用來解決這個問題。

Kubernetes可以為一組Pod建立一個單獨的Service,這個Service擁有固定的IP,並會將網路請求轉發到相對應的這組Pod上。通俗來說,Service就是4層LB。 好吧,上面的圖在新增點東西:

Service產生的基本都是內網IP(也可以產生其它網段IP,但不在極簡史討論範疇),並且是4層LB。如果要對叢集外開放網路請求,就需要使用Kubernetes提供的Ingress元件。

Ingress是7層LB,而使用最多的是Nginx Ingress。 這個時候再新增點東西:

從大面上說,幾個大元件都齊了。 下面再說Pod持久化和引數配置的問題。

Pod持久化就需要掛載Volume,通過將資料寫入指定Volume的方式來完成持久化。Kubernetes為Volume提供了多種實現方式,大體分為兩類:臨時掛載和永久掛載。第三次請注意:
臨時掛載指的是卷隨著Pod的生命週期而存在,當Pod被刪除時掛載的Volume也會隨之消失。而永久掛載則是真的永久儲存。

臨時掛載有EmptyDir和HostPath兩種方式。 永久掛載稱之為PresistentVolume(PV)。PV是與Pod完全無關的一種資源,當Pod有持久化需求時,就需要向PV申請所需要的資源,這種資源稱之為PersistentVolumeClaim(PVC)。

簡單理解,PV就是儲存池,PVC就是向儲存池中申請儲存資源。
在Pod中新增所申請的PVC,Pod產生的資料就可以寫入到儲存池中了。 上面的圖再增加點東西:

極簡史就剩下最後一部分了:配置檔案。
配置檔案指的是Kubernetes支援Pod建立時,將指定的配置檔案以檔案或者環境變數的形式新增到Pod中。在Kubernetes中這類配置檔案稱之為configmap。 既然是配置檔案,就免不了會涉及到口令,放入配置檔案就很不安全。 Kubernetes為這類需求單獨提供了secret,其實就是特殊的configmap。 為啥是特殊,其實就是將口令做了Base64編碼,連加密都不是。。
所以最後這張圖就變成了這樣:

到這裡,極簡史就算聊完了。 Kubernetes裡面的概念很多也很晦澀,作為入門沒法完全說清,有些地方就淺入淺出了。

實踐出真知,大力出奇跡。 要想掌握好K8s,除了多學,多練,多填坑。好像真沒有其它好途徑。

所以這篇文章就當拋磚引玉,權當業餘交流了