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号