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状态,重新挂量。

posted on 2024-12-20 15:39  颖月石  阅读(17)  评论(0)    收藏  举报