65.9K
CodeProject 正在变化。 阅读更多。
Home

Azure 上的 Java:容器中的容器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2021 年 5 月 4 日

CPOL

6分钟阅读

viewsIcon

3237

downloadIcon

44

上一系列文章以读者在 AKS 上的 Kubernetes 集群中构建和部署一个非常简单的容器化 Java 应用程序结束。本文将在此知识的基础上,构建一个更复杂、更真实的应用程序。

Azure Kubernetes 服务 (AKS) 是托管云端微服务的绝佳服务。在上一系列文章中,您学习了如何构建一个简单的容器化 Java 应用程序并将其部署到 AKS 上的 Kubernetes 集群。如果您不熟悉如何执行此操作,建议您先阅读该系列文章,然后再继续。本文使用 Quarkus 来创建快速、高效的容器化 Java 微服务。更具体地说,我们将创建一个用于管理一家虚构物流公司的运输路线的应用程序。

使用 Kubernetes 部署的应用程序的组件被组织到容器中。每个组件的依赖项最少,并且包含运行代码所需的一切。您还可以将容器组织到一个共享网络和存储资源的单元中。这种容器集合称为 Pod。

Pod 内的容器共享相同的 IP 地址和一组存储卷。它们可以通过 localhost 网络连接或共享文件相互通信。将 Pod 视为一个逻辑主机。通常,只有当容器必须紧密集成时,您才希望将它们放在同一个 Pod 中。在 Pod 中运行的容器会一起启动或停止。部署后,您可以根据需要复制、运行和销毁 Pod。销毁 Pod 时,您将完全丢失其状态。如果您有任何需要持久化的数据,应将其保存在 Pod 外部的资源中(例如 StatefulSet)。

多容器模式

组织容器以协同交互的策略催生了几种设计模式。让我们看看其中的三种模式。

一种常用的模式是 Sidecar 模式。在 Sidecar 模式中,一个容器包含应用程序的大部分逻辑,而另一个容器包含附加功能。如果原始应用程序不易修改,您可能会使用此模式。假设有一个仅支持 HTTP 通信的遗留应用程序。在这种情况下,您可以使用 Sidecar 模式添加一个支持 SSL 通信的组件,将遗留应用程序的通信转换为 SSL。请注意,遗留应用程序不一定了解其 Pod 中的另一个容器。

另一种典型模式是适配器模式。适配器模式为服务提供与客户端需求兼容的新接口。例如,假设您有一个使用 SOAP 调用(SOAP-based calls)的服务,但您的应用程序需要 REST 调用。使用适配器模式,您可以编写一个 REST 接口,该接口向 SOAP 服务发出必要的调用并转换数据。在将第三方组件添加到解决方案时,此模式非常有用。通过适配器,您可以使第三方组件的 API 符合应用程序使用的其他服务的约定和设计。这使得应用程序使用的服务更加统一。

大使模式(Ambassador pattern)与适配器模式类似。适配器模式允许应用程序向外界提供某种接口,而大使模式允许应用程序使用不同的接口与其他资源进行交互。大使模式执行应用程序所需的接口转换。

我使用 Maven 创建了此项目的起点。我使用了这个命令。

  mvn io.quarkus:quarkus-maven-plugin:1.7.0.Final:create \
      -DprojectGroupId=com.contoso.shipping \
      -DprojectArtifactId=shipping-service \
      -DclassName="com.contoso.shipping.router" \
      -Dpath="/router" \

此命令生成一个包含 Dockerfile 的项目。我们可以使用它在容器中运行项目。在我们的应用程序中,一个 Pod 中运行多个容器。这类似于在同一台机器上运行多个进程。我们希望这些容器加载到同一个 Pod 中。同一 Pod 中的容器共享相同的资源,包括网络资源。它们可以相互通过 localhost 进行通信。为了确保两个容器都在同一个 Pod 中,请在用于配置应用程序的 YAML 的同一个容器元素中声明它们。以下是一个包含两个容器的 Pod 的部分 YAML 文件。

  spec:
    containers:
    - name: distancecalculator-container
      image: shipping/distancecalculator
    - name: distanceconverter-container
      image: shipping/distanceconverter

如果使用此文件运行 kubectl 工具,它会将容器加载到同一个 Pod 中。我们稍后将看到如何使用该工具。

设置项目

现在我们已经涵盖了一些基础知识,让我们开始构建我们的运输管理应用程序。在内部,该应用程序的 API 调用使用英里(miles)作为距离单位。而在全球范围内,千米(kilometers)是标准的距离单位。

您可以使用 Sidecar 模式将距离单位从英里转换为千米。如果原始应用程序的源代码不可用,在这里使用 Sidecar 模式将是一种修改应用程序行为的方法。

创建 Kubernetes 集群

您可能已经从上一系列文章中设置了 Kubernetes 集群。如果已经设置好,请跳到下一节“将 Azure Shell 连接到您的集群”。如果您没有,请在 Azure 门户的搜索文本框中键入“Kubernetes 服务”,然后从结果中选择它。

单击+添加以创建新的 Kubernetes 集群。选择一个资源组并为其命名。然后,选择审查+创建。在审查屏幕上,选择创建。片刻之后,集群资源即可使用。

将 Azure Shell 连接到您的集群

使用 Azure Cloud Shell,您可以直接从您的计算机部署到 Azure 内的 Kubernetes 集群。Cloud Shell 支持 Windows、macOS 和 Linux。从安装 Azure CLI页面下载并安装适合您计算机操作系统的版本。安装后,打开命令行终端以将 Shell 连接到您的帐户。使用命令“az login”。Cloud Shell 会提示您输入帐户用户名和密码进行登录。

连接 Shell 到您的帐户后,使用以下命令在 Shell 中安装 kubectl。

  az aks install cli

打开 Cloud Shell 并获取集群的凭据。使用以下命令执行此操作。

az aks get-credentials --resource-group <resource-group-name>  --name
  <cluster-name>

通过列出您的 Kubernetes 节点来验证命令是否成功。

kubectl get nodes

应用程序源代码克隆到 Cloud Shell,以便您可以从那里进行部署。

git clone https://github.com/

要部署应用程序,请使用 Kubernetes Control 的命令行实用程序发出 YAML 命令,如下所示。

kubectl create -f logistical.yaml

现在,关于运输位置的应用程序信息已转换为千米。Pod 内的一个微服务使用英里进行计算,而另一个微服务则将输出转换为千米。

如果您想设置自动化的部署管道,请登录您的 Azure DevOps 页面。通过单击新建项目来创建一个新项目。输入项目名称和描述。然后,单击创建

创建项目后,配置您的管道。从左侧面板选择管道(在下一页上)。

然后选择部署到 Azure Kubernetes 服务

会出现一个对话框,要求您选择集群、容器注册表、应用程序使用的端口(80 端口)以及集群的友好名称。会出现包含您配置的 YAML 文件。选择保存并创建选项。片刻之后,服务部署开始。

使用自动化路径,当主代码分支发生更改时,您可以自动部署新版本。这减少了确保服务保持最新状态的工作量。

结论

如果您想了解更多关于容器化应用程序的其他模式,请查看Kubernetes 和 Azure 的免费电子书合集。书名《Designing Distributed Systems》侧重于设计模式。《Hands-on Kubernetes on Azure》电子书包含有关在 Azure 上管理和部署容器应用程序的更多信息。

本系列的下一篇文章中,了解有关监控和扩展容器化应用程序的内容。

© . All rights reserved.