簡體   English   中英

如何回收Kubernetes中的豆莢

[英]How to recycle pods in Kubernetes

我希望我的pod可以在一段時間后(例如每周或每月)從我的部署中優雅地回收。 我知道如果我知道Kubernetes命令,我可以為此添加一個cron作業。

問題是在Kubernetes中做到這一點的最佳方法是什么。 哪個命令會讓我實現這個目標?

非常感謝你幫助我解決這個問題。

您應該通過更高級別的控制器(如Deployment或StatefulSet)來管理Pod。 如果您這樣做,並且您更改了嵌入式pod規范的任何細節,則Deployment / StatefulSet / ...將為您重新啟動所有pod。 可能最簡單的方法是在pod規范中添加一個注釋,說明上次部署的時間:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      annotations:
        deployed-at: 20181222

可能有一個kubectl patch單行做這個; 如果您正在使用像這樣的部署管理器,那么您可以將當前日期作為“值”(配置字段)傳入並為其注入。

但是,如果你想要更大,那么:各種基本映像通常都有安全更新和小錯誤修復,如果你docker pull ubuntu:18.04每月一次左右,你將獲得這些更新。 如果您確實每個月都想要重新啟動pod,並且設置了良好的CI / CD管道,請考慮在Jenkins中設置預定作業或者重建和重新部署所有內容,即使沒有任何更改底層的源樹。 這將導致image:更新,這將導致所有窗格被銷毀和重新創建, 並且您將始終合理地了解安全更新。

正如OP rayhan已經發現的那樣 ,並且如kubernetes/kubernetes issue 13488中所評論的kubernetes/kubernetes ,環境變量的kubectl補丁就足夠了。

但是...... K8s 1.15會讓kubectl rollout restart ......那就是PR 77423被接受並合並的時候。

kubectl rollout restart現在適用於守護進程和狀態集。

如果您需要手動手動重啟Pod,則可以運行

'kubectl get pods | grep somename | awk'{print $ 1}'| xargs -i sh -c'kubectl delete pod -o name {} && sleep 4'

基於計時器的工作(例如來自您的CI系統),如KIVagant在https://github.com/kubernetes/kubernetes/issues/13488#issuecomment-372456851中所建議的

GitHub線程顯示目前沒有單一的最佳方法,人們提出了不同的建議。 我提到一個,因為它最接近你的建議,並且是一個簡單的解決方案,如果你必須這樣做。 通常同意的是,您應該嘗試避免重新啟動作業並使用探針來確保自動重啟不健康的pod。

定期升級(而非重啟)非常好,特別是滾動升級。 但是如果你這樣做,那么要小心所有升級都不會掩蓋問題。 如果你有Pods內存泄漏或者長時間運行后排氣連接池,那么你想嘗試讓不健康的Pod報告自己不健康 - 因為它們可以自動重啟,因為它可以幫助你監控代碼問題並解決它們。

你永遠不會手動回收豆莢,這是使用kuberentes的明顯反模式。

選項:

  • 使用kubectl apply -f --prune的declrative格式

  • 使用像Gitlab或Spinakar這樣的CI / CD工具

  • 使用Ksonnet

  • 使用Knative

  • 編寫自己的CI / CD工具,使其自動化

到目前為止,我發現以下一行命令適用於我的目的。 我在成功構建后從Jenkins運行它。

kubectl patch deployment {deployment_name} -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM