你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Kubernetes 服务中的 Magento 电子商务平台

Microsoft Entra ID
Azure 容器注册表
Azure Database for MySQL
Azure 文件
Azure Kubernetes 服务 (AKS)
Azure Monitor

本文讨论 Magento 的开源版本,Magento 是一个用 PHP 编写的电子商务平台。 本文不介绍 Adobe Commerce。 此示例方案演示了如何将 Magento 部署到 Azure Kubernetes 服务(AKS),并介绍了在 Azure 上托管 Magento 的常见最佳做法。

体系结构

显示使用其他 Azure 组件部署在 Azure Kubernetes 服务中的 Magento 的示意图。

下载此体系结构的 Visio 文件

工作流

  • Azure Kubernetes Service (AKS) 在不同的 pod 中部署 Varnish、Magento、Redis 和 Elasticsearch 的 Kubernetes 群集。
  • AKS 创建虚拟网络来部署代理节点。 预先创建虚拟网络以设置子网配置、专用链接和出口限制。
  • Varnish 安装在 HTTP 服务器前面,充当整页缓存。
  • Azure Database for MySQL 存储订单和目录等事务数据。 建议使用版本 8.0。
  • Azure 文件存储高级版Azure NetApp 文件等效的网络连接存储 (NAS) 系统存储媒体文件,如产品图像。 Magento 需要一个与 Kubernetes 兼容的文件系统,该系统可以在 ReadWriteMany 模式(如 Azure 文件存储高级版或 Azure NetApp 文件)中装载卷。 Azure Kubernetes 服务 (AKS) 中的应用程序存储选项。 强烈建议测试每秒输入/输出操作数 (IOPS) 吞吐量,并选择合适的选项。
  • 内容分发网络 (CDN) 提供静态内容,如 CSS、JavaScript 和映像。 通过 CDN 提供内容可将用户和数据中心之间的网络延迟降到最低。 CDN 可以通过缓存和提供静态内容来消除 NAS 的重大负载。
  • Redis 存储会话数据。 出于性能原因,建议在容器上托管 Redis。
  • AKS 使用 Microsoft Entra ID 标识来创建和管理其他 Azure 资源,例如 Azure 负载均衡器、用户身份验证、基于角色的访问控制和托管标识。
  • Azure 容器注册表存储部署到 AKS 群集的专用 Docker 映像。 可以使用其他容器注册表,例如 Docker 中心。 默认 Magento 安装会向映像写入一些机密。
  • Azure Monitor 收集并存储指标和日志,包括 Azure 服务的平台指标,以及应用程序遥测数据。 Azure Monitor 与 AKS 集成以收集控制器、节点和容器指标以及容器和主节点日志。

组件

方案详细信息

有关 Magento 的详细信息,请参阅本地安装概述

可能的用例

此解决方案针对零售行业进行了优化。

注意事项

这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负载质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架

安全性

下面是此方案的一些安全注意事项:

基于角色的访问控制 (RBAC)

Kubernetes 和 Azure 都提供基于角色的访问控制 (RBAC) 机制。

  • Azure RBAC 控制对 Azure 资源的访问,包括创建资源的能力。 Azure RBAC 可以将权限分配给用户、组或服务主体,这些权限是应用程序使用的安全标识。

  • Kubernetes RBAC 控制 Kubernetes API 的权限。 例如,创建 pod 和列出 pod 是 Kubernetes RBAC 可向用户授权的操作。

AKS 集成了 Azure 和 Kubernetes RBAC 机制。 若要将 AKS 权限分配给用户,请创建角色和角色绑定:

  • 角色是在命名空间内部应用的一组权限。 权限定义为针对资源(pod、部署等)应用的谓词(获取、更新、创建或删除)。

  • 角色绑定将用户或组分配到角色。

  • ClusterRole 对象定义适用于整个 AKS 群集的所有命名空间中的角色。 若要将用户或组分配到 ClusterRole,请创建 ClusterRoleBinding。

  • 此外,还可以使用 Azure RBAC 进行 Kubernetes 授权,该授权启用跨 Azure 资源、AKS 和 Kubernetes 资源进行统一管理和访问控制。

在创建 AKS 群集时,可将其配置为使用 Microsoft Entra ID 进行用户身份验证。

可伸缩性

有多种方法可以优化此方案的可伸缩性:

媒体和静态文件

  • 充分预配 Azure 文件存储、Azure NetApp 文件或其他网络连接存储 (NAS) 系统。 Magento 可存储数千个媒体文件,例如产品图像。 请确保预配 NAS 产品时具备足够的每秒输入/输出操作数 (IOPS) 以应对需求。

  • 最大程度地减小静态内容(如 HTML、CSS 和 JavaScript)的大小。 缩减可以降低带宽成本,并为用户提供更快的响应体验。

数据库连接

  • 启用到 MySQL 数据库的持久连接,以便 Magento 会持续重复使用现有连接,而不是为每个请求创建一个新连接。 若要打开持久连接,请将以下行添加到 Magento env.php 文件的 db 部分:

    'persistent' => '1'

  • 如果 MySQL 消耗过多的 CPU,请从 Magento 配置的分层导航中关闭产品计数,从而降低利用率:

    magento config:set -vvv catalog/layered_navigation/display_product_count 0

Caching

  • 配置 OPcache 以进行 PHP 代码缓存和优化。

    请确保在 php.ini 中设置以下指令并取消注释:

    opcache.enable=1

    opcache.save_comments=1

    opcache.validate_timestamps=0

  • 通过在 pod 上运行多个实例来平衡 Varnish 缓存的负载,使其能够缩放。

日志记录

限制访问日志记录,以避免性能问题,并防止公开敏感数据,如客户端 IP 地址。

  • 使用以下 Varnish 命令将日志记录限制为错误级别:

    varnishd -s malloc,1G -a :80 -f /etc/varnish/magento.vcl && varnishlog -q "RespStatus >= 400 or BerespStatus >= 400"

  • 如果使用 Apache Web 服务器的入口,请将以下行添加到 Apache 服务器配置中的 Magento VirtualHost 条目,将 Apache 日志记录限制为错误级别:

    CustomLog /dev/null common

  • 通过注释掉所有 PHP-FPM 配置中的 access.log 设置来关闭 PHP-FPM 访问日志。

可用性

对于此方案,请考虑以下方法来优化可用性:

运行状况探测

Kubernetes 定义了两种类型的运行状况探测:

  • 就绪情况探测会告知 Kubernetes pod 是否已准备好接受请求。
  • 运行情况探测会告知 Kubernetes 是否应删除 pod 并启动新实例。

自定义 Kubernetes 运行状况探测器,并使用它们来判断 pod 是否处于良好运行状况。

可用性区域

可用性区域是 Azure 区域内的唯一物理位置,可帮助保护应用程序和数据免受数据中心故障的影响。 每个区域由一个或多个数据中心组成。 即使单个数据中心发生物理故障,区域中的应用程序仍可以使用。

可以跨多个可用性区域部署 AKS 群集,以提供更高的可用性级别并防范硬件故障或计划内维护事件。 如果将群集节点池定义为跨多个区域,则即使单个区域出现故障,节点也可以继续运行。 有关将 AKS 部署到可用性区域的详细信息,请参阅创建使用可用性区域的 AKS 群集

资源约束

  • 资源争用可能影响服务可用性。 定义容器资源约束,使单个容器不会严重影响群集内存和 CPU 资源。 可以使用 AKS 诊断来识别群集中的任何问题。

  • 使用资源限制来限制容器允许的资源总量,使某个特定容器不会耗尽其他容器的资源。

DevOps

下面是此方案的一些操作注意事项:

  • 在此方案中,MySQL 不公开公共终结点。 如果生成服务器将配置设置存储到后端 MySQL 数据库,请确保将该服务器部署到 MySQL 通过服务终结点连接到的同一虚拟网络子网中。

  • 使用 Azure 容器注册表或其他容器注册表(例如 Docker Hub)来存储部署到群集的专用 Docker 映像。 AKS 可以使用其 Microsoft Entra 标识对 Azure 容器注册表进行身份验证。

监视

Azure Monitor 为所有 Azure 服务提供关键指标,包括 AKS 中的容器指标。 创建仪表板,在一个位置显示所有指标。

Azure Monitor 监视仪表板的屏幕截图。

除了将 Azure Monitor 用于容器之外,现在还可以使用 Prometheus 的托管服务 通过 Prometheus 兼容的监视解决方案大规模收集和分析指标。

还可以使用 Azure 托管 Grafana(或自托管的 Grafana)来可视化 Prometheus 指标。 使用 Azure 托管 Grafana 时,将 Azure Monitor 工作区连接到 Azure 托管 Grafana 工作区可使 Grafana 使用 Grafana 仪表板中的 Azure Monitor 工作区数据。 然后,可访问使用 Prometheus 指标的多个预生成的仪表板,并且能够创建自定义仪表板。

Grafana 仪表板的屏幕截图。

性能测试

使用 Magento Performance Toolkit 进行性能测试。 该工具包使用 Apache JMeter 来模拟客户行为,例如登录、浏览产品和签出。

也应考虑使用 Azure 负载测试,它是一项完全托管的负载测试服务,可用于生成大规模负载。 凭借 Azure 负载测试,可以使用 URL 为 Web 应用程序快速创建负载测试。 或者,对于更高级的负载测试方案,可以通过重用现有的 JMeter 测试脚本来创建负载测试。

成本优化

成本优化是关于寻找减少不必要的费用和提高运营效率的方法。 有关详细信息,请参阅成本优化支柱概述

后续步骤