久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

kubernetes中有狀態(tài)應用怎么縮容

151次閱讀
沒有評論

共計 2160 個字符,預計需要花費 6 分鐘才能閱讀完成。

這篇文章主要介紹“kubernetes 中有狀態(tài)應用怎么縮容”,在日常操作中,相信很多人在 kubernetes 中有狀態(tài)應用怎么縮容 問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”kubernetes 中有狀態(tài)應用怎么縮容”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

通過 StatefulSet 創(chuàng)建的每個 Pod 都有自己的 PersistentVolumeClaim(PVC)和 PersistentVolume(PV)。當按一個副本按比例縮小 StatefulSet 的大小時,其 Pod 之一將終止,但關聯(lián)的 PersistentVolumeClaim 和綁定到其的 PersistentVolume 保持不變。在隨后擴大規(guī)模時,它們會重新連接到 Pod。

Scaling a StatefulSet

現(xiàn)在,想象一下使用 StatefulSet 部署一個有狀態(tài)的應用程序,其數(shù)據(jù)在其 pod 中進行分區(qū)。每個實例僅保存和處理一部分數(shù)據(jù)。當您縮小有狀態(tài)應用的規(guī)模時,其中一個實例將終止,其數(shù)據(jù)應重新分配到其余的 Pod。如果您不重新分配數(shù)據(jù),則在再次進行擴展之前,它仍然不可訪問。

Redistributing data on scale-down

在正常關機期間重新分發(fā)數(shù)據(jù)

您可能會想:“既然 Kubernetes 支持 Pod 正常關閉的機制,那么 Pod 是否可以在關閉過程中簡單地將其數(shù)據(jù)重新分配給其他實例呢?”事實上,它不能。為什么不這樣做有兩個原因:

Pod(或更確切地說,其容器)可能會收到除縮容以外的其他原因的終止信號。容器中運行的應用程序不知道為什么終止該程序,因此不知道是否要清空數(shù)據(jù)。

即使該應用程序可以區(qū)分是縮容還是由于其他原因而終止,它也需要保證即使經(jīng)過數(shù)小時或數(shù)天也可以完成關閉程序。Kubernetes 不提供該保證。如果應用程序進程在關閉過程中死掉,它將不會重新啟動,因此也就沒有機會完全分發(fā)數(shù)據(jù)。

因此,相信在正常關閉期間 Pod 能夠重新分發(fā)(或以其他方式處理其所有數(shù)據(jù))并不是一個好主意,并且會導致系統(tǒng)非常脆弱。

使用 tear-down 容器?

如果您不是 Kubernetes 的新手,那么你很可能知道什么是初始化容器。它們在容器的主要容器之前運行,并且必須在主要容器啟動之前全部完成。

如果我們有 tear-down 容器(類似于 init 容器),但是在 Pod 的主容器終止后又會運行,該怎么辦?他們可以在我們的有狀態(tài) Pod 中執(zhí)行數(shù)據(jù)重新分發(fā)嗎?

假設 tear-down 容器能夠確定 Pod 是否由于縮容而終止。并假設 Kubernetes(更具體地說是 Kubelet)將確保 tear-down 容器成功完成(通過在每次返回非零退出代碼時重新啟動它)。如果這兩個假設都成立,我們將擁有一種機制,可確保有狀態(tài)的容器始終能夠按比例縮小規(guī)模重新分配其數(shù)據(jù)。

但是?

可悲的是,當 tear-down 容器本身發(fā)生瞬態(tài)錯誤,并且一次或多次重新啟動容器最終使它成功完成時,像上述的 tear-down 容器機制將只處理那些情況。但是,在 tear-down 過程中托管 Pod 的集群節(jié)點死掉的那些不幸時刻又如何呢?顯然,該過程無法完成,因此無法訪問數(shù)據(jù)。

現(xiàn)在很明顯,我們不應該在 Pod 關閉時執(zhí)行數(shù)據(jù)重新分配。相反,我們應該創(chuàng)建一個新的 Pod(可能安排在一個完全不同的集群節(jié)點上)以執(zhí)行重新分發(fā)過程。

這為我們帶來了以下解決方案:

縮小 StatefulSet 時,必須創(chuàng)建一個新的容器并將其綁定到孤立的 PersistentVolumeClaim。我們稱其為“drain pod”,因為它的工作是將數(shù)據(jù)重新分發(fā)到其他地方(或以其他方式處理)。Pod 必須有權訪問孤立的數(shù)據(jù),并且可以使用它做任何想做的事情。由于每個應用程序的重新分發(fā)程序差異很大,因此新的容器應該是完全可配置的 - 用戶應該能夠在 drain Pod 內(nèi)運行他們想要的任何容器。

StatefulSet Drain Controller

由于 StatefulSet 控制器當前尚不提供此功能,因此我們可以實現(xiàn)一個額外的控制器,其唯一目的是處理 StatefulSet 縮容。我最近實現(xiàn)了這種控制器的概念驗證。您可以在 GitHub 上找到源代碼:

luksa/statefulset-scaledown-controllergithub.com

下面我們解釋一下它是如何工作的。

在將控制器部署到 Kubernetes 集群后,您只需在 StatefulSet 清單中添加注釋,即可將 drain 容器模板添加到任何 StatefulSet 中。這是一個例子:

apiVersion: apps/v1kind: StatefulSetmetadata: name: datastore annotations: statefulsets.kubernetes.io/drainer-pod-template: | {  metadata : {  labels : {  app :  datastore-drainer .........

到此,關于“kubernetes 中有狀態(tài)應用怎么縮容”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注丸趣 TV 網(wǎng)站,丸趣 TV 小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-08-04發(fā)表,共計2160字。
轉(zhuǎn)載說明:除特殊說明外本站除技術相關以外文章皆由網(wǎng)絡搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 屯留县| 昔阳县| 樟树市| 金门县| 闽侯县| 和林格尔县| 江津市| 兴义市| 开化县| 建昌县| 平顺县| 钟祥市| 光泽县| 淮阳县| 贡山| 育儿| 信阳市| 那曲县| 定西市| 吉木萨尔县| 伊春市| 东海县| 富平县| 白水县| 绩溪县| 望城县| 丰台区| 遂平县| 洛阳市| 长治县| 龙泉市| 昆明市| 博罗县| 修武县| 镇安县| 铁岭市| 阿坝县| 阜平县| 东莞市| 富源县| 清远市|