Azure 上的 Java:容器中的容器





5.00/5 (1投票)
上一系列文章以读者在 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 上管理和部署容器应用程序的更多信息。
在本系列的下一篇文章中,了解有关监控和扩展容器化应用程序的内容。