在红岩网校暑假考核期间,同学们需要将自己的服务部署在指定的Kubernetes集群上,并通过GitLab实现CI/CD。

kubectl是官方的CLI命令行工具,用于与集群的apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径。

在我部署期间,我发现kubectl偶尔可用,偶尔不可用。下面是我在CI/CD期间的截图,此job自动将之前打包的Docker镜像$HB_IMAGE部署在集群中:
K8s的Kubectl无法更新镜像的问题
file
这两次job都是我手动运行的。可见,在同一次commit中(代码没有变化),第一次成功部署,第二次没有任何反应。

这个问题困扰了我很久,直到有一次我手动编辑yaml文件并运行了两次kubectl apply -f app.yaml,它显示未修改配置,我突然明白了。
对于内容相同的yaml文件,再次应用的话apiserver不会有任何反应;而CI/CD过程也同理,无论多少次commit,多少次job,部署命令和镜像地址都是一样的,这就导致apiserver认为配置没有变化而没有反应,但实际上镜像是有更新的。
第一张图里面更新成功是因为我之前手动改了配置。

对于此问题,我的解决方法是在设置镜像的命令之后加上以下命令来让集群重新部署deployment,这样它就会重新拉取镜像并重新部署。

kubectl rollout restart deployment/app