

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

# 在 Amazon EKS 上部署示例 Java 微服务并使用应用程序负载均衡器公开该微服务
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer"></a>

*Vijay Thompson 和 Akkamahadevi Hiremath，Amazon Web Services*

## Summary
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-summary"></a>

此模式描述如何使用 `eksctl` 命令行实用程序和 Amazon Elastic Container Registry (Amazon ECR) 将示例 Java 微服务部署为 Amazon Elastic Kubernetes Service (Amazon EKS) 上的容器化应用程序。您可以使用应用程序负载均衡器均衡应用程序流量。

## 先决条件和限制
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ AWS 命令行界面（AWS CLI）版本 1.7 或更高版本，已在 macOS、Linux 或 Windows上安装和配置。
+ 正在运行的 [Docker 进程守护程序](https://docs.docker.com/config/daemon/)
+ 在 macOS、Linux 或 Windows 上安装和配置的 `eksctl` 命令行实用程序（有关更多信息，请参阅 Amazon EKS 文档中的 [Amazon EKS 入门 — eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html)。）
+ 在 macOS、Linux 或 Windows 上安装和配置的`kubectl`命令行实用程序（有关更多信息，请参阅 Amazon EKS 文档中的[安装或更新 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。）

**限制**
+ 此模式不包括为应用程序负载均衡器安装 SSL 证书。

## 架构
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-architecture"></a>

**目标技术堆栈**
+ Amazon ECR
+ Amazon EKS
+ Elastic Load Balancing

**目标架构**

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

![\[将 Java 微服务部署为 Amazon EKS 上的容器化应用程序。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/e1dd8ab0-9e1e-4d2b-b7af-89d3e583e57c/images/aaca4fd9-5aaa-4df5-aebd-02a2ed881c3b.png)


## 工具
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-tools"></a>
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一项安全、可扩展且可靠的托管容器映像注册表服务。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可帮助您在 AWS 上运行 Kubernetes，而无需安装或维护您自己的 Kubernetes 控制面板或节点。
+ [AWS 命令行界面（AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)是一种开源工具，它可帮助您通过命令行 Shell 中的命令与 Amazon Web Services 交互。
+ [Elastic L](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) oad Balancing 会自动将您的传入流量分配到一个或多个可用区域中的多个目标，例如亚马逊弹性计算云 (Amazon EC2) 实例、容器和 IP 地址。
+ [eksctl](https://eksctl.io/) 可以帮助您在Amazon EKS 上创建集群。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) 使对 Kubernetes 集群运行命令成为可能。
+ [Docker](https://www.docker.com/) 帮助您在名为容器的软件包中构建、测试和交付应用程序。

## 操作说明
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-epics"></a>

### 使用 eksctl 创建 Amazon EKS 集群
<a name="create-an-amazon-eks-cluster-by-using-eksctl"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个 Amazon EKS 集群。 | 要创建使用两个 t2.small Amazon EC2 实例作为节点的 Amazon EKS 集群，请运行以下命令：<pre>eksctl create cluster --name <your-cluster-name> --version <version-number> --nodes=1 --node-type=t2.small</pre>该过程可能需要 15 到 20 分钟。创建集群后，相应的 Kubernetes 配置将添加至您的 [kubeconfig](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html) 文件中。您可将该 `kubeconfig` 文件与 `kubectl` ****一起使用，以便在后续步骤中部署应用程序。 | 开发人员、系统管理员 | 
| 验证 Amazon EKS 集群。 | 要验证集群是否已创建并且您可连接到该集群，请运行 `kubectl get nodes` 命令。 | 开发人员、系统管理员 | 

### 创建 Amazon ECR 存储库并推送 Docker 映像。
<a name="create-an-amazon-ecr-repository-and-push-the-docker-image"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Amazon ECR 存储库。 | 请遵循 Amazon ECR 文档中的[创建私有存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)的说明操作。 | 开发人员、系统管理员 | 
| 创建 POM XML 文件。 | 根据此模式的[其他信息](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)部分中的*示例 POM 文件*代码创建 `pom.xml` 文件。 | 开发人员、系统管理员 | 
| 创建源文件。 | 根据以下示例，按 `src/main/java/eksExample` 路径创建名为 `HelloWorld.java` 的源文件。<pre>package eksExample;<br />import static spark.Spark.get;<br /><br />public class HelloWorld {<br />    public static void main(String[] args) {<br />        get("/", (req, res) -> {<br />            return "Hello World!";<br />        });<br />    }<br />}</pre>请确保采用以下目录结构：<pre>├── Dockerfile<br />├── deployment.yaml<br />├── ingress.yaml<br />├── pom.xml<br />├── service.yaml<br />└── src<br />    └── main<br />        └── java<br />            └── eksExample<br />                └── HelloWorld.java</pre> |  | 
| 创建 Dockerfile。 | 根据此模式的[其他信息](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)部分中的*示例 Dockerfile*代码创建 `Dockerfile`。 | 开发人员、系统管理员 | 
| 构建和推送 Docker 映像。 | 在您想要 `Dockerfile` 构建、标记映像并将其推送至 Amazon ECR 的目录中，运行以下命令：<pre>aws ecr get-login-password --region <region>| docker login --username <username> --password-stdin <account_number>.dkr.ecr.<region>.amazonaws.com<br />docker buildx build --platform linux/amd64 -t hello-world-java:v1 .<br />docker tag hello-world-java:v1 <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1<br />docker push <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1</pre>在上述命令中修改 AWS 区域 、账号和存储库详细信息。请务必记下图片网 URL，以备日后使用。搭载 M1 芯片的 macOS 系统在构建与平台上运行的 Amazon EKS 兼容的映像时出现问题。 AMD64 要解决此问题，请使用 [docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/)构建可在 Amazon EKS 上运行的 Docker 映像。 |  | 

### 部署 Java 微服务
<a name="deploy-the-java-microservices"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建部署文件。 | 根据此模式的[其他信息](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)部分中的*示例部署文件*代码创建名为 `deployment.yaml` 的 YAML 文件。使用您之前复制的图片 URL 作为 Amazon ECR 存储库的映像文件路径。 | 开发人员、系统管理员 | 
| 在Amazon EKS 集群上部署 Java 微服务。 | 要在您的 Amazon EKS 集群中创建部署，请运行 `kubectl apply -f deployment.yaml` 命令。 | 开发人员、系统管理员 | 
| 验证容器组（pod）的状态。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 开发人员、系统管理员 | 
| 创建服务。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 开发人员、系统管理员 | 
| 安装 AWS Load Balancer Controller 附加组件。 | 按照 Amazon EKS 文档中的[安装 AWS Load Balancer Controller 附加组件](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)进行操作。您必须安装插件，才能为 Kubernetes 服务创建应用程序负载均衡器或网络负载均衡器。 | 开发人员、系统管理员 | 
| 创建入口资源。 | 根据此模式的[其他信息](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional)部分中的*示例入口资源文件*代码创建名为 `ingress.yaml` 的 YAML 文件。 | 开发人员、系统管理员 | 
| 创建应用程序负载均衡器。 | 要部署入口资源并创建应用程序负载均衡器，请运行 `kubectl apply -f ingress.yaml` 命令。 | 开发人员、系统管理员 | 

### 测试应用程序
<a name="test-the-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 测试和验证应用程序。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 开发人员、系统管理员 | 

## 相关资源
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-resources"></a>
+ [创建私有存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)（Amazon ECR 文档）
+ [推送 Docker 映像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)（Amazon ECR 文档）
+ [入口控制器](https://www.eksworkshop.com/beginner/130_exposing-service/ingress_controller_alb/)（Amazon EKS Workshop）
+ [Docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/)（Docker 文档）

## 附加信息
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional"></a>

**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
```