在 Amazon 上部署示例 Java 微服务EKS并使用应用程序负载均衡器公开该微服务 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon 上部署示例 Java 微服务EKS并使用应用程序负载均衡器公开该微服务

由 Vijay Thompson (AWS) 和 Akkamahadevi Hiremath () 创作 AWS

摘要

此模式描述了如何eksctl使用命令行实用程序和亚马逊弹性容器注册表 (亚马逊) 将示例 Java 微服务作为容器化应用程序部署到亚马逊 Elastic Kubernetes Service EKS (Amazon) 上。ECR您可以使用应用程序负载均衡器均衡应用程序流量。

先决条件和限制

先决条件

  • 一个活跃的AWS账户

  • AWS命令行界面 (AWSCLI) 版本 1.7 或更高版本,已在 macOS、Linux 或 Windows 上安装和配置

  • 正在运行的 Docker 进程守护程序

  • 在 macOS、Linux 或 Windows 上安装和配置的eksctl命令行实用程序(有关更多信息,请参阅亚马逊文档中的亚马逊入门 EKS — eksc tl。)EKS

  • 在 macOS、Linux 或 Windows 上安装和配置的kubectl命令行实用程序(有关更多信息,请参阅亚马逊文档中的安装或更新 kubec tl。)EKS

限制

  • 此模式不包括为 Application Load Balancer 安装SSL证书。

架构

目标技术堆栈

  • Amazon ECR

  • Amazon EKS

  • Elastic Load Balancing

目标架构

下图显示了在 Amazon 上对 Java 微服务进行容器化的架构。EKS

作为容器化应用程序部署在 Amazon 上的 Java 微服务。EKS

工具

  • Amazon Elastic Container Registry (AmazonECR) 是一项安全、可扩展且可靠的托管容器镜像注册服务。

  • 亚马逊 Elastic Kubernetes Servic EKS e(亚马逊)可帮助你在上面运行 AWS Kubernetes,而无需安装或维护自己的 Kubernetes 控制平面或节点。

  • AWSCommand Line Interface (AWSCLI) 是一个开源工具,可帮助您通过命令行外壳中的命令与AWS服务进行交互。

  • Elastic L oad Balancing 会自动将您的传入流量分配到一个或多个可用区域中的多个目标,例如亚马逊弹性计算云 (AmazonEC2) 实例、容器和 IP 地址。

  • eksctl 可以帮助你在亚马逊上创建集群。EKS

  • kubectl 使对 Kubernetes 集群运行命令成为可能。

  • Docker 帮助您在名为容器的软件包中构建、测试和交付应用程序。

操作说明

任务描述所需技能

创建亚马逊EKS集群。

要创建使用两个 t2.small Amazon EC2 实例作为节点的亚马逊EKS集群,请运行以下命令:

eksctl create cluster --name <your-cluster-name> --version <version-number> --nodes=1 --node-type=t2.small
注意

该过程可能需要 15 到 20 分钟。创建集群后,相应的 Kubernetes 配置将添加至您的 kubeconfig 文件中。您可将该 kubeconfig 文件与 kubectl 一起使用,以便在后续步骤中部署应用程序。

开发人员、系统管理员

验证 Amazon EKS 集群。

要验证集群是否已创建并且您可连接到该集群,请运行 kubectl get nodes 命令。

开发人员、系统管理员
任务描述所需技能

创建亚马逊ECR存储库。

按照 Amazon ECR 文档中创建私有存储库中的说明进行操作。

开发人员、系统管理员

创建POMXML文件。

根据此模式的 “其他信息” 部分中的示例POM文件代码创建文件。pom.xml

开发人员、系统管理员

创建源文件。

根据以下示例,按 src/main/java/eksExample 路径创建名为 HelloWorld.java 的源文件。

package eksExample; import static spark.Spark.get; public class HelloWorld { public static void main(String[] args) { get("/", (req, res) -> { return "Hello World!"; }); } }

请确保采用以下目录结构:

├── Dockerfile ├── deployment.yaml ├── ingress.yaml ├── pom.xml ├── service.yaml └── src └── main └── java └── eksExample └── HelloWorld.java

创建 Dockerfile。

根据此模式的其他信息部分中的示例 Dockerfile代码创建 Dockerfile

开发人员、系统管理员

构建和推送 Docker 映像。

在您想要构建、标记映像并将其推送Dockerfile到 Amazon 的目录中ECR,运行以下命令:

aws ecr get-login-password --region <region>| docker login --username <username> --password-stdin <account_number>.dkr.ecr.<region>.amazonaws.com docker buildx build --platform linux/amd64 -t hello-world-java:v1 . docker tag hello-world-java:v1 <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1 docker push <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1
注意

在上述命令中修改AWS区域、账号和存储库详细信息。请务必记下图片以URL备日后使用。

重要

搭载 M1 芯片的 macOS 系统在构建与在平台上EKS运行的 Amazon 兼容的映像时出现问题。AMD64要解决此问题,请使用 docker buildx 构建可在亚马逊上运行的 Docker 镜像。EKS

任务描述所需技能

创建部署文件。

deployment.yaml根据此模式YAML的 “其他信息” 部分中的示例部署文件代码创建一个名为的文件。

注意

使用您之前复制URL的图像作为 Amazon ECR 存储库的图像文件路径。

开发人员、系统管理员

在亚马逊EKS集群上部署 Java 微服务。

要在您的 Amazon EKS 集群中创建部署,请运行kubectl apply -f deployment.yaml命令。

开发人员、系统管理员

验证容器组(pod)的状态。

  1. 要验证容器组(pod)的状态,请运行 kubectl get pods 命令。

  2. 等待状态更改为就绪

开发人员、系统管理员

创建服务。

  1. 根据此模式的其他信息部分中的示例服务文件代码创建名为 service.yaml的文件。

  2. 运行 kubectl apply -f service.yaml命令。

开发人员、系统管理员

安装 Loa AWS d Balancer 控制器插件。

按照亚马逊EKS文档中安装 Loa AWS d Balancer 控制器附加组件中的说明进行操作。

注意

必须安装插件才能为 Kubernetes 服务创建应用程序负载均衡器或网络负载均衡器。

开发人员、系统管理员

创建入口资源。

ingress.yaml根据此模式YAML的 “其他信息” 部分中的示例入口资源文件代码创建一个名为的文件。

开发人员、系统管理员

创建应用程序负载均衡器。

要部署入口资源并创建应用程序负载均衡器,请运行 kubectl apply -f ingress.yaml 命令。

开发人员、系统管理员
任务描述所需技能

测试和验证应用程序。

  1. 要从ADDRESS字段中获取负载均衡器的DNS名称,请运行kubectl get ingress.networking.k8s.io/java-microservice-ingress命令。

  2. 在与您的 Amazon EKS 节点VPC相同的EC2实例上,运行该curl -v <DNS address from previous command>命令。

开发人员、系统管理员

相关资源

其他信息

示例POM文件

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>helloWorld</groupId> <artifactId>helloWorld</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.sparkjava</groupId><artifactId>spark-core</artifactId><version>2.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version> <configuration><finalName>eksExample</finalName><archive><manifest> <addClasspath>true</addClasspath><mainClass>eksExample.HelloWorld</mainClass><classpathPrefix>dependency-jars/</classpathPrefix> </manifest></archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version> <configuration><source>1.8</source><target>1.8</target></configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <goals><goal>attached</goal></goals><phase>package</phase> <configuration> <finalName>eksExample</finalName> <descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs> <archive><manifest><mainClass>eksExample.HelloWorld</mainClass></manifest></archive> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>

Dockerfile 示例

FROM bellsoft/liberica-openjdk-alpine-musl:17 RUN apk add maven WORKDIR /code # Prepare by downloading dependencies ADD pom.xml /code/pom.xml RUN ["mvn", "dependency:resolve"] RUN ["mvn", "verify"] # Adding source, compile and package into a fat jar ADD src /code/src RUN ["mvn", "package"] EXPOSE 4567 CMD ["java", "-jar", "target/eksExample-jar-with-dependencies.jar"]

部署文件示例

apiVersion: apps/v1 kind: Deployment metadata: name: microservice-deployment spec: replicas: 2 selector: matchLabels: app.kubernetes.io/name: java-microservice template: metadata: labels: app.kubernetes.io/name: java-microservice spec: containers: - name: java-microservice-container image: .dkr.ecr.amazonaws.com/: ports: - containerPort: 4567

示例服务文件

apiVersion: v1 kind: Service metadata: name: "service-java-microservice" spec: ports: - port: 80 targetPort: 4567 protocol: TCP type: NodePort selector: app.kubernetes.io/name: java-microservice

入口资源文件示例

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: "java-microservice-ingress" annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/load-balancer-name: apg2 alb.ingress.kubernetes.io/target-type: ip labels: app: java-microservice spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: "service-java-microservice" port: number: 80