W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本文介紹如何刪除 StatefulSet 管理的 Pods,并解釋這樣操作時(shí)需要記住的注意事項(xiàng)。
在 StatefulSet 的正常操作中,永遠(yuǎn)不需要強(qiáng)制刪除 StatefulSet 管理的 Pod。 StatefulSet 控制器負(fù)責(zé)創(chuàng)建、 擴(kuò)縮和刪除 StatefulSet 管理的 Pods。它嘗試確保指定數(shù)量的從序數(shù) 0 到 N-1 的 Pod 處于活躍狀態(tài)并準(zhǔn)備就緒。StatefulSet 確保在任何時(shí)候,集群中最多只有一個(gè)具有給定標(biāo)識(shí)的 Pod。 這就是所謂的由 StatefulSet 提供的*最多一個(gè)(At Most One)*的語(yǔ)義。
應(yīng)謹(jǐn)慎進(jìn)行手動(dòng)強(qiáng)制刪除操作,因?yàn)樗赡軙?huì)違反 StatefulSet 固有的至多一個(gè)的語(yǔ)義。 StatefulSets 可用于運(yùn)行分布式和集群級(jí)的應(yīng)用,這些應(yīng)用需要穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)和可靠的存儲(chǔ)。 這些應(yīng)用通常配置為具有固定標(biāo)識(shí)固定數(shù)量的成員集合。 具有相同身份的多個(gè)成員可能是災(zāi)難性的,并且可能導(dǎo)致數(shù)據(jù)丟失 (例如:票選系統(tǒng)中的腦裂場(chǎng)景)。
你可以使用下面的命令執(zhí)行體面地刪除 Pod:
kubectl delete pods <pod>
為了讓上面操作能夠體面地終止 Pod,Pod 一定不能 設(shè)置 ?pod.Spec.TerminationGracePeriodSeconds
? 為 0。 將 ?pod.Spec.TerminationGracePeriodSeconds
? 設(shè)置為 0s 的做法是不安全的,強(qiáng)烈建議 StatefulSet 類型的 Pod 不要使用。體面刪除是安全的,并且會(huì)在 kubelet 從 API 服務(wù)器中刪除資源名稱之前確保 體面地結(jié)束 pod 。
當(dāng)某個(gè)節(jié)點(diǎn)不可達(dá)時(shí),不會(huì)引發(fā)自動(dòng)刪除 Pod。 在無(wú)法訪問(wèn)的節(jié)點(diǎn)上運(yùn)行的 Pod 在 超時(shí) 后會(huì)進(jìn)入'Terminating' 或者 'Unknown' 狀態(tài)。 當(dāng)用戶嘗試體面地刪除無(wú)法訪問(wèn)的節(jié)點(diǎn)上的 Pod 時(shí) Pod 也可能會(huì)進(jìn)入這些狀態(tài)。 從 API 服務(wù)器上刪除處于這些狀態(tài) Pod 的僅有可行方法如下:
推薦使用第一種或者第二種方法。如果確認(rèn)節(jié)點(diǎn)已經(jīng)不可用了 (比如,永久斷開(kāi)網(wǎng)絡(luò)、斷電等), 則應(yīng)刪除 Node 對(duì)象。 如果節(jié)點(diǎn)遇到網(wǎng)裂問(wèn)題,請(qǐng)嘗試解決該問(wèn)題或者等待其解決。 當(dāng)網(wǎng)裂愈合時(shí),kubelet 將完成 Pod 的刪除并從 API 服務(wù)器上釋放其名字。
通常,Pod 一旦不在節(jié)點(diǎn)上運(yùn)行,或者管理員刪除了節(jié)點(diǎn),系統(tǒng)就會(huì)完成其刪除動(dòng)作。 你也可以通過(guò)強(qiáng)制刪除 Pod 來(lái)繞過(guò)這一機(jī)制。
強(qiáng)制刪除不會(huì)等待來(lái)自 kubelet 對(duì) Pod 已終止的確認(rèn)消息。 無(wú)論強(qiáng)制刪除是否成功殺死了 Pod,它都會(huì)立即從 API 服務(wù)器中釋放該名字。 這將讓 StatefulSet 控制器創(chuàng)建一個(gè)具有相同標(biāo)識(shí)的替身 Pod;因而可能導(dǎo)致正在運(yùn)行 Pod 的重復(fù), 并且如果所述 Pod 仍然可以與 StatefulSet 的成員通信,則將違反 StatefulSet 所要保證的 最多一個(gè)的語(yǔ)義。
當(dāng)你強(qiáng)制刪除 StatefulSet 類型的 Pod 時(shí),你要確保有問(wèn)題的 Pod 不會(huì)再和 StatefulSet 管理的其他 Pod 通信并且可以安全地釋放其名字以便創(chuàng)建替代 Pod。
如果要使用 kubectl 1.5 以上版本強(qiáng)制刪除 Pod,請(qǐng)執(zhí)行下面命令:
kubectl delete pods <pod> --grace-period=0 --force
如果你使用 kubectl 的 1.4 以下版本,則應(yīng)省略 ?--force
? 選項(xiàng):
kubectl delete pods <pod> --grace-period=0
如果在這些命令后 Pod 仍處于 ?Unknown
?狀態(tài),請(qǐng)使用以下命令從集群中刪除 Pod:
kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
請(qǐng)始終謹(jǐn)慎地執(zhí)行強(qiáng)制刪除 StatefulSet 類型的 pods,并完全了解所涉及地風(fēng)險(xiǎn)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: