1. 程式人生 > >StatefulSet: Kubernetes 中對有狀態應用的執行和伸縮

StatefulSet: Kubernetes 中對有狀態應用的執行和伸縮

http://blog.fleeto.us/translation/statefulset-run-and-scale-stateful-applications-easily-kubernetes?utm_source=tuicool&utm_medium=referral

在最新發布的 Kubernetes 1.5 我們將過去的 PetSet 功能升級到了 Beta 版本,並重新命名為 StatefulSet。除了依照社群民意改了名字之外,這一 API 物件並沒有太大變化,不過我們在向集合裡部署 Pod 的過程中加入了“每索引最多一個”的語義。有了順序部署、順序終結、唯一網路名稱以及持久穩定的儲存,我們認為,對於大量的有狀態容器化負載,我們已經具備了一定的支援能力。我們並不是宣稱這一功能已經完全完成,但是我們相信他已經處於一個可用狀態,並且我們會在推動其正式釋出的過程中保持其相容性。

StatefulSet 的採用時機

在 Kubernetes 中,

Deployment 和 ReplicaSets 都是執行無狀態應用的有效手段。但這兩種方式對於有狀態應用來說就不太合適了。StatefulSet 的目的就是給為數眾多的有狀態負載提供正確的控制器支援。然而需要注意的是,不一定所有的有儲存應用都是適合移植到 Kubernetes 上的,在移植儲存層和編排框架之前,需要回答以下幾個問題。

應用是否可以使用遠端儲存?

目前,我們推薦用遠端儲存來使用 StatefulSets,就要對因為網路造成的儲存效能損失有一個準備:即使是專門優化的例項,也無法同本地載入的 SSD 相提並論。你的雲中的網路儲存,能夠滿足 SLA 要求麼?如果答案是肯定的,那麼利用 StatefulSet 執行這些應用,就能夠獲得自動化的優勢。如果應用所在的 Node 發生故障,包含應用的 Pod 會排程到其他 Node 上,在這之後會重新載入他的網路儲存以及其中的資料。

這些應用是否有伸縮需求?

用 StatefulSet 執行應用會帶來什麼好處呢?你的整個組織是否只需要一個應用例項?對該應用的伸縮是否會引起問題?如果你只需要較少的應用例項數量,這些例項能夠滿足組織現有的需要,而且可以預見的是,應用的負載不會很快增長,那麼你的本地應用可能無需移植。

然而,如果你的系統是微服務所構成的生態系統,就會比較頻繁的交付新服務,如果更近一步,服務是有狀態的,那麼 Kubernetes 的自動化和健壯性特性會對你的系統有很大幫助。如果你已經在使用 Kubernetes 來管理你的無狀態服務,你可能會想要在同一個體系中管理你的有狀態應用。

預期效能增長的重要性?

Kubernetes 還不支援網路或儲存在 Pod 之間的隔離。如果你的應用不巧和嘈雜的鄰居共享同一個節點,會導致你的 QPS 下降。解決方式是把 Pod 排程為該 Node 的唯一租戶(獨佔伺服器),或者使用互斥規則來隔離會爭用網路和磁碟的 Pod,但是這就意味著使用者必須鑑別和處置(競爭)熱點。

如果榨乾有狀態應用的最大 QPS 不是你的首要目標,而且你願意也有能力處理競爭問題,似的有狀態應用能夠達到 SLA 需要,又如果對服務的移植、伸縮和重新排程是你的主要需求,Kubernetes 和 StatefulSet 可能就是解決問題的好方案了。

你的應用是否需要特定的硬體或者例項型別

如果你的有狀態應用在高階硬體或高規格例項上執行,而其他應用在通用硬體或者低規格例項上執行,你可能不想部署一個異構的叢集。如果可以把所有應用都部署到統一例項規格的例項上,那麼你就能夠從 Kubernetes 獲得動態資源排程和健壯性的好處。

實踐環節 - ZooKeeper

有兩個原因讓 [ZooKeeper] 成為 StatefulSet 的好例子。首先,StatefulSet 在其中演示了執行分散式、強一致性儲存的應用的能力;其次,ZooKeeper 也是 Apache Hadoop 和 Apache Kafka 在 Kubernetes 上執行的前置條件。在 Kubernetes 文件中有一個 深度教程 說明了在 Kubernetes 叢集上部署 ZooKeeper Ensemble 的過程,這裡會簡要描述一下其中的關鍵特性。

建立 ZooKeeper 的 Ensemble

建立 Ensemble 很容易,只要用 kubectl create 來根據定義來建立物件就可以了。

$ kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes.github.io/master/docs/tutorials/stateful-application/zookeeper.yaml
service "zk-headless" created
configmap "zk-config" created
poddisruptionbudget "zk-budget" created
statefulset "zk" created

接下來 StatefulSet 控制器開始順序建立各個 Pod,在建立後續 Pod 之前,首先要等前面的 Pod 執行成功並進入到就緒狀態。

$ kubectl get-w -l app=zk
NAME      READY     STATUS    RESTARTS   AGE
zk-00/1Pending00s
zk-00/1Pending00s
zk-00/1Pending07s
zk-00/1ContainerCreating07s
zk-00/1Running038s
zk-01/1Running058s
zk-10/1Pending01s
zk-10/1Pending01s
zk-10/1ContainerCreating01s
zk-10/1Running033s
zk-11/1Running051s
zk-20/1Pending00s
zk-20/1Pending00s
zk-20/1ContainerCreating00s
zk-20/1Running025s
zk-21/1Running040s

檢查一下 StatefulSet 中每個 Pod 的主機名稱,你會發現 Pod 的主機名也包含了 Pod 的順序:

$ for i in012;do kubectl exec zk-$i -- hostname;done
zk-0
zk-1
zk-2

ZooKeeper 在一個名為 "myid" 的檔案中儲存了每個伺服器的唯一識別符號。這個識別符號只是自然數。在 Ensemble 的伺服器中,"myid" 檔案中儲存的數字就是 Pod 主機名中的順序號加一。

$ for i in012;do echo "myid zk-$i";kubectl exec zk-$i -- cat /var/lib/zookeeper/data/myid;done
myid zk-01
myid zk-12
myid zk-23

基於主機名,每個 Pod 都有獨立的網路地址,這個網域由 zk-headless 這一 Headless 服務所控制。

$  for i in012;do kubectl exec zk-$i -- hostname -f;done
zk
            
           

相關推薦

StatefulSet: Kubernetes 狀態應用執行伸縮_Kubernetes中文社群

在最新發布的 Kubernetes 1.5 我們將過去的 PetSet 功能升級到了 Beta 版本,並重新命名為StatefulSet。除了依照社群民意改了名字之外,這一 API 物件並沒有太大變化,不過我們在向集合裡部署 Pod 的過程中加入了“每索引最多一個”的語義。有了順序部署、順序終

StatefulSet: Kubernetes 狀態應用執行伸縮

http://blog.fleeto.us/translation/statefulset-run-and-scale-stateful-applications-easily-kubernetes?utm_source=tuicool&utm_medium=

如何在Kubernetes管理狀態應用

Kubernetes在Kubernetes中,StatefulSet被用來管理有狀態應用的API對象。StatefulSets在Kubernetes 1.9版本才穩定。StatefulSet管理Pod部署和擴容,並為這些Pod提供順序和唯一性的保證。與Deployment相似的地方是,StatefulSet基

Kubernetes執行狀態應用:從StatefulSet到Operator

    一開始Kubernetes只是被設計用來執行無狀態應用,直到在1.5版本中才添加了StatefulSet控制器用於支援有狀態應用,但它直到1.9版本才正式可用。本文將介紹有狀態和無狀態應用,一個通過K8S StatefulSet來編排有狀態應用的示例,以及當前有狀態應用容器化現狀及

StatefulSet狀態應用副本集

statefulset有狀態應用副本集 PetSet -> StatefulSet 1.文件且唯一的網路識別符號 2.穩定且持久的儲存 3.有序,平滑的部署和擴充套件 4.有序,平滑的刪除和終止 5.有序的滾動更新 三個元件: headless service StatefulSet

Python 同一檔案unittest不執行“if __name__ == '__main__”,不生成HTMLTestRunner測試報告的解決方案

1、問題:Python中同一個.py檔案中同時用unittest框架和HtmlReport框架後,HtmlReport不被執行。 2、為什麼?其實不是HtmlReport不被執行,也不是HtmlReport不生成測試報告,是因為if __name__ == '__main__'中的程式碼根本沒執

狀態應用(Session)到無狀態應用(JWT),以及 SSO OAuth2

從有狀態應用(Session)到無狀態應用(JWT),以及 SSO 和 OAuth2 不管用哪種方式認證使用者,都可能被中間人攻擊竊取 SessionID 或 Token,從而發生 CSRF 攻擊。解決方式就是全站 HTTPS。現在 Let’s Encrypt 已經支援免費的萬用字元 HTT

“遷移策略+新容器運行時”應對狀態應用的冷熱遷移挑戰

技術 獲得 容易出錯 角度 text 51cto 耗時 交流 冗余 作者:稻農阿裏雲智能事業群高級技術專家參與主導容器運行時及網絡創新工作;目前的工作側重於基於進程虛擬化的研究及增強(網絡及熱遷移方面),在阿裏推行微安全容器及熱遷移等,力圖在保持容器簡單高資源利用率前提下,

APP網路狀態變化進行全域性提示

1. 實現監聽網路狀態變更的廣播接收器 我們使用廣播接收器接收網路變化的 Intent,這裡直接使用靜態註冊的方法,因為我們不需要在每個頁面單獨註冊這個 Receiver,那太重量級了。 NetworkConnectChangedReceiver.java publ

淺析權限認證狀態狀態

總結 有一個 eth 返回 alt 配置 客戶端信息 傳遞 主動 前言 我們在設計構建一個系統的時候,權限管理和用戶認證是最基本功能,其中關於用戶認證這塊是一個比較常見的模塊。在已有的方案中,我們最常見的就是保存到 tomcat 中的 session 對象中。隨著微服務的興

kubernetes pv、pvc、configmapsecret

configmap和secret PV和PVC是藉助於StorageClass來分配磁碟的 如何給Pod傳配置資訊: 兩種方式: 1.把configmap關聯到一個pod上,傳遞給pod內部的一個變數,注入的方式給容器傳配置資訊 2.配置卷,將配置檔案對映到外面的路徑 configm

(演算法導論習題解exercise2.3-7)給定一個整數序列以及一個數X,確定該序列是否兩個數的為X

這是<<演算法導論>>中的一題,exercise 2.3-7.可以這麼做:1) 首先將序列排序,去掉重複的元素.2) 其次生成一個序列, 該序列中每個元素都是X-原序列中的值, 同樣的,去重.3) 對這兩個已經排序好的序列進行合併操作.4) 如果有兩個元素之和為X, 那麼在合併

delphioverride(重寫)overload(過載)的一些看法

 重寫就是用現在的方法覆蓋了繼承過來的方法,過載就是在不改變繼承過來的方法的基礎上重新新增一個方法名字一樣,但引數或返回值是不一樣的。 下面舉個例子: unit Unit1;interfacetype TStudent=classprivate//...     publi

c#object進行序列化反序列化

有時候我們需要對一些資料進行二進位制序列化以達到儲存或傳輸的目的,這裡記錄一下對object的序列化和反序列化操作。 首先引入名稱空間: using System.IO; using System.Runtime.Serialization.Formatters.Bina

C#類的序列化反序列化操作

序列化和反序列化操作: 作用:實現不借助資料庫持久化的儲存資料。 實現步驟: 1.匯入名稱空間 using System.IO;//IO流實現檔案的讀寫 using System.Runtime.Serialization.Formatters

ARM編譯器齊的使用__align__packed

以下是我整理的__align和__packed的使用,希望對大家有用 1.__align(num)  __align __align 關鍵字指示編譯器在 n 位元組邊界上對齊變數。 __align 是一個儲存類修飾符。它不影響函式的型別。 語法 __align(n) 其

javaMap哪些實現類使用場景

     Java中的map是一個很重要的集合,他是一個介面,下面繼承它實現了多個實現類,這些類各有千秋,各自有個各自的優點和缺點,先上圖。     map的主要特點是鍵值對的形式,一一對應,且一個key只對應1個value。其常用的map實現類主要有HashMap、Hash

Struts2資料簡單的驗證property標籤的用法

使用addFieldError方法和s:fieldError標籤簡單處理資料校驗 場景:對一個使用者名稱進行驗證,如果使用者名稱不合法,則顯示給客戶端檢視資訊。 URL請求地址: http://localhost:8080/Struts2_SimpleDataValiat

Nginx-第四篇:在實踐日誌格式詳解日誌檔案按日期進行分割

從上面我們可以看出幾部分資訊: 01.【$remote_addr】客戶端(使用者)IP地址。如:上例中的 201.0.69.2 02.【$remote_user】 記錄客戶端使用者名稱稱 03.【[$time_local]】訪問時間。如:上例中的 [26/Jul/2018:03:17:20

Kubernetes學習筆記(九):StatefulSet--部署狀態的多副本應用

## StatefulSet如何提供穩定的網路標識和狀態 ReplicaSet中的Pod都是無狀態,可隨意替代的。又因為ReplicaSet中的Pod是根據模板生成的多副本,無法對每個副本都指定單獨的PVC。 來看一下StatefulSet如何解決的。 ### 提供穩定的網路標識 StatefulSet建