
前言前面我们搞定了集群搭建、网络、存储、监控、安全、故障排查、性能优化。集群稳了、监控有了、故障能排了最后一步也是生产最核心的能力自动化发布。如果没有 CI/CD我们每次上线都要打包 → 构建镜像 → 推仓库 → 改 yaml → apply效率极低、极易出错、无法回滚、无法规范版本。本周完整落地生产可用的 K8s CI/CD 流水线包含完整架构、组件讲解、环境搭建、Jenkinsfile 完整脚本、K8s 部署文件、自动构建、自动发布、版本管理、滚动更新、一键回滚、金丝雀发布、生产踩坑、企业规范。一、先搞懂K8s CI/CD 完整架构整条流水线由 4 大组件组成Gitee/GitLab/GitHub代码仓库代码提交触发构建Jenkins流水线核心负责编译、打包、构建镜像、部署Harbor 私有镜像仓库存放所有生产镜像、版本管理、漏洞扫描K8s 集群最终运行业务容器完整流水线流程生产标准开发者git push提交代码→ Webhook 触发 Jenkins 流水线→ Jenkins 拉取代码、编译、单元测试、代码检查→ Docker 构建镜像GitCommit 作为版本号→ 推送镜像到 Harbor→ Jenkins 通过 kubeconfig 操作 K8s→ K8s 滚动更新 Deployment、不中断业务→ 发布成功 / 失败钉钉告警→ 支持一键回滚历史版本二、前置环境准备全部可直接复制执行1. 安装 DockerJenkins 打包镜像需要yum install docker-ce -y systemctl start docker systemctl enable docker2. 安装 Jenkinsdocker run -d \ --name jenkins \ -p 8080:8080 \ -p 50000:50000 \ -v /data/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ jenkins/jenkins:lts3. 安装 Harbor 私有仓库helm repo add harbor https://goharbor.github.io/helm-chart helm repo update helm install harbor harbor/harbor -n harbor --create-namespace4. Jenkins 必须安装的插件Git PluginPipelineDocker PipelineKubernetes PluginKubernetes Credentials5. Jenkins 绑定 K8s 权限关键把 K8s 的/.kube/config复制到 Jenkins让 Jenkins 能操作集群cat /root/.kube/config # 复制内容到Jenkins凭据 → kubeconfig三、生产级完整流水线项目结构demo-project/ ├── Dockerfile ├── Jenkinsfile ├── k8s/ │ ├── deployment.yaml │ ├── service.yaml │ └── ingress.yaml四、完整可上线 Dockerfile生产标准FROM openjdk:8-jre-alpine WORKDIR /app COPY target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [java,-jar,app.jar]五、生产级完整 Jenkinsfile全流程功能包含拉取代码编译打包版本号生成GitCommit构建镜像推送 HarborK8s 滚动更新成功 / 失败告警pipeline { agent any environment { // 镜像仓库地址、项目名 HARBOR_URL harbor.xxx.com PROJECT demo IMAGE_NAME ${HARBOR_URL}/${PROJECT}/demo-app // 使用git commit短ID作为版本号永不重复 IMAGE_TAG sh(script: git rev-parse --short HEAD, returnStdout: true).trim() } stages { stage(1.拉取代码) { steps { git branch: main, url: https://gitee.com/xxx/demo.git } } stage(2.代码编译单元测试) { steps { sh mvn clean package -Dmaven.test.skipfalse } } stage(3.构建Docker镜像) { steps { sh docker build -t ${IMAGE_NAME}:${IMAGE_TAG} . } } stage(4.推送镜像到Harbor) { steps { withCredentials([usernamePassword(credentialsId: harbor-auth, passwordVariable: PWD, usernameVariable: USER)]) { sh docker login ${HARBOR_URL} -u ${USER} -p ${PWD} docker push ${IMAGE_NAME}:${IMAGE_TAG} } } } stage(5.部署到K8s集群) { steps { sh kubectl apply -f k8s/deployment.yaml kubectl apply -f k8s/service.yaml kubectl apply -f k8s/ingress.yaml } } stage(6.验证发布) { steps { sh kubectl rollout status deployment/demo-app -n prod } } } post { success { echo ✅ 生产发布成功 版本:${IMAGE_TAG} } failure { echo ❌ 流水线发布失败 } } }六、K8s 生产完整部署文件带滚动更新策略1.deployment.yaml重点生产发布策略apiVersion: apps/v1 kind: Deployment metadata: name: demo-app namespace: prod spec: replicas: 3 selector: matchLabels: app: demo-app strategy: # 滚动更新核心配置 type: RollingUpdate rollingUpdate: maxSurge: 1 # 最多超1个Pod maxUnavailable: 0 # 发布期间业务0不可用 template: metadata: labels: app: demo-app spec: containers: - name: demo-app image: harbor.xxx.com/demo/demo-app:${IMAGE_TAG} ports: - containerPort: 8080 resources: requests: cpu: 100m memory: 256Mi limits: cpu: 500m memory: 512Mi readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 32.service.yamlapiVersion: v1 kind: Service metadata: name: demo-app-svc namespace: prod spec: selector: app: demo-app ports: - port: 80 targetPort: 8080 type: ClusterIP3.ingress.yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-app-ingress namespace: prod spec: rules: - host: demo.xxx.com http: paths: - path: / pathType: Prefix backend: service: name: demo-app-svc port: number: 80七、配置 Git Webhook 自动触发流水线Gitee/GitLab 项目 → 管理 → Webhook填写 URLhttp://JenkinsIP:8080/github-webhook/触发事件Push 事件保存后以后git push自动构建发布八、生产核心功能一键回滚企业必备查看发布历史kubectl rollout history deployment demo-app -n prod一键回滚上一版本kubectl rollout undo deployment demo-app -n prod回滚指定版本kubectl rollout undo deployment demo-app --to-revision2 -n prod九、高级生产能力金丝雀发布灰度发布适用于核心业务、不能全量更新的场景。原理先部署少量金丝雀 Pod1-2 个引流少量用户测试无报错再全量发布canary-deploy.yaml 示例apiVersion: apps/v1 kind: Deployment metadata: name: demo-app-canary namespace: prod spec: replicas: 1 selector: matchLabels: app: demo-app-canary template: metadata: labels: app: demo-app-canary spec: containers: - name: demo-app image: harbor.xxx.com/demo/demo-app:${NEW_TAG}验证无误后再更新正式 Deployment 完成全量发布。十、生产高频踩坑大全详细版坑 1镜像标签 latest 导致 K8s 不更新原因latest 永远不变K8s 认为镜像没变化解决必须使用 GitCommit ID 做版本号坑 2Jenkins 没有 docker 权限打包报错usermod -aG docker jenkins坑 3Harbor 私有仓库镜像拉取失败解决所有节点配置私有仓库信任vim /etc/docker/daemon.json { insecure-registries:[harbor.xxx.com] } systemctl restart docker坑 4滚动更新期间业务报错原因就绪探针时间太短、程序未启动完成就接入流量解决调高initialDelaySeconds坑 5流水线成功但 K8s 没更新原因yaml 内容无变化K8s 不触发更新解决每次必须镜像版本变化坑 6Webhook 不触发排查公网无法访问 Jenkins、防火墙拦截、URL 写错十一、企业生产规范禁止使用 latest 标签全部使用 commit 版本号生产必须配置maxUnavailable0保证发布零宕机必须配置健康检查避免发布坏版本所有镜像必须推私有仓库禁止节点直接拉外网镜像每次发布保留历史版本支持一键回滚核心业务必须走金丝雀灰度发布流水线必须有编译、测试、打包、扫描、部署、告警十二、本周总结本周我们从零搭建了企业级完整 CI/CD 流水线实现了代码提交 → 自动编译 → 自动构建镜像 → 自动推送仓库 → 自动滚动发布 K8s → 一键回滚 → 灰度发布。彻底摆脱手动上线实现生产全自动、标准化、可回滚、零停机发布是 K8s 生产落地最重要的一环。