十分鍾了解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,除了多學,多練,多填坑。好像真沒有其它好途徑。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM