kubernetes 本身不提供持续部署能力,需外部工具链驱动ci流程;必须用不可变镜像tag而非:latest;deployment的image字段须模板化注入,不可硬编码。

直接上结论:Kubernetes 本身不提供持续部署(CD)能力,它只负责“按声明运行”,真正的 CD 流程必须由外部工具链驱动 —— 你得用 CI 工具(如 GitHub Actions、GitLab CI 或 Argo CD)监听代码变更、构建镜像、推送仓库、再更新 Kubernetes 的 Deployment 中的 image 字段。漏掉任一环,就只是手动 kubectl apply,谈不上“持续”。
CI 流水线必须触发镜像构建并打唯一 tag
很多人用 :latest 当镜像 tag,这是 CD 最大隐患:Kubernetes 不会主动拉新镜像,即使 Deployment 没变,:latest 在仓库里已更新,集群里旧 Pod 还在跑老二进制。
- 必须用不可变 tag,推荐
v1.2.3、git commit SHA或$(date -u +%Y%m%d%H%M%S) - CI 脚本里要确保
docker build -t your-registry/go-app:$TAG .和docker push your-registry/go-app:$TAG成功后才继续 - 若用 Argo CD,需配置
ImageUpdater或配合argocd-image-updater自动同步 tag 变更
Deployment 的 image 字段不能硬编码,得可注入
写死 image: your-registry/go-app:v1.0 的 YAML 无法被 CI 动态替换,每次改版本都要手改文件,违背 CD 原则。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 用
envsubst或ytt模板:YAML 里写image: your-registry/go-app:${IMAGE_TAG},CI 中执行envsubst - 用 Helm:把
image.tag设为 value,CI 中调helm upgrade --set image.tag=$TAG - 避免用
kubectl set image:它绕过 Git 状态,导致集群实际状态和代码库 YAML 不一致,审计和回滚困难
滚动更新必须配 readinessProbe + maxSurge/maxUnavailable
没配探针或参数不合理,CD 过程中会出现请求 502、连接拒绝或短暂中断 —— 不是 Kubernetes 不行,是你没告诉它“什么时候才算新 Pod 真正可用”。
-
readinessProbe必须检查真实就绪条件,比如http://localhost:8080/readyz返回 200,且该 handler 内部应确认 DB 连接池已 warmup、gRPC server 已 start listening -
maxSurge: 1和maxUnavailable: 0组合可实现零停机:先扩一个新 Pod,等它通过 readiness 检查后再缩一个旧 Pod - 别依赖
initialDelaySeconds猜测启动时间;Go 服务冷启动通常
回滚不是“重跑 CI”,而是 Git 版本切换 + 重新部署
CD 的关键不是“发版快”,而是“回滚稳”。线上出问题时,没人有心情等 CI 重新走一遍构建流程。
- 所有 Kubernetes YAML 必须存 Git,每次
git commit对应一次可部署状态 - 回滚 =
git checkout <last-good-commit></last-good-commit>+kubectl apply -f .(或helm rollback) - 如果用了 Argo CD,回滚就是点一下 Web UI 的 “Rollback to this version”,底层仍是切 Git commit
- 警惕“自动回滚”:Kubernetes 不会因 probe 失败自动切回旧版本,那是 CI/CD 工具的事,且需配套健康指标(如 Prometheus 查询失败率突增)才能触发
最易被忽略的一点:CD 流水线本身需要可观测性。你得清楚知道某次 git push 后,到底是镜像构建失败、推送超时、还是 Deployment 的 imagePullBackOff 导致更新卡住 —— 这些状态不会自动出现在 kubectl get pods 里,得靠 CI 日志、Events 查询(kubectl get events --sort-by=.lastTimestamp)和镜像仓库 webhook 联动。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










