基于AWS的Java应用持续集成与持续部署全流程指南:从构建到部署在Amazon EKS上运行
在这个项目中,我们将在一个Amazon Elastic Kubernetes Service (EKS)上构建并部署一个Java应用程序,同时使用AWS服务,并使用持续集成与持续部署(CI/CD)管道。每个AWS组件都为可靠的DevOps工作流程贡献了自己的力量,因此,本指南对于想要在AWS上构建可扩展解决方案的DevOps工程师来说非常有用。
目录:- 项目概览
- 所需条件
- 架构图示
- 创建 GitHub 仓库
- 创建 Amazon ECR 存储库
- 构建 Amazon EKS 集群
- 构建并配置 CI/CD 流水线
- 集成安全与通知服务
- 总结
此处省略内容
项目简介这个项目旨在为一个基于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 : 用于发送通知
-
- *
此处省略了部分内容
- *
开始前,你需要以下几点:
- 具有 ECR、EKS、CodePipeline、CodeBuild、Security Hub 和 SNS 权限的 AWS 账户。
- 用于存放源代码的 GitHub 仓库。
- Java 应用程序(最好是微服务架构的应用),包含 Dockerfile,用于容器化。
- 本地安装了 Docker,用于本地容器化任务。
来看看架构图吧
以下是一个示例架构图,展示了代表 CI/CD 管道和部署的环境,如下所示,在 AWS 上:
设置:搭建 GitHub 代码库
第一步:创建您的 GitHub 存储库
- 创建一个代码库:
-
在 GitHub 上登录,创建一个新的仓库,并上传你的 Java 应用源代码。
- 添加一个 Dockerfile :
- 在项目的根目录中加入一个 Dockerfile,以定义您 Java 应用程序的容器环境。
- 示例 Dockerfile
# 从 openjdk:11-jdk 镜像创建一个新的容器
FROM openjdk:11-jdk
# 设置工作目录为/app
WORKDIR /app
# 将当前目录复制到容器内的/app目录
COPY . /app
# 运行gradlew构建命令
RUN ./gradlew build
# 设置容器启动时默认执行的命令
CMD ["java", "-jar", "build/libs/your-app.jar"]
进入全屏 退出全屏
- 将 GitHub 与 AWS CodePipeline 结合起来:
- 导航到 AWS CodePipeline,然后创建一个新的管道。
- 选择 GitHub 作为源提供商,并授权 AWS 访问您的仓库。
-
选择要监控更改的分支(例如 main 分支)。
- 创建 GitHub Webhook :
-
在 GitHub 中,首先转到 设置 > Webhooks,然后设置仓库的 webhook。这使 CodePipeline 能够在任何代码推送时自动触发。
-
- *
亚马逊ECR是一个完全管理的容器注册表。我们将在这里存放Java应用程序的Docker镜像文件。
- 创建一个Amazon ECR容器镜像仓库(或简称ECR仓库):
aws ecr create-repository --repository-name my-java-app --region <输入您的区域> # 请将<输入您的区域>替换为您的具体区域,例如 "ap-northeast-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
使用 AWS CLI 获取密码并登录 Docker 仓库。上述命令用于从 AWS ECR 获取登录密码并通过 Docker 登录 ECR 仓库。
- 构建Docker镜像,打上标签并推送
- 构建Docker图
运行以下命令来构建Docker镜像:
docker build -t my-java-app .
这将构建一个名为my-java-app的Docker镜像.
- 给图片打标签:
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 集群: 集群
在 AWS 上,Amazon 弹性 Kubernetes 服务 (EKS) 提供了一个托管的 Kubernetes 集群,我们将用它来部署和管理应用容器。
步骤 1:创建一个 EKS集群
- 创建一个EKS集群实例:
aws eks create-cluster --name my-eks-cluster --region <your-region> --kubernetes-version 1.21 --role-arn <eks-role-arn>
# your-region 请替换为您的区域, eks-role-arn 请替换为eks角色arn.
全屏 退出全屏
- 搭建工作节点(Worker Nodes):
-
使用 EKS 控制台 或 CLI 设置您的集群以运行应用 Pod 的工作节点组。
- 更新 kubeconfig
- 更新你在本地的 Kubernetes 配置,以便与 EKS 集群交互。
aws eks update-kubeconfig --region <your-region> --name my-eks-cluster
更新 Kubernetes 配置上下文以使用指定的 AWS EKS 集群时,可以使用上面的命令。请注意,<your-region>
和 my-eks-cluster
是需要根据实际情况填写的占位符,分别代表您的区域和 EKS 集群名称。
部署 Java 应用到 EKS
- 创建 Kubernetes 部署的 YAML 文件:
- 定义一个
deployment.yaml
文件,指定副本数量、要使用的 Docker 镜像及其他 Java 应用程序的其他配置。
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 # 容器端口
点击全屏模式 点击退出全屏模式
- 部署到 EKS 上
kubectl apply -f deployment.yaml (执行此命令以应用部署配置)
全屏模式 退出全屏
- 创建一个负载均衡器服务:
- 让应用程序通过负载均衡器对外暴露,使得外部可以访问。
apiVersion: api版本
kind: 类型: 服务
metadata:
name: 名称: my-java-app-service
spec:
type: 规范:
类型: 负载均衡器
selector:
app: 选择器:
应用: my-java-app
ports:
- protocol: 端口:
协议: TCP
port: 端口: 80
targetPort: 目标端口: 8080
以下是用于my-java-app服务的Kubernetes服务配置。
请进入全屏 请退出全屏
- 部署服务:
运行以下命令来应用 service.yaml
文件:
kubectl apply -f service.yaml
点击这里切换到或退出全屏模式
构建和配置 CI/CD 流水线
步骤 1:设置 CodePipeline
- 创建CodePipeline流水线,
-
进入AWS CodePipeline并设置各阶段:
-
源阶段(GitHub)
-
构建阶段(CodeBuild)
-
部署阶段(EKS)
- 配置好**CodeBuild**:
- 定义一个
buildspec.yml
文件来让 CodeBuild 构建 Docker 镜像并推送到 ECR。
version: 0.2
phases:
install:
runtime-versions:
java: corretto11
build:
commands:
- echo 正在构建 Docker 镜像。\n
- 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
全屏,退出全屏
- 在CodePipeline中设置部署阶段(或步骤):
- 将EKS集成到CodePipeline中,以实现自动化部署。
步骤 2:自动化的质量和安全检查.
- Amazon CodeGuru :
-
将 CodeGuru Reviewer 与 GitHub 进行集成,用来对每个提交进行代码质量检查。
- AWS Security Hub
-
启用Security Hub来监控AWS资源的安全漏洞。
- Amazon SNS通知:
- 设置 SNS 以接收构建或部署失败,或安全漏洞警报的通知:
运行以下命令来创建一个名为 'my-devops-notifications' 的主题:
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>
请替换 `<region>` 和 `<account-id>` 为你的实际值, 并用你的实际电子邮件地址替换 `<your-email>`.
点击此处切换到全屏 点击此处退出全屏
- EventBridge 规则自动化:
- 创建 EventBridge 规则,以便基于 CodePipeline 或 Security Hub 事件触发特定操作,例如发送 SNS 通知。
最后
此项目提供了在AWS上构建和部署Java应用程序的完整DevOps解决方案,通过使用Code...(此处应补充具体使用的代码或工具名称,例如CodeCommit、CodePipeline等)。
CI/CD 管道、ECR 用于容器存储以及使用 EKS 进行部署,我们确保操作的可扩展性和可靠性。此外,CodeGuru、Security Hub 和 SNS 分别帮助我们保持代码质量、确保安全和提供实时警报,使这套方案既稳健又符合企业需求。
作者:
加入我们的Telegram社区或在GitHub关注我获取更多关于DevOps的内容!
共同学习,写下你的评论
评论加载中...
作者其他优质文章