[英]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
單行做這個; 如果您正在使用像kubernetes-helm這樣的部署管理器,那么您可以將當前日期作為“值”(配置字段)傳入並為其注入。
但是,如果你想要更大,那么:各種基本映像通常都有安全更新和小錯誤修復,如果你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.