告别手动部署:在 Amazon EKS 上用 CodePipeline + Argo CD 搭建 GitOps CI/CD

张开发
2026/4/4 0:11:59 15 分钟阅读
告别手动部署:在 Amazon EKS 上用 CodePipeline + Argo CD 搭建 GitOps CI/CD
告别手动部署在 Amazon EKS 上用 CodePipeline Argo CD 搭建 GitOps CI/CDK8s 应用部署还在手写 kubectl apply 脚本配置漂移查不出来回滚得翻半天 Git log亚马逊云科技官博最近发了一篇实战文章在中国区 EKS 上用 Code 家族CodeCommit CodePipeline CodeBuild Argo CD 搭一套完整的 GitOps CI/CD。代码一推镜像自动构建K8s 应用自动更新全程不用手动敲命令。这篇从痛点出发走一遍完整搭建流程。传统 CI/CD 的痛先说为什么要 GitOps。传统 K8s 部署流程这几个问题你一定遇过手动脚本出错难查deploy.sh 写了一堆 kubectl 命令哪天参数写错了排查半天配置漂移有人直接在集群里改了配置Git 里的和实际跑的不一样出问题了才发现回滚困难想回到上个版本得找到上次的镜像 tag、对应的 YAML 文件手动重新 apply权限混乱谁都能 kubectl 操作集群改了什么没有审计记录GitOps 的解法Git 仓库是唯一真相来源。所有变更走 GitArgo CD 自动同步到集群。方案架构开发者 → CodeCommit(代码仓库) ↓ (代码推送触发) CodePipeline(流水线编排) ↓ CodeBuild(构建镜像) → ECR(镜像仓库) ↓ (更新 manifest 仓库镜像版本) CodeCommit(清单仓库) ↓ (Argo CD 监控变更) Argo CD → EKS(自动部署/更新)两个 Git 仓库分开管代码仓库cicd-test-app业务代码 Dockerfile buildspec.yml清单仓库cicd-test-manifestsK8s deployment.yaml核心组件组件作用CodeCommit托管 Git 仓库代码变更的入口CodePipeline流水线编排串联 CI 各阶段CodeBuild构建容器镜像推送到 ECRECR私有镜像仓库Argo CDGitOps CD 工具监控清单仓库并同步到集群Amazon EKS托管 K8s 集群搭建步骤1. 创建 EKS 集群eksctl create cluster\--namegitops-demo\--regioncn-north-1\--nodegroup-name workers\--node-type t3.medium\--nodes22. 创建两个 CodeCommit 仓库# 应用代码仓库aws codecommit create-repository\--repository-name cicd-test-app# K8s 清单仓库aws codecommit create-repository\--repository-name cicd-test-manifests3. 准备应用代码示例用 Go 写一个简单 HTTP 服务packagemainimport(fmtlognet/httpos)constVersionv1.0.0funchandler(w http.ResponseWriter,r*http.Request){hostname,_:os.Hostname()fmt.Fprintf(w,Hello from EKS! Version: %s | Host: %s\n,Version,hostname)}funcmain(){http.HandleFunc(/,handler)http.HandleFunc(/health,func(w http.ResponseWriter,r*http.Request){w.WriteHeader(http.StatusOK)fmt.Fprint(w,OK)})log.Printf(Starting on :8080, version %s,Version)log.Fatal(http.ListenAndServe(:8080,nil))}Dockerfile多阶段构建最终镜像很小FROM public.ecr.aws/docker/library/golang:1.22-alpine AS builder WORKDIR /app COPY main.go . RUN go build -o server main.go FROM public.ecr.aws/docker/library/alpine:latest RUN apk --no-cache add ca-certificates COPY --frombuilder /app/server /root/ EXPOSE 8080 CMD [/root/server]4. 配置 CodeBuildbuildspec.ymlversion:0.2phases:pre_build:commands:-echo Logging in to ECR...-ECR_URI${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com.cn-aws ecr get-login-password|docker login--username AWS--password-stdin $ECR_URI-VERSION$(grep-oP const Version \K[^] main.go)build:commands:-docker build-t $IMAGE_REPO_NAME:$VERSION .-docker tag $IMAGE_REPO_NAME:$VERSION $ECR_URI/$IMAGE_REPO_NAME:$VERSIONpost_build:commands:-docker push $ECR_URI/$IMAGE_REPO_NAME:$VERSION-echo Build completed,image tag $VERSION5. 创建 CodePipeline在控制台创建 PipelineSource关联 CodeCommit 的 cicd-test-app 仓库Build选择 CodeBuild 项目触发条件代码推送到 main 分支自动触发6. 准备 K8s 清单deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:cicd-demonamespace:defaultspec:replicas:2selector:matchLabels:app:cicd-demotemplate:metadata:labels:app:cicd-demospec:containers:-name:appimage:ACCOUNT_ID.dkr.ecr.cn-north-1.amazonaws.com.cn/cicd-test-app:v1.0.0ports:-containerPort:8080livenessProbe:httpGet:path:/healthport:8080---apiVersion:v1kind:Servicemetadata:name:cicd-demo-svcspec:type:LoadBalancerselector:app:cicd-demoports:-port:80targetPort:80807. 部署 Argo CD# 安装 Argo CDkubectl create namespace argocd kubectl apply-nargocd-fhttps://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml# 获取初始密码kubectl-nargocd get secret argocd-initial-admin-secret-ojsonpath{.data.password}|base64-d# 暴露 UIkubectl port-forward svc/argocd-server-nargocd8080:4438. 配置 Argo CD 应用argocd app create cicd-demo\--repohttps://git-codecommit.cn-north-1.amazonaws.com.cn/v1/repos/cicd-test-manifests\--path.\--dest-server https://kubernetes.default.svc\--dest-namespace default\--sync-policy automated\--auto-prune\--self-heal关键参数--sync-policy automated检测到 Git 变更自动同步--auto-pruneGit 里删了的资源集群里也自动删--self-heal有人手动改了集群配置自动恢复到 Git 定义的状态实际工作流程应用发新版本改 main.go 里的 Version “v2.0.0”git push到 CodeCommitCodePipeline 自动触发 → CodeBuild 构建 v2.0.0 镜像 → 推送到 ECR更新清单仓库的 deployment.yaml 里的镜像 tagArgo CD 检测到清单变更 → 自动滚动更新 EKS 里的 Pod回滚也简单git revert清单仓库到上个 commitArgo CD 自动同步回旧版本。这套方案好在哪全自动化代码推送到应用上线分钟级完成不用手动操作配置不漂移--self-heal确保集群状态永远和 Git 一致回滚秒级Git revert 一下就行不用找旧镜像旧配置审计完整谁改了什么Git log 里全有权限收敛开发者只需要 Git 权限不需要直接访问 K8s 集群踩坑提醒中国区 ECR 域名是.amazonaws.com.cn不是.amazonaws.comIRSA 权限Argo CD 访问 CodeCommit 需要配 IRSAIAM Roles for Service Accounts别用明文密码镜像版本更新CodeBuild 构建完镜像后还需要更新清单仓库的 tag。可以在 buildspec 里加个 git push 步骤或者用 Argo CD Image Updater 自动检测新镜像Argo CD 同步频率默认 3 分钟棁查一次 Git 变更想更快可以配 webhook亚马逊云科技官博原文https://aws.amazon.com/cn/blogs/china/based-on-amazon-eks-using-code-argo-cd-build-gitops-cicd/Amazon EKShttps://aws.amazon.com/cn/eks/Argo CDhttps://argo-cd.readthedocs.io/CodePipelinehttps://aws.amazon.com/cn/codepipeline/

更多文章