使用 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:
应用 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
应用程序代码驻留在一个代码仓库中,开发人员会在该仓库中进行每日代码检查,而 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
应用 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