何為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
朋友會在“發現-看一看”看到你“在看”的內容