在这个项目中,我们将在一个Amazon Elastic Kubernetes Service (EKS)上构建并部署一个Java应用程序,同时使用AWS服务,并使用持续集成与持续部署(CI/CD)管道。每个AWS组件都为可靠的DevOps工作流程贡献了自己的力量,因此,本指南对于想要在AWS上构建可扩展解决方案的DevOps工程师来说非常有用。
目录:此处省略内容
项目简介这个项目旨在为一个基于Java的微服务应用自动化构建、测试和部署流程。我们将利用AWS服务,确保从代码提交到生产部署的每一个环节都可靠且安全。以下是我们将要使用的AWS服务概览:
Amazon SNS : 用于发送通知
开始前,你需要以下几点:
以下是一个示例架构图,展示了代表 CI/CD 管道和部署的环境,如下所示,在 AWS 上:
在 GitHub 上登录,创建一个新的仓库,并上传你的 Java 应用源代码。
# 从 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"]
进入全屏 退出全屏
选择要监控更改的分支(例如 main 分支)。
在 GitHub 中,首先转到 设置 > Webhooks,然后设置仓库的 webhook。这使 CodePipeline 能够在任何代码推送时自动触发。
亚马逊ECR是一个完全管理的容器注册表。我们将在这里存放Java应用程序的Docker镜像文件。
aws ecr create-repository --repository-name my-java-app --region <输入您的区域> # 请将<输入您的区域>替换为您的具体区域,例如 "ap-northeast-1"
全屏模式, 退出全屏
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 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
docker push <account-id>.dkr.ecr.<region>.amazonaws.com/my-java-app:latest
在 AWS 上,Amazon 弹性 Kubernetes 服务 (EKS) 提供了一个托管的 Kubernetes 集群,我们将用它来部署和管理应用容器。
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.
全屏 退出全屏
使用 EKS 控制台 或 CLI 设置您的集群以运行应用 Pod 的工作节点组。
aws eks update-kubeconfig --region <your-region> --name my-eks-cluster
更新 Kubernetes 配置上下文以使用指定的 AWS EKS 集群时,可以使用上面的命令。请注意,<your-region>
和 my-eks-cluster
是需要根据实际情况填写的占位符,分别代表您的区域和 EKS 集群名称。
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 # 容器端口
点击全屏模式 点击退出全屏模式
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
点击这里切换到或退出全屏模式
进入AWS CodePipeline并设置各阶段:
源阶段(GitHub)
构建阶段(CodeBuild)
部署阶段(EKS)
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
全屏,退出全屏
将 CodeGuru Reviewer 与 GitHub 进行集成,用来对每个提交进行代码质量检查。
启用Security Hub来监控AWS资源的安全漏洞。
运行以下命令来创建一个名为 '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>`.
点击此处切换到全屏 点击此处退出全屏
此项目提供了在AWS上构建和部署Java应用程序的完整DevOps解决方案,通过使用Code...(此处应补充具体使用的代码或工具名称,例如CodeCommit、CodePipeline等)。
CI/CD 管道、ECR 用于容器存储以及使用 EKS 进行部署,我们确保操作的可扩展性和可靠性。此外,CodeGuru、Security Hub 和 SNS 分别帮助我们保持代码质量、确保安全和提供实时警报,使这套方案既稳健又符合企业需求。
加入我们的Telegram社区或在GitHub关注我获取更多关于DevOps的内容!