别再手动点发布按钮了!用Argo CD + Gitee + K8s,实现代码提交即部署的自动化流水线
从代码提交到生产发布基于Argo CD的GitOps自动化实践指南每次代码提交后你是否还在重复着构建、打包、上传、部署这一系列机械操作在Kubernetes时代我们完全可以通过GitOps工作流实现提交即发布的自动化体验。本文将带你用Argo CD构建一个与Gitee深度集成的自动化部署管道告别手动点击发布按钮的繁琐操作。1. 为什么选择Argo CD构建GitOps工作流在传统CI/CD流程中Jenkins等工具虽然实现了持续集成但部署环节往往仍需要人工干预。而基于GitOps理念的Argo CD则带来了完全不同的工作模式声明式配置所有部署定义都以YAML文件形式存储在Git仓库中真正做到基础设施即代码自动同步Argo CD会持续比较Git仓库中的期望状态与集群中的实际状态自动保持同步版本可控每个变更都对应Git中的一次提交可以轻松查看历史记录和回滚多环境管理通过不同Git分支或目录轻松管理开发、测试、生产等多套环境与传统的Jenkins流水线相比Argo CD最大的优势在于它的自愈能力。当集群中的配置被人为修改或意外变更时Argo CD会自动将其恢复到Git中定义的状态这种特性在复杂的Kubernetes环境中尤为重要。提示GitOps不是工具而是一种工作流程。Argo CD是目前实现GitOps理念最成熟的工具之一。2. 环境准备与Argo CD部署在开始之前我们需要准备以下基础设施Kubernetes集群可以是Minikube、Kind等本地开发集群也可以是生产环境的正式集群Gitee账号作为我们的Git仓库用于存储应用部署配置kubectl工具配置好对目标集群的访问权限2.1 部署Argo CD到Kubernetes集群Argo CD的部署非常简单它本身就是一组Kubernetes资源# 创建专用命名空间 kubectl create namespace argocd # 下载安装清单 wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml # 修改Service类型为NodePort以便外部访问 sed -i s/ClusterIP/NodePort/g install.yaml # 应用配置 kubectl apply -n argocd -f install.yaml部署完成后可以通过以下命令获取初始管理员密码kubectl -n argocd get secret argocd-initial-admin-secret \ -o jsonpath{.data.password} | base64 -d访问Argo CD的Web界面通过NodePort暴露的端口使用admin和上面获取的密码登录。2.2 配置Gitee仓库认证为了让Argo CD能够访问我们的Gitee仓库需要配置仓库认证在Argo CD Web界面点击Settings Repositories Connect Repo选择Via HTTPS方式填写Gitee仓库URL如果需要认证填写用户名和密码/Token点击Connect测试连接3. 构建自动化部署流水线现在我们已经有了运行中的Argo CD和配置好的Gitee仓库接下来构建完整的自动化工作流。3.1 准备应用部署配置在Gitee仓库中创建应用部署配置例如# myapp/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: registry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v1 ports: - containerPort: 8080# myapp/service.yaml apiVersion: v1 kind: Service metadata: name: myapp spec: ports: - port: 80 targetPort: 8080 selector: app: myapp3.2 在Argo CD中创建应用可以通过UI或CLI创建应用这里展示CLI方式argocd app create myapp \ --repo https://gitee.com/yourname/yourrepo.git \ --path myapp \ --dest-server https://kubernetes.default.svc \ --dest-namespace default创建后Argo CD会立即同步应用状态。你可以通过以下命令手动触发同步argocd app sync myapp3.3 配置Gitee Webhook实现自动同步为了实现真正的提交即部署我们需要配置Gitee的Webhook在Gitee仓库设置中找到WebHooks选项添加新的WebhookURL格式为https://argocd-server/api/webhook选择Push事件作为触发条件在Argo CD中为应用启用自动同步argocd app set myapp --sync-policy automated现在每次向Gitee仓库推送变更时Argo CD都会自动检测并同步这些变更到Kubernetes集群。4. 高级部署策略金丝雀发布对于生产环境直接全量更新可能存在风险。Argo Rollouts提供了高级部署策略支持如金丝雀发布。4.1 安装Argo Rolloutskubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml4.2 配置金丝雀发布修改部署配置使用Rollout资源apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: myapp spec: replicas: 5 strategy: canary: steps: - setWeight: 20 - pause: {duration: 1h} # 手动确认 - setWeight: 50 - pause: {duration: 1h} - setWeight: 100 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: registry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v2 ports: - containerPort: 80804.3 管理发布流程使用kubectl插件管理发布# 查看发布状态 kubectl argo rollouts get rollout myapp # 更新镜像触发新发布 kubectl argo rollouts set image myapp \ myappregistry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v3 # 手动继续下一步 kubectl argo rollouts promote myapp # 中止发布 kubectl argo rollouts abort myapp # 回滚到上一版本 kubectl argo rollouts undo myapp5. 生产环境最佳实践在实际生产环境中使用Argo CD时有几个关键点需要注意权限控制为不同团队配置适当的RBAC权限避免误操作资源隔离使用Argo CD的Project功能隔离不同环境或团队的应用健康检查配置适当的健康检查策略确保应用部署后真正可用通知集成集成Slack、Webhook等通知机制及时获取部署状态以下是一个典型的多环境管理方案环境Git分支同步策略自动部署开发dev自动是测试staging手动否生产main手动审批否在团队协作中建议采用以下工作流程开发者在特性分支修改部署配置创建Pull Request到dev分支CI系统运行验证合并后自动部署到开发环境测试通过后手动同步到生产环境