kubectl apply 之后客户端做了什么?
前言
在学习 kubernetes
源码过程中,看到 kubectl apply
源码里面有个很有意思的现象。起初我以为当我们执行 kubectl apply -f deployment.yaml
之后,客户端会把 deployment.yaml
完整地发送给 api-server
,然后让 api-server
重新渲染这个 deployment
资源并更替旧的资源。
实际上却并非这样,当我们执行 kubectl apply
的时候,默认是采用的是 client-side apply
模式。客户端会先会生成一个增量的 patch
对象,然后在发送给 api-server
进行 patch
操作。而生成这个增量信息生成的算法,是通过三路数据合并得到的。
本文源码选取
kubectl
的源码本身应该在 git@github.com:kubernetes/kubectl.git
仓库。但是在 kubernetes 大仓里面也有一个用于发布到公共类库的镜像源码。所以我直接下载 kubernetes 大仓 git@github.com:kubernetes/kubernetes.git
,查看源码更加方便一些。我的 kubectl
客户端版本是 v1.21.3
,所以就切换到对应标签 v1.21.3
。
kubectl apply 执行流程
下面用伪代码大概描述下 kubectl apply
的执行流程
# 入口文件 ./staging/src/k8s.io/kubectl/pkg/cmd/apply/apply.go
applyOptions.Run() ->
info = read("deployment.yaml")
applyOptions.applyOneObject(info) ->
# modified 保存为用户传入的资源对象,并且更新 annotation["lac"] 为自己
modified = info.Object
modified.annotation["lac"] = info.Object
# 从 api-server 获取当前资源对象
info.Get() -