使用 GitHub Actions 和 ArgoCD 将应用程序部署到 EKS:最佳实践和技术

2025-06-08

使用 GitHub Actions 和 ArgoCD 将应用程序部署到 EKS:最佳实践和技术

在本篇博文中,我们将探讨如何将 GitHub Actions 与 ArgoCD 集成,将应用程序部署到 Amazon Elastic Kubernetes Service (EKS)。我们将介绍简化 CI/CD 流程的基本实践和技术。

介绍

部署应用程序涉及多个阶段:构建、测试和部署代码。GitHub Actions 和 ArgoCD 是功能强大的工具,可以简化此流程,尤其是在与 Amazon EKS 等 Kubernetes 环境配合使用时。

为什么要对 EKS 使用 GitHub Actions 和 ArgoCD?

GitHub Actions:提供一种灵活且集成的方式,可直接在 GitHub 存储库中定义 CI/CD 工作流程。

ArgoCD:Kubernetes 的 GitOps 持续交付工具。它确保将 Git 存储库中定义的应用程序所需状态部署到 Kubernetes 集群。

Amazon EKS:一种托管的 Kubernetes 服务,可轻松在 AWS 上运行 Kubernetes,而无需安装和操作您自己的 Kubernetes 控制平面或节点。

先决条件

为了充分利用本文,您应该熟悉:

  • 在 GitHub 上创建存储库
  • 连接本地存储库与远程存储库
  • 如何使用 Git 进行版本控制
  • Kubernetes 的先验知识
  • 访问AWS控制台

设置您的环境

Amazon EKS 集群

创建 EKS 集群:

  • 使用 AWS 管理控制台、CLI 或基础设施即代码 (IaC) 工具(如 Terraform)来配置您的 EKS 集群。
  • 确保集群配置了适当的节点组和 IAM 角色。

安装并配置 kubectl:

  • 安装 kubectl 并将其配置为与您的 EKS 集群交互。

aws eks update-kubeconfig --name your-cluster-name

ArgoCD 安装

在 EKS 上安装 ArgoCD:

  • 为 ArgoCD 创建一个命名空间。

kubectl create namespace argocd

  • 使用下面的方法应用 ArgoCD 清单

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

  • 此命令将 ArgoCD 的所有必要组件部署到 argocd 命名空间下的 EKS 集群中

访问 ArgoCD UI:

  • 默认情况下,argoCD api 服务器不通过外部 IP 暴露。您可以使用端口转发来访问 ArgoCD UI。
  • 端口转发 ArgoCD API 服务器以访问 Web UI。

kubectl port-forward svc/argocd-server -n argocd 8080:443

  • 您现在可以通过以下方式访问 ArgoCD:

https://localhost:8080

登录 ArgoCD:

  • 检索初始管理员密码并登录。
  • 管理员帐户的初始密码是自动生成的,并存储在名为 argo-cd-initial-admin-secret 的 Kubernetes 机密中:

kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d ; echo

  • 使用它登录 ArgoCD UI。

将 ArgoCD 与 git 存储库连接起来

  • 要从 Argo UI 将 ArgoCD 与 git 仓库连接起来,我们需要添加项目名称、git 仓库 URL、用户名和密码。以下是 ArgoCD UI 连接 GIT 仓库的截图

图片描述

图片描述

设置 ArgoCD 应用程序

部署您的 ArgoCD 应用程序:

  • 现在 ArgoCD 已设置完毕并已连接到 Github,您可以部署您的第一个应用程序了。请创建一个 YAML 文件,其中包含应用程序清单。示例 YAML 文件:
   apiVersion: argoproj.io/v1alpha1
   kind: Application
   metadata:
     name: your-app-name
     namespace: argocd
   spec:
     project: default
     source:
       repoURL: https://github.com/your-org/your-repo
       path: manifests
       targetRevision: HEAD
    destination:
       server: https://kubernetes.default.svc
       namespace: default
    syncPolicy:
      automated:
        prune: true
        selfHeal: true
    ignoreDifferences: 
Enter fullscreen mode Exit fullscreen mode

应用 ArgoCD 应用程序

  • 将应用程序资源部署到您的集群。

    kubectl apply -f your-application.yaml

设置 CI/CD 管道

创建并配置您的 GitHub 存储库
创建一个新的存储库:

  • 存储您的应用程序代码和配置文件。存储 Kubernetes 清单:
  • 确保您的 Kubernetes 部署文件(例如,deployment.yaml、service.yaml、values.yaml)位于存储库中。

定义 GitHub Actions 工作流程

工作流程在存储在存储库的 .github/workflows 目录中的 YAML 文件中定义。创建一个新的工作流程文件。

工作流程示例:

name: CI/CD Pipeline
on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm test
      - name: Build application
        run: npm run build
      - name: docker build
        run: docker build -t . 
      - name: docker push
        run: docker push ecr.aws.amazonaws.com/your-repo-name:latest
Pushtoargorepo:
   runs-on: ubuntu-latest
    steps:
      - name: Checkout helm repo
        uses: actions/checkout@v2
      - name: update values.yaml
        run: |
          echo "image: ecr.aws.amazonaws.com/your-repo-name:latest" >> helm/values.yaml  
      - name: push to argo repo
        run: |
          git commands to commit and push the changes to the helmrepo
Enter fullscreen mode Exit fullscreen mode

应用程序代码驻留在一个代码仓库中,开发人员会在该仓库中进行每日代码检查,而 Helm Chart 则保存在 GitOps 仓库中。上述工作流程构建应用程序并使用 ArgoCD 更新部署所需的 Helm 值。ArgoCD
与 Helm 仓库集成,因此每当 Helm 文件有更新时,ArgoCD 都会将更改同步到 Kubernetes。

EKS 部署的 GitOps 流程

图片描述

与其他 CI/CD 工具相比,GitHub Actions 和 ArgoCD 的优势

GitHub Actions

  • GitHub Actions 提供了一个平台,可以直接在仓库中自动化、自定义和执行软件开发工作流程。它允许你
  • 自动化整个 CI/CD 流程
  • 为不同的开发阶段创建自定义工作流程
  • 通过庞大的预构建操作市场与其他工具和服务集成

ArgoCD

  • 多集群支持:ArgoCD 可以管理多个 Kubernetes 集群,使其成为具有复杂、多云或混合云环境的企业的理想选择。

  • 自我修复:通过自动同步,ArgoCD 可以检测期望状态和实际状态之间的偏差并自动纠正,从而提高可靠性并减少停机时间。

选择 GitHub Actions 和 ArgoCD 的安全原因

Github Actions

  • 加密存储:机密信息在静止和传输过程中均经过加密,确保敏感信息免遭未经授权的访问

  • 范围访问:机密可以限定在存储库、组织或环境中,从而对谁和什么可以访问它们进行精细控制。

ArgoCD

  • 这款持续交付工具会从远程 Git 代码库拉取更改。因此,您无需定义防火墙规则和 VPC 对等连接即可让部署服务器连接到集群,从而减少了一个入口点。它显著减少了开发/质量保证/生产服务器的受攻击面。

  • TLS 加密:ArgoCD 服务器与其组件之间的所有通信都使用 TLS 加密。

  • 持续监控:检测并纠正与期望状态的偏差,降低集群中持续存在未经授权的更改的风险。

最佳实践

  • 版本控制一切:将所有配置文件和 Kubernetes 清单置于版本控制之下,以跟踪更改并保持一致性。
  • 模块化工作流程:将工作流程分解为更小的可重复使用的组件,以提高可维护性和可读性。
  • 资源管理:在 Kubernetes 清单中定义资源限制和请求,以确保最佳地使用集群资源。
  • 安全的密钥和凭证:将 AWS 凭证和 ArgoCD 密码等敏感信息安全地存储在 GitHub Secrets 中。避免在配置文件中硬编码密钥。

增强型 CI/CD 技术

  • 并行作业执行:利用 GitHub Actions 中的并行作业来加快 CI 进程。
  • 条件工作流:实现条件逻辑以根据分支名称、标签或其他标准运行特定工作流。
  • 通知集成:将通知与 Slack 或其他通信工具集成,以随时了解 CI/CD 管道的状态。
  • 回滚机制:实施回滚策略,以便在部署失败时恢复到稳定状态。

克服挑战

挑战:从 ArgoCD 向 Slack 频道发送通知

故事:在实施 CI/CD 流水线的过程中,我们意识到让团队随时了解部署状态的重要性。最初,当 Pod 使用最新代码启动并运行后,我们很难向 Slack 频道发送通知。

解决方案:为了解决这个问题,我们使用 webhook 通知将 ArgoCD 与 Slack 集成。我们将 ArgoCD 配置为在应用程序同步成功后向指定的 Slack 频道发送通知,表明 pod 已使用最新代码更新。

实现 Slack 通知的步骤:

创建 Slack 应用程序:

  • 转到 Slack API 网站并创建一个新的 Slack 应用程序。
  • 向您的 Slack 应用程序添加一个 webhook 并配置 webhook URL。

配置 ArgoCD 通知:

  • 在您的 Kubernetes 集群中安装 ArgoCD 通知控制器。
  • 创建一个 ConfigMap 来定义通知模板和 Slack webhook。

ConfigMap 示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  notifications.yaml: |
    triggers:
      - name: on-sync-succeeded
        condition: app.status.operationState.phase == 'Succeeded'
        template: app-sync-succeeded

    templates:
      - name: app-sync-succeeded
        title: Application {{.app.metadata.name}} sync succeeded
        body: |
          Application {{.app.metadata.name}} in namespace {{.app.metadata.namespace}} was successfully synced.

    subscriptions:
      - recipients:
          - slack:your-slack-webhook-url
Enter fullscreen mode Exit fullscreen mode

应用 ConfigMap:

  • 使用 kubectl 将 ConfigMap 应用到您的 Kubernetes 集群。
  • 将上述 YAML 数据保存在文件(filename.yaml)中,然后在集群中的 argocd 命名空间的终端中运行以下命令。

kubectl apply -f filename.yaml

测试通知:

  • 触发部署并验证同步成功后是否向您的 Slack 频道发送通知。

结论

利用 GitHub Actions 和 ArgoCD,您可以创建强大的 CI/CD 管道,将应用程序部署到 Amazon EKS。遵循最佳实践并运用先进技术,将确保应用程序部署高效、可靠且安全。

进一步阅读

https://docs.github.com/en/actions
https://helm.sh/docs/
https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html

链接:https://dev.to/devsatasurion/deploying-applications-with-github-actions-and-argocd-to-eks-best-practices-and-techniques-4epc
PREV
作为 CSS 开发人员你应该知道的 15 个省时网站
NEXT
使用这个简单的 Bash 脚本自动化您的 Git 工作流程 GenAI LIVE!| 2025 年 6 月 4 日