K8S相關的概念 ---- Kubernetes

1. Pod

       每個容器都是獨立存在的,都有自己的IP地址、掛在卷等等。但是在進行K8S移植的時候就不太容易了,比如把沒有在容器中運行的環境遷移到K8S上就比較難以遷移。K8S中引入pod概念,定義一個pod,會先啓動第一個容器pause,只要運行pod,就會運行這個容器。如果這個pod有兩個容器,這兩個容器會公用pause容器的網絡棧、存儲卷。這兩個容器沒有自己獨立的ip地址,容器進程是不隔離。相互訪問的時候,不需要寫IP地址,加映射什麼的,直接使用localhost就可以相互訪問。這是因爲這兩個容器都共享pause容器的網絡棧。在同一個pod中容器之間的不能衝突,如果端口重複,可能會出現無限重啓或者起不來。

       如果pod掛在了一個存儲卷,pod中的兩個容器都想訪問存儲。這個pod會共享pause,容器也會共享存儲。所以,在同一個pod中即共享網絡,又共享存儲卷。

2. Pod控制器類型

① ReplicationController:簡稱rc,用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退出,會自動創建新的Pod 來替代。而如果異常多出來的容器也會自動回收。在新版本的Kubernetes 中建議使用ReplicaSet 來取代ReplicationControlle

② ReplicaSet:ReplicaSet 跟ReplicationController 沒有本質的不同,只是名字不一樣。但是ReplicaSet 支持集合式的selector,創建pod的時候會打標籤,刪除容器的時候可以使用當是某個容器的時候要做什麼操作。在大型項目中rs比rc更簡單有效有意義。

③ Deployment:雖然ReplicaSet 可以獨立使用,但一般還是建議 使用Deployment 來自動管理ReplicaSet ,這樣就無需擔心跟其他機制的不兼容問題(比如ReplicaSet 不支持 rolling-update 而 Deployment 支持,rolling-update就是滾動更新),Deployment要和ReplicaSet放在一起是因爲,Deployment不負責pod的創建。Deployment需要創建ReplicaSet來達到創建pod的能力。

3. HPA

       HPA即HorizontalPodAutoScale,HPA是基於RS定義。HPA設定的CPU的平均利用率大於某個值的時候就擴展,即新建pod。直到達到最大值,也就是當CPU的平均利用率已經達不到某個值,就不會進行pod的創建。如果CPU的平均利用率慢慢降低時,就開始回收pod,但是不能小於HPA定義的最小pod數。這也就實現了水平自動擴展的目的。HPA 僅適用於Deployment 和ReplicaSet ,在V1 版本中僅支持根據 Pod 的CPU 利用率擴所容,在v1alpha 版本中,支持根據內存和用戶自定義的metric 擴縮容

4. StatefulSet

StatefulSet是爲了 解決有狀態服務 的問題(對應Deployments 和ReplicaSets是爲無狀態服務而設計),其應用場景包括:

① 穩定的持久化存儲,即Pod 重新調度後還是能訪問到相同的持久化數據,基於PVC 來實現

② 穩定的網絡標誌,即Pod 重新調度後其PodName和HostName不變,基於Headless Service,即沒有Cluster IP 的Service來實現

③ 有序部署,有序擴展,即Pod 是有順序的,在部署或者擴展的時候要依據定義的順序依次依次進行(即從0 到N-1,在下一個Pod 運行之前所有之前的Pod 必須都是Running 和Ready 狀態),基於init containers 來實現

④ 有序收縮,有序刪除(即從N-1 到0)

Docker主要面對的時無狀態服務,沒有對應的存儲需要時時保留,如果拿出來再放進去依然正常工作。如apache服務、LVS負載均衡調度期。有狀態服務有mysql、mongodb等,都需要時時進行數據的更新以及存儲,抽離出集羣之後,再放回來就沒有辦法工作。

5. DaemonSet

DaemonSet 確保全部(或者一些)Node 上運行一個Pod 的副本。當有 Node 加入集羣時,也會爲他們新增一個Pod。當有 Node 從集羣移除時,這些Pod 也會被回收。刪除DaemonSet 將會刪除它創建的所有Pod。使用DaemonSet 的一些典型用法:

① 運行集羣存儲daemon,例如在每個Node 上運行glusterd、ceph

② 在每個Node 上運行日誌收集daemon,例如fluentd、logstash

③ 在每個Node 上運行監控daemon,例如Prometheus Node Exporter

6. Job 與 Cron Job

       Job 負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個 Pod 成功結束。如果想要備份數據庫,備份的代碼就可以放到 pob 中運行,再放到 job 中執行。直接在linux中運行備份代碼也是一樣的,但是 我們封裝這個 pob 是可以重複利用的。如果腳本意外退出是沒有辦法執行的,但是 Job如果判斷腳本不是正常退出就會重新執行,直到正常退出,並且可以設置正常退出的次數,多少次執行一次。

       Cron Job可以在特定時間重複執行, Cron Job管理基於時間的Job:在 給定時間點只運行一次週期性地在給定時間點運行

7. 服務發現

       客戶端想要訪問一組 pod 時,如果這些 Pod 是不相關的情況,就不可以使用service透明代理的。所以,Pod必須要有相關性。
在這裏插入圖片描述
       比如是這些 pob 是由同一個RS、RC、Deployment創建的,或者擁有同一組標籤都是可以的被service收集到。service收集 pod 是通過標籤的方式。service會有自己的ip和端口,客戶端就可以訪問service,間接訪問 pod。service訪問pod的時候採用Round Ribben算法。

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