k8s常見知識
為了工作方便,對一些常見知識點進行梳理,便于溝通
1. Pod原地更新
https://developer.aliyun.com/article/765421
Deployment、statefulset不具備,cloneset和appset具備
原理:k8s支持pod容器原地升級,當只更改容器的env、image、volumemounts等字段時,可以不重建pod,直接升級容器。該過程,pod的網絡、ip等都不變化。
cloneset和appset 針對InPlace類型的升級,直接將上述字段變更,patch到pod里面,觸發容器升級。
容器升級過程中,kubelet 會感知到這個 容器 的 hash 發生了變化,隨即就會停掉對應的舊容器,并用新的容器來拉鏡像、創建和啟動新容器。
問題1:如何判斷Pod原地更新成功?
在更新了 spec 鏡像之后,如果觀察到 Pod 的 status.containerStatuses[x].imageID 變化了,我們就認為原地升級已經重建了容器。
問題2:如何保證流量無損更新?
正常情況下,pod狀態變為ready,service就會認為pod啟動成功,掛到ep上,導入流量。
Pod原地更新過程中,涉及容器重建,需要一些機制調整:
1. 更新前,在pod.status.condition的InPlaceUpdateReady condition設置為false,kubelet感知后,讓Pod變成NotReady狀態,從而從ep上摘除。
2.更新后,InPlaceUpdateReady condition設置為true,觸發kubelete將Pod變成Ready狀態,重新掛量。
浙公網安備 33010602011771號