kubernetes 無狀態服務和有狀態服務


無狀態服務

(1)、是指該服務運行的實例不會在本地存儲需要持久化的數據,並且多個實例對於同一個請求響應的結果是完全一致的。

(2)、多個實例可以共享相同的持久化數據。例如:nginx實例,tomcat實例等

(3)、相關的k8s資源有:ReplicaSet、ReplicationController、Deployment等,由於是無狀態服務,所以這些控制器創建的pod序號都是隨機值。並且在縮容的時候並不會明確縮容某一個pod,而是隨機的,因為所有實例得到的返回值都是一樣,所以縮容任何一個pod都可以。

有狀態服務

(1)、寵物和牛的類比,農場主的牛如果病了可以丟掉再重新買一頭,如果寵物主的寵物病死了是沒法找到一頭一模一樣的寵物的。

有狀態服務 可以說是 需要數據存儲功能的服務、或者指多線程類型的服務,隊列等。(mysql數據庫、kafka、zookeeper等)

(2)、每個實例都需要有自己獨立的持久化存儲,並且在k8s中是通過申明模板來進行定義。持久卷申明模板在創建pod之前創建,綁定到pod中,模板可以定義多個。

 volumeClaimTemplates:

  - metadata:

      name: zookeeper

    spec:

      selector:

        matchLabels:

          app: zookeeper

      accessModes: [ "ReadWriteOnce" ]

      resources:

        requests:

          storage: 3Gi

說明: 有狀態的 pod是用來運行有狀態應用的,所以其在數據卷上存儲的數據非常重要,在 Statefulset縮容時刪除這個聲明將是災難性的,特別是對於 Statefulset來說,縮容就像減少其 replicas 數值一樣簡單。基於這個原因,當你需要釋放特定的持久卷時,需要手動刪除對應的持久卷聲明。

(3)、相關的k8s資源為:statefulSet,由於是有狀態的服務,所以每個pod都有特定的名稱和網絡標識。比如pod名是由statefulSet名+有序的數字組成(0、1、2..)

(4)、在進行縮容操作的時候,可以明確知道會縮容哪一個pod,從數字最大的開始。並且Stat巳fulset 在有實例不健康的情況下是不允許做縮容操作的。

StatefulSet 縮容任何時候只會操作 一個 pod 實例,所以有狀態應用的縮容不會很迅速。舉例來說, 一個分布式存儲應用若同時下線多個節點 ,則可能導致其數據丟失 。 比如說一個數據項副本數設置為 2 的數據存儲應用, 若 同時有兩個節點下線,一份數據記錄就會丟失,如果它正好保存在這兩個節點上 。 若縮容是線性的 ,則分布式存儲應用就有時間把丟失的副本復制到其他節點 ,保證數據不會丟失。


免責聲明!

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



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