歡迎光臨
每天分享高質量文章

十分鐘瞭解Kubernetes

何為Kubernetes?

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

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

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

 原文地址:https://www.cnblogs.com/vikings-blog/p/11101159.html


.NET社區新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com 

已同步到看一看
赞(0)

分享創造快樂