端到端 AWS DevOps 项目:在 Amazon EKS 上自动构建和部署 Java 应用程序

2025-05-26

端到端 AWS DevOps 项目:在 Amazon EKS 上自动构建和部署 Java 应用程序

在本项目中,我们将使用 AWS 服务,在 Amazon Elastic Kubernetes Service (EKS) 上构建并部署一个 Java 应用程序,并利用持续集成和持续部署 (CI/CD) 管道。每个 AWS 组件都构成了可靠的 DevOps 工作流,因此本指南对于希望在 AWS 上构建可扩展解决方案的 DevOps 工程师来说非常有用。

目录

  1. 项目概述
  2. 先决条件
  3. 架构图
  4. 设置 GitHub 存储库
  5. 创建 Amazon ECR 存储库
  6. 设置 Amazon EKS 集群
  7. 构建和配置 CI/CD 管道
  8. 集成安全和通知服务
  9. 结论

项目概述

该项目旨在自动化基于 Java 的微服务应用程序的构建、测试和部署流程。利用 AWS 服务,我们将确保从代码提交到生产部署的整个流程可靠且安全。以下是我们将使用的 AWS 服务的概述:

  • GitHub:源代码库
  • AWS CodeBuild:用于构建和测试应用程序
  • AWS CodePipeline:协调 CI/CD
  • Amazon Elastic Container Registry(ECR):用于容器镜像存储
  • Amazon Elastic Kubernetes Service(EKS):用于部署应用程序
  • Amazon CodeGuru:用于代码质量分析
  • AWS Security Hub:监控安全漏洞
  • Amazon SNS:用于通知

先决条件

首先,您需要以下内容:

  1. 具有 ECR、EKS、CodePipeline、CodeBuild、Security Hub 和 SNS 权限的AWS 账户。
  2. 源代码的GitHub 存储库。
  3. Java 应用程序(最好是微服务应用程序)带有用于容器化的 Dockerfile。
  4. Docker 安装用于本地容器化任务。

架构图

下面是一个示例架构图,表示 AWS 上的 CI/CD 管道和部署环境:

图片描述


设置 GitHub 存储库

步骤 1:创建您的 GitHub 存储库

  1. 创建存储库

    • 登录 GitHub,创建一个新的存储库,并上传您的 Java 应用程序源代码。
  2. 添加 Dockerfile

    • 在项目的根目录中包含一个 Dockerfile 来定义 Java 应用程序的容器环境。
  3. 示例 Dockerfile

   FROM openjdk:11-jdk
   WORKDIR /app
   COPY . /app
   RUN ./gradlew build
   CMD ["java", "-jar", "build/libs/your-app.jar"]
Enter fullscreen mode Exit fullscreen mode
  1. 将 GitHub 与 AWS CodePipeline 集成

    • 导航到AWS CodePipeline并创建一个新的管道。
    • 对于源提供商,选择GitHub并授权 AWS 访问您的存储库。
    • 选择要监视更改的分支(例如,主要)。
  2. 创建 GitHub Webhook

    • 在 GitHub 中,前往“设置”>“Webhook”,并为存储库设置一个 Webhook。这样,CodePipeline 便会在推送到存储库时自动触发。

创建 Amazon ECR 存储库

Amazon Elastic Container Registry (ECR) 是一个完全托管的容器注册表。我们将在这里存储 Java 应用程序的 Docker 镜像。

  1. 创建 Amazon ECR 存储库
   aws ecr create-repository --repository-name my-java-app --region <your-region>
Enter fullscreen mode Exit fullscreen mode
  1. 使用 ECR 对 Docker 进行身份验证

    • 使用以下命令登录您的 ECR 注册表:
     aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
    
  2. 构建、标记和推送 Docker 镜像

    • 构建 Docker 镜像
     docker build -t my-java-app .
    
  • 标记图像

     docker tag my-java-app:latest <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
    
  • 将图像推送到 ECR

     docker push <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
    

设置 Amazon EKS 集群

Amazon Elastic Kubernetes Service (EKS) 在 AWS 上提供托管的 Kubernetes 集群,我们将使用它来部署和管理我们的应用程序容器。

步骤 1:创建 EKS 集群

  1. 创建EKS集群
   aws eks create-cluster --name my-eks-cluster --region <your-region> --kubernetes-version 1.21 --role-arn <eks-role-arn>
Enter fullscreen mode Exit fullscreen mode
  1. 设置工作节点

    • 使用EKS 控制台或 CLI 为您的集群设置工作节点(节点组)以运行应用程序 pod。
  2. 更新 kubeconfig

    • 更新本地 Kubernetes 配置以与 EKS 集群交互。
     aws eks update-kubeconfig --region <your-region> --name my-eks-cluster
    

步骤 2:在 EKS 上部署 Java 应用程序

  1. 创建 Kubernetes 部署 YAML
    • 定义一个deployment.yaml文件来指定Java应用程序的副本数、Docker镜像和其他配置。
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: my-java-app
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: my-java-app
     template:
       metadata:
         labels:
           app: my-java-app
       spec:
         containers:
         - name: my-java-app
           image: <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
           ports:
           - containerPort: 8080
Enter fullscreen mode Exit fullscreen mode
  1. 部署到EKS
   kubectl apply -f deployment.yaml
Enter fullscreen mode Exit fullscreen mode
  1. 创建负载均衡服务
    • 使用负载均衡器公开应用程序以供外部访问。
   apiVersion: v1
   kind: Service
   metadata:
     name: my-java-app-service
   spec:
     type: LoadBalancer
     selector:
       app: my-java-app
     ports:
       - protocol: TCP
         port: 80
         targetPort: 8080
Enter fullscreen mode Exit fullscreen mode
  1. 部署服务
   kubectl apply -f service.yaml
Enter fullscreen mode Exit fullscreen mode

构建和配置 CI/CD 管道

步骤 1:设置 CodePipeline

  1. 创建 CodePipeline 管道

    • 转到AWS CodePipeline并设置阶段:
      • 来源(GitHub)
      • 构建(CodeBuild)
      • 部署(EKS)
  2. 配置AWS CodeBuild

    • 为 CodeBuild定义一个buildspec.yml以构建 Docker 镜像并将其推送到 ECR。
   version: 0.2
   phases:
     install:
       runtime-versions:
         java: corretto11
     build:
       commands:
         - echo Building the Docker image...
         - docker build -t my-java-app .
         - docker tag my-java-app:latest <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
         - docker push <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
Enter fullscreen mode Exit fullscreen mode
  1. 在 CodePipeline 中设置部署阶段
    • 将 EKS 与 CodePipeline 集成以实现部署自动化。

第 2 步:自动化质量和安全检查

  1. 亚马逊CodeGuru

    • 将CodeGuru Reviewer与 GitHub集成,对每次提交执行代码质量检查。
  2. AWS 安全中心

    • 启用Security Hub来监控 AWS 资源中的安全漏洞。
  3. Amazon SNS 通知

    • 设置SNS以获取有关构建或部署失败或安全警报的通知:
   aws sns create-topic --name my-devops-notifications
   aws sns subscribe --topic-arn arn:aws:sns:<region>:<account-id>:my-devops-notifications --protocol email --notification-endpoint <your-email>
Enter fullscreen mode Exit fullscreen mode
  1. EventBridge 自动化规则
    • 创建 EventBridge 规则以根据 CodePipeline 或 Security Hub 事件触发特定操作(如 SNS 通知)。

结论

这个端到端项目提供了一套完整的 DevOps 解决方案,用于在 AWS 上构建和部署 Java 应用程序。通过使用 Code

我们通过 CI/CD 管道、容器存储 ECR 和部署 EKS 确保可扩展且可靠的运营。此外,CodeGuru、Security Hub 和 SNS 有助于维护代码质量、安全性和实时警报,使此设置稳健可靠,适用于企业。

👤 作者

横幅

加入我们的电报社区||在 GitHub 上关注我以获取更多 DevOps 内容!

文章来源:https://dev.to/prodevopsguytech/end-to-end-aws-devops-project-automate-java-application-build-and-deployment-on-amazon-eks-5al8
PREV
端到端 AWS DevOps 项目:使用 GitLab CI/CD 自动构建 Node.js 应用程序并将其部署到 Amazon ECS
NEXT
DevOps 项目 - 终极 CICD 企业 DevOps 管道项目 postgres 命令语法不正确,正确的 cmd 是