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

通过多租户 Azure Kubernetes 服务使用应用程序网关入口控制器 (AGIC)

Azure 应用程序网关
Azure Key Vault
Azure 容器注册表
Azure Kubernetes 服务 (AKS)
Azure Bastion

在此解决方案中,Azure Web 应用程序防火墙 (WAF) 为部署在多租户 AKS Azure Kubernetes 服务 (AKS) 群集上的 Web 应用程序提供集中保护,使其免受常见攻击和漏洞的影响。 在 Azure Kubernetes 服务 (AKS) 群集上运行并通过应用程序网关入口控制器 (AGIC) 公开的 Web 应用程序可以在 Azure 应用程序网关上使用 WAF 策略防范恶意攻击,例如 SQL 注入和跨站脚本。 Azure 应用程序网关上的 WAF 策略预配置了 OWASP 核心规则集,并且可以更改为其他受支持的 OWASP CRS 版本。

体系结构

显示此应用程序网关入口控制器解决方案图的图片。

下载此体系结构的 Visio 文件

工作流

配套 ARM 模板部署包含四个子网的新虚拟网络:

  • AksSubnet:托管 AKS 群集
  • VmSubnet:托管 Jumpbox 虚拟机和专用终结点
  • AppGatewaySubnet:主机应用程序网关 WAF2 层。
  • AzureBastionSubnet:托管 Azure Bastion

Azure Kubernetes 服务 (AKS) 群集使用用户定义的托管标识来创建其他资源,例如 Azure 中的负载均衡器与托管磁盘。 ARM 模板允许部署具有以下功能的 AKS 群集:

AKS 群集由以下内容组成:

  • 仅托管关键系统 Pod 和服务的系统节点池。 工作器节点具有节点排斥,可阻止在此节点池中安排应用程序 Pod。
  • 托管用户工作负载和项目的用户节点池。

在托管 AKS 群集的同一虚拟网络中部署虚拟机 (VM)。 将 Azure Kubernetes 服务部署为专用群集时,系统管理员可以使用此 VM 通过 Kubernetes 命令行工具管理群集。 虚拟机的启动诊断日志存储在 Azure 存储帐户中。

Azure Bastion 主机通过 SSL 直接在 Azure 门户中提供与 Jumpbox VM 的安全无缝 SSH 连接。 Azure 容器注册表 (ACR) 用于生成、存储和管理容器映像和项目(例如 Helm 图表)。

该体系结构包括入口控制器使用的应用程序网关。 将应用程序网关部署到专用子网,并通过一个所有租户工作负载共享的公共 IP 地址暴露在公共互联网上。 Web 访问防火墙 (WAF) 策略在根级别和 HTTP 监听器级别与应用网关相关联,以保护租户工作负载免受恶意攻击。 该策略配置为“防护”模式,并使用 OWASP 3.1 阻止规则检测到的入侵和攻击。 攻击者会收到“403 未授权访问”异常,且连接会结束。 防护模式会在 WAF 日志中记录此类攻击。

在 Azure Kubernetes 服务 (AKS) 上运行的工作负载将 Key Vault 作为机密存储,通过客户端库、Secrets Store CSI 驱动程序Dapr 检索密钥、证书和机密。 Azure 专用链接使 AKS 工作负载能够通过虚拟网络中的专用终结点访问 Key Vault 等 Azure PaaS 服务。

示例拓扑包括以下专用终结点:

  • Blob 存储帐户的专用终结点
  • ACR Azure 容器注册表 (ACR) 的专用终结点
  • Key Vault 的专用终结点
  • 如果选择专用 AKS 群集,则为 Kubernetes 群集的 API 服务器的专用终结点

该体系结构还包括以下专用 DNS 区域,用于将 PaaS 服务的完全限定的域名 (FQDN) 名称解析为关联专用终结点的专用 IP 地址:

  • 专用 DNS 区域,用于将专用终结点的名称解析为 Azure Blob 存储帐户
  • 专用 DNS 区域,用于将专用终结点的名称解析为 Azure 容器注册表 (ACR)
  • 专用 DNS 区域,用于将专用终结点的名称解析为 Azure Key Vault
  • 如果将群集部署为专用,则将专用终结点的专用 DNS 区域的名称解析为 Kubernetes 服务器 API

托管 AKS 群集的虚拟网络与上述专用 DNS 区域之间存在虚拟网络链接。 Log Analytics 工作区用于从以下源收集诊断日志和指标:

  • Azure Kubernetes 服务群集
  • Jumpbox 虚拟机
  • Azure 应用程序网关
  • Azure Key Vault
  • Azure 网络安全组

组件

  • Azure 容器注册表是基于开源 Docker Registry 2.0 的托管专用 Docker 注册表服务。 可以将 Azure 容器注册表与现有容器开发和部署管道配合使用,也可使用 Azure 容器注册表任务在 Azure 中生成容器映像。 可以通过源代码提交和基础映像更新等触发器按需生成或完全自动生成。

  • Azure Kubernetes 服务通过减少 Azure 的运营开销,简化了在 Azure 中部署托管 Kubernetes 群集的过程。 作为一个托管的 Kubernetes 服务,Azure 可以自动处理运行状况监视和维护等关键任务。 由于 Kubernetes 主节点由 Azure 管理,因此你只需要管理和维护代理节点。

  • Azure Key Vault 安全存储并控制对机密(例如 API 密钥、密码、证书和加密密钥)的访问。 Azure Key Vault 也可用来轻松预配、管理和部署公用和专用传输层安全性/安全套接字层 (TLS/SSL) 证书,以用于 Azure 以及内部连接资源。

  • Azure 应用程序网关 Azure 应用程序网关是一个 Web 流量负载均衡器,可支持管理发往多个下游 Web 应用程序和 REST API 的入站流量。 传统负载均衡器在传输层(OSI 第 4 层 - TCP 和 UDP)运行,并基于源 IP 地址和端口将流量路由到目标 IP 地址和端口。 而应用程序网关则是应用程序层(OSI 第 7 层)的负载均衡器。 (OSI 代表开放系统互连,TCP 代表传输控制协议,UDP 代表用户数据报协议。)

  • Web 应用程序防火墙 (WAF) 服务为 Web 应用程序提供集中保护,使其免受常见攻击和漏洞的侵害。 WAF 基于 OWASP(开放 Web 应用程序安全项目)核心规则集中的规则。 Azure WAF 允许你创建自定义规则,用于对通过策略的每个请求进行评估。 这些规则的优先级高于托管规则集中的其他规则。 自定义规则包含规则名称、规则优先级和一系列匹配条件。 如果满足这些条件,则执行相应的操作(允许或阻止)。

  • Azure Bastion 是在虚拟网络中预配的完全托管平台即服务 (PaaS)。 Azure Bastion 直接从 Azure 门户通过 TLS 为虚拟网络中的 VM 提供安全无缝的远程桌面协议 (RDP) 和安全外壳 (SSH) 连接。

  • Azure 虚拟机提供了一种可缩放的按需计算资源,可用于灵活地进行虚拟化,而无需购买和维护物理硬件。

  • Azure 虚拟网络是 Azure 专用网络的基本构建块。 借助 Azure 虚拟网络,Azure 资源(如 VM)能够以安全方式彼此通信、与 Internet 通信以及与本地网络通信。 Azure 虚拟网络类似于本地的传统网络,但具有 Azure 基础结构的优势,例如可缩放性、可用性和隔离性。

  • 虚拟网络接口可允许 Azure 虚拟机与 Internet、Azure 及本地资源进行通信。 可以将多个网络接口卡添加到一个 Azure VM,以便子 VM 可以具有其自己的专用网络接口设备和 IP 地址。

  • Azure 托管磁盘提供 Azure 在 Azure VM 上托管的块级存储卷。 可用磁盘类型包括超级磁盘、高级固态硬盘 (SSD)、标准 SSD 和标准硬盘驱动器 (HDD)。

  • Azure Blob 存储是 Microsoft 提供的适用于云的对象存储解决方案。 Blob 存储最适合存储巨量的非结构化数据。 非结构化数据是不遵循特定数据模型或定义的数据(如文本或二进制数据)。

  • 使用 Azure 专用链接,可以通过虚拟网络中的专用终结点访问 Azure PaaS 服务(例如,Azure Blob 存储和 Key Vault)和 Azure 托管的客户拥有的服务/合作伙伴服务。

备选方法

在此体系结构中,应用程序网关入口控制器 (AGIC) 使用适用于 Azure Kubernetes 服务 (AKS) 的 AGIC 加载项。 还可以通过 Helm 图表安装应用程序网关入口控制器。 要进行新设置,在 Azure CLI 中通过一行内容即可部署新应用程序网关和新 AKS 群集(将 AGIC 作为加载项启用)。 该加载项也是一项完全托管的服务,这提供了一些额外的优势,例如自动更新和更多的支持。 Microsoft 完全支持部署 AGIC(Helm 和 AKS 加载项)的两种方式。 此外,该加载项作为一流的加载项,允许更好地与 AKS 集成。

应用程序网关入口控制器 (AGIC) 加载项仍作为 Pod 部署在 AKS 群集中。 但是,Helm 部署版本与 AGIC 的加载项版本之间存在一些差异。 以下列表包括两个版本之间的差异:

  • 无法在 AKS 加载项上修改 Helm 部署值:

    • usePrivateIp 在默认情况下将设置为 false;这可以被 use-private-ip 批注覆盖
    • 加载项不支持 shared
  • 通过 Helm 部署的 AGIC 支持 ProhibitedTargets,这意味着 AGIC 可以专为 AKS 群集配置应用程序网关,不影响其他现有的后端。

  • 由于 AGIC 加载项是一项托管服务,因此它将自动更新为最新 AGIC 加载项版本,不像通过 Helm 部署的 AGIC(客户必须手动更新 AGIC)。

  • 你只能为每个 AKS 群集部署一个 AGIC 加载项,并且每个 AGIC 加载项当前只能面向一个应用程序网关实例。 对于每个群集需要多个 AGIC 的部署或需要多个面向某个应用程序网关的 AGIC 的部署,可以继续使用通过 Helm 部署的 AGIC。

单个 Azure 应用程序网关 Kubernetes 入口控制器 (AGIC) 实例可以从多个 Kubernetes 命名空间引入事件。 如果 AKS 管理员决定将应用程序网关用作入口,则所有命名空间将使用相同的应用程序网关实例。 入口控制器的单个安装将会监视可访问的命名空间,并配置关联的应用程序网关。 有关详细信息,请参阅在使用应用程序网关入口控制器的 AKS 群集中启用多命名空间支持

要启用多命名空间支持,请执行以下操作:

  • 按以下方式之一修改 helm-config.yaml 文件:

    • 从 helm-config.yaml 文件中完全删除 密钥。 AGIC 将观察所有命名空间。
    • watchNamespace 设置为空字符串。 AGIC 将观察所有命名空间。
    • 添加由逗号分隔的多个命名空间 (watchNamespace: default,secondNamespace)。 AGIC 将专门观察这些命名空间。
  • 使用此脚本应用 Helm 模板更改:helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure

部署并可以观察多个命名空间后,AGIC 将执行以下操作:

  • 列出所有可访问命名空间中的资源
  • 筛选出通过 kubernetes.io/ingress.class: azure/application-gateway 批注的入口资源
  • 编写组合的应用程序网关配置
  • 通过 ARM 将配置应用到关联的应用程序网关

方案详细信息

根据 Kubernetes 文档,多租户 Kubernetes 群集由多个用户和工作负载(通常称为租户)共享。 此定义包括由组织中不同团队或部门共享的 Kubernetes 群集。 它还包括由软件即服务 (SaaS) 应用程序的针对每个客户的实例共享的群集。 群集多租户是管理许多单租户专用群集的替代方法。 多租户 Kubernetes 群集的操作员必须将租户相互隔离开。 此隔离可最大程度地减少已发生泄露的或恶意的租户对群集以及对其他租户造成损害。 当多个用户或团队与固定数量的节点共享同一群集时,可能存在其中一个团队使用的资源超出平均份额的问题。 资源配额是管理员用于解决此问题的工具。

在计划构建多租户 Azure Kubernetes 服务 (AKS) 群集时,应考虑 Kubernetes 提供的资源隔离层:群集、命名空间、节点、Pod 和容器。 还应考虑在多个租户之间共享不同类型的资源带来的安全影响。 例如,在同一节点上计划不同租户的 Pod 可以减少群集中所需的计算机数量。 另一方面,可能需要防止共置某些工作负载。 例如,你可能不允许来自组织外部的不受信任的代码与处理敏感信息的容器在同一节点上运行。 Azure Policy 可用于将部署限制为仅部署到受信任注册表中的 AKS。

尽管 Kubernetes 无法保证完全隔离租户,但它提供的功能可能足以满足特定用例需求。 最佳做法是,将每个租户及其 Kubernetes 资源隔离到各自的命名空间中。 然后,可以使用 Kubernetes RBAC网络策略强制实施租户隔离。 (RBAC 代表基于角色的访问控制。)例如,下图显示了一个典型的 SaaS 提供商模型,在该模型中,系统在同一群集上托管同一应用程序的多个实例,其中每个租户一个实例。 每个应用程序都分别位于单独的命名空间中。 当租户需要更高级别的物理隔离并保证性能时,可以将其工作负载部署到一组专用节点、专用池甚至专用群集。

多租户的图片

下载此体系结构的 Visio 文件

应用程序网关入口控制器 (AGIC) 是一款 Kubernetes 应用程序。可支持 Azure Kubernetes 服务 (AKS) 客户利用 Azure 应用程序网关向 Internet 公开容器化应用程序。 AGIC 会监视托管时所在的 Kubernetes 群集并持续更新应用程序网关,以便向 Internet 公开选定服务。 在客户的 AKS 实例上,入口控制器在其自己的 Pod 中运行。 AGIC 监视部分 Kubernetes 资源中的更改。 AKS 群集的状态会转换为特定于应用程序网关的配置并应用到 Azure 资源管理器 (ARM)。 此体系结构示例演示了使用 Azure 应用程序网关应用程序网关入口控制器加载项部署公共或专用 Azure Kubernetes 服务 (AKS) 群集的做法。

单个 Azure 应用程序网关 Kubernetes 入口控制器 (AGIC) 实例可以从多个命名空间引入事件,并可以观察这些命名空间。 如果 AKS 管理员决定将应用程序网关用作入口,则所有命名空间将使用相同的应用程序网关实例。 入口控制器的单个安装将会监视可访问的命名空间,并配置关联的应用程序网关。

可能的用例

使用应用程序网关入口控制器 (AGIC) 公开和保护在多租户环境中 Azure Kubernetes 服务 (AKS) 群集上运行的面向 Internet 的工作负载。

注意事项

尽管下列一些注意事项并非与 Azure Kubernetes 服务 (AKS) 中的多租户完全相关,但我们认为它们是部署此解决方案时的重要要求。 其中包括我们的安全性、性能、可用性和可靠性、存储、计划程序、服务网格和监视注意事项。

多租户注意事项

  • 为多租户设计 AKS 群集。 Kubernetes 提供所需的功能让你在同一个群集中逻辑隔离团队和工作负荷。 目标应该是提供最少量的特权,特权范围限定为每个团队所需的资源。 Kubernetes 中的命名空间创建逻辑隔离边界。
  • 使用逻辑隔离分隔团队和项目。 尝试尽量减少要部署的物理 AKS 群集数,以隔离团队或应用程序。 群集逻辑隔离提供的 pod 密度通常比物理隔离的群集更高。
  • 需要实现严格的物理隔离时,可以使用专用节点池或专用 AKS 群集。 例如,你可以将工作器节点池或整个群集专用于多租户环境中的团队或租户。
    • 可以结合使用污点和容忍来控制将 Pod 部署到特定节点池这一操作。 请注意,AKS 中的节点只能在创建节点池时受污染。 或者,标签和 nodePool 选择器可用于控制将工作负荷部署到特定节点池这一操作。

安全注意事项

尽管安全注意事项并非与 AKS 中的多租户完全相关,但我们认为它们是部署此解决方案时的重要要求。

网络安全

  • 为 AKS 工作负载使用的任何 PaaS 服务(例如 Key Vault、服务总线或 Azure SQL 数据库)创建专用终结点。 这样一来,应用程序和这些服务之间的流量就不会暴露到公共 Internet 上。 有关详细信息,请参阅什么是 Azure 专用链接?
  • 将 Kubernetes 入口资源配置为通过 HTTPS 公开工作负载,并为每个租户使用单独的子域和数字证书。 应用程序网关入口控制器 (AGIC) 将自动配置 Azure 应用程序网关侦听器以实现安全套接字层 (SSL) 终止。
  • 配置 Azure 应用程序网关,以使用 Web 应用程序防火墙策略来保护面向公众的工作负载(在 AKS 上运行)免受恶意攻击。
  • 要与现有虚拟网络或本地网络集成,请在 AKS 中使用 Azure CNI 网络。 利用此网络模型,还可以更大程度地将企业环境中的资源和控制相分离。
  • 通过控制哪些组件之间可以相互通信,我们使用网络策略来隔离和保护服务内通信。 默认情况下,Kubernetes 群集中的所有 Pod 都可以无限制地发送和接收流量。 要提高安全性,可以使用 Azure 网络策略或 Calico 网络策略来定义规则,控制不同微服务之间的通信流。 有关详细信息,请参阅网络策略
  • 不公开到 AKS 节点的远程连接。 在管理虚拟网络中创建堡垒主机或跳转盒。 使用堡垒主机将流量安全地路由到 AKS 群集以远程管理任务。
  • 请考虑在生产环境中使用专用 AKS 群集,或者至少通过使用 Azure Kubernetes 服务中的授权 IP 地址范围来确保安全访问 API 服务器。
  • Azure DDoS 防护与应用程序设计最佳做法相结合,提供增强的 DDoS 缓解功能来更全面地防御 DDoS 攻击。 应在任何外围虚拟网络上启用 Azure DDOS 防护

身份验证和授权

工作负载和群集

  • 保护对 Kubernetes API 服务器的访问是保护群集的最重要措施之一。 将 Kubernetes 基于角色的访问控制 (Kubernetes RBAC) 与 Microsoft Entra ID 集成,以控制对 API 服务器的访问。 借助这些控制,可以像保护对 Azure 订阅的访问一样保护 AKS。
  • 限制对容器可以执行的操作的访问。 使用 Pod 安全策略 启用 Pod 创建和更新的精细授权。 提供最少的权限,并避免使用 root/特权提升。 有关更多最佳做法,请参阅保护 Pod 对资源的访问
  • 请尽量避免以根用户身份运行容器。
  • 使用 AppArmor Linux 内核安全模块来限制容器可以执行的操作。
  • 定期将 AKS 群集升级到最新的 Kubernetes 版本,以利用新功能和 bug 修复。
  • AKS 会自动在每个 Linux 节点上下载并安装安全修补程序,但不会自动重启节点。 使用 kured 监视挂起的重新启动、隔离和排出节点,最后应用更新。 对于 Windows Server 节点,请定期执行 AKS 升级操作,以安全隔离和排出 Pod 并部署更新的节点。
  • 考虑为所有 Pod 内通信使用 HTTPS 和 gRPC 安全传输协议,并使用更高级的身份验证机制,而无需在每个请求(例如 OAuth 或 JWT)上发送普通凭据。 可通过利用服务网格(如 Istio、Linkerd、Consul或 开放式服务网格)或使用 Dapr 来实现安全的服务内通信。

Azure 容器注册表

  • 扫描容器映像是否存在漏洞,只部署已通过验证的映像。 定期更新基础映像和应用程序运行时,然后在 AKS 群集中重新部署工作负荷。 CI/CD 部署工作流应包含扫描容器映像的过程。 适用于容器的 Azure Defender 可用于在自动化管道中生成/部署期间扫描代码中的漏洞。 或者,Prisma CloudAqua 等工具可用于扫描和仅允许部署已验证的图像。
  • 如果为应用程序映像使用的是基础映像,请在更新基础映像时通过自动化生成新映像。 由于这些基础映像通常包含安全修补程序,请更新所有下游应用程序容器映像。 有关基础映像更新的详细信息,请参阅使用 Azure 容器注册表任务在基础映像更新时自动化映像生成.

性能注意事项

尽管性能注意事项并非与 Azure Kubernetes 服务 (AKS) 中的多租户完全相关,但我们认为它们是部署此解决方案时的重要要求:

  • 对于低延迟工作负载,请考虑在邻近放置组中部署专用节点池。 在 Azure 中部署应用程序时,跨区域或可用性区域分布虚拟机 (VM) 实例会造成网络延迟,这可能会影响应用程序的总体性能。 邻近放置组是一种逻辑分组,用于确保 Azure 计算资源的物理位置彼此接近。 有些用例(例如游戏、工程模拟和高频交易 (HFT))需要低延迟和快速完成的任务。 对于这样的高性能计算 (HPC) 场景,请考虑为群集的节点池使用邻近放置组 (PPG)。
  • 请始终使用较小的容器映像,因为它有助于创建更快的生成。 由于攻击面减少,较小的映像也不太容易受到攻击途径的攻击。
  • 当流量增加时,可以使用 Kubernetes 自动缩放动态增加 AKS 群集的工作器节点数。 借助水平 Pod 自动缩放程序和群集自动缩放程序,节点和 Pod 卷会动态实时调整,以匹配流量条件,避免因容量问题而导致停机时间。 有关详细信息,请参阅在 Azure Kubernetes 服务 (AKS) 群集中使用标签

可用性和可靠性注意事项

尽管可用性和可靠性注意事项并非与 Azure Kubernetes 服务 (AKS) 中的多租户完全相关,但我们认为它们是部署此解决方案时的重要要求。 请考虑以下方法来优化 AKS 群集和工作负载可用性。

容器

  • 使用 Kubernetes 运行状况探测来检查容器是否处于活动状态且正常运行:

    • LivenessProbe 指示容器是否正在运行。 如果运行情况探测失败,kubelet 将终止容器,并受其重启策略影响。
    • ReadinessProbe 指示容器是否已准备好响应请求。 如果就绪情况探测失败,终结点控制器会将 pod 的 IP 地址从所有匹配 Pod 的服务的终结点中删除。 初始延迟之前的默认就绪状态为“失败”。
    • 启动探测指示容器中的应用程序是否已启动。 如果提供了启动探测,则在成功前会禁用所有其他探测器。 如果启动探测失败,kubelet 将终止容器,并受其重启策略影响。
  • 资源争用可能影响服务可用性。 定义容器资源约束,使单个容器不会严重影响群集内存和 CPU 资源。 可以使用 AKS 诊断来识别群集中的任何问题。

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

容器注册表

  • 建议将容器映像存储在 Azure 容器注册表,然后使用 Azure 容器注册表异地复制将注册表异地复制到每个 AKS 区域。 异地复制是高级 SKU ACR 注册表的一项功能。
  • 扫描容器映像是否存在漏洞,只部署已通过验证的映像。 定期更新基础映像和应用程序运行时,然后在 AKS 群集中重新部署工作负载。
  • 限制 Pod 和部署可以使用的映像注册表。 只允许使用可信的注册表来验证和控制可用的映像。
  • 如果为应用程序映像使用的是基础映像,请在更新基础映像时通过自动化生成新映像。 由于这些基础映像通常包含安全修补程序,请更新所有下游应用程序容器映像。 在将映像发布到容器注册表之前,建议先扫描容器映像中属于 CI/CD 管道的漏洞。 Azure Defender for Containers 可以集成到 CI/CD 工作流。
  • 利用 Azure 容器注册表中的 ACR 任务 为 Docker 容器自动执行操作系统和框架修补。 ACR 任务支持在容器基础映像更新时自动化的生成执行,例如在某个基础映像中修补 OS 或应用程序框架时。

区域内复原

  • 请考虑在某个区域的所有可用性区域内部署 AKS 群集的节点池,并使用 Azure 标准负载均衡器 或节点池前面的 Azure 应用程序网关。 此拓扑在单个数据中心中断时提供更好的复原能力。 这样一来,在一个区域内的三个单独可用性区域中,群集节点将分布到多个数据中心。
  • 启用 Azure 容器注册表中的区域冗余以实现区域内复原能力和高可用性。
  • 使用 Pod 拓扑分散约束 来控制如何在故障域(如区域、可用性区域和节点)中将 Pod 分散到 AKS 群集。
  • 请考虑对托管任务关键型工作负载的 AKS 群集使用运行时间 SLA。 运行时间 SLA 是一个可选功能,用于为群集启用具有财务支持的更高 SLA。 对于使用可用性区域的群集,运行时间 SLA 可保证 Kubernetes API 服务器终结点 99.95% 的可用性。 对于不使用可用性区域的群集,支持 99.9% 的可用性。 AKS 跨更新域和容错域使用主节点副本,确保满足 SLA 要求。

灾难恢复和业务连续性

  • 请考虑将解决方案部署到地域内至少两个配对的 Azure 区域。 还应采用全局负载均衡器(如Azure 流量管理器Azure Front Door,使用主动/主动或主动/被动路由方法)来保证业务连续性和灾难恢复。
  • 请确保在 QA 环境中编写、记录并定期测试任何区域故障转移过程,以避免主要区域中的服务中断影响核心服务时出现不可预知的问题。
  • 这些测试还用于验证 DR 方法是否满足 RPO/RTO 目标,以及故障转移所需的最终手动过程和干预。
  • 请确保测试对过程进行故障回复,以了解它们是否按预期工作。
  • 将容器映像存储在 Azure 容器注册表,并将注册表异地复制到每个 AKS 区域。 有关详细信息,请参阅 Azure 容器注册表中的异地复制
  • 在可能的情况下,不要将服务状态存储在容器中。 请改用支持多区域复制的 Azure 平台即服务 (PaaS)。
  • 如果使用 Azure 存储,准备和测试如何将存储从主要区域迁移到备份区域。
  • 请考虑使用 GitOps 部署群集配置。 使用 GitOps 提供主群集和 DR 群集之间的统一性,并在群集丢失时快速重新生成新群集。
  • 请考虑使用 Velero 等工具备份/还原群集配置。

存储注意事项

尽管存储注意事项并非与 Azure Kubernetes 服务 (AKS) 中的多租户完全相关,但我们认为它们是部署此解决方案时的重要要求:

  • 考虑使用临时 OS 磁盘部署 AKS 群集,这些磁盘可提供较低的读/写延迟,同时节点缩放和群集升级速度较快。
  • 了解应用程序的需求以选择合适的存储。 将高性能、SSD 支持的存储用于生产工作负载。 在多个 pod 需要同时访问相同文件时,规划基于网络的存储系统(例如 Azure 文件存储)。 有关详细信息,请参阅 AKS 中应用程序的存储选项
  • 每个节点大小都支持最大数量的磁盘。 不同大小的节点提供不同数量的本地存储和网络带宽。 根据应用程序需要进行规划,部署大小合适的节点。
  • 为减少管理开销和实现缩放,请不要以静态方式创建和分配永久性卷。 使用动态预配。 在存储类中,定义合适的回收策略,以便在删除 pod 后最大限度地减少不必要的存储成本。

计划程序注意事项

尽管有些计划程序注意事项并非与 Azure Kubernetes 服务 (AKS) 中的多租户完全相关,但我们认为它们是部署此解决方案时的重要要求:

  • 请确保查看并实施最佳做法,使群集操作员和应用程序开发人员能够在 Azure Kubernetes 服务 (AKS) 上成功生成和运行应用程序。
  • 为所有命名空间在命名空间级别规划和应用资源配额。 如果 pod 未定义资源请求和限制,则拒绝部署。 监视资源使用情况,然后根据需要调整配额。 当多个团队或租户共享节点数量固定的 AKS 群集时,可以使用资源配额为每个团队或租户分配公平的资源份额。
  • 采用限制范围,限制命名空间中(向 Pod 或容器)的资源分配,这里是指 CPU 和内存。
  • 对于用于部署应用程序的 YAML 清单或 Helm 图表中的 pod,显式定义 CPU 和内存使用情况的资源请求和限制。 当你为 pod 中的容器指定资源请求时,Kubernetes 计划程序将使用此信息来决定要在哪个节点上放置 pod。 指定容器资源限制(例如 CPU 或内存)时,kubelet 将强制实施这些限制,使正在运行的容器无法使用超出设置限制的资源。
  • 要维持应用程序的可用性,请定义 Pod 中断预算,以确保群集中只有最少量的 Pod 可供使用。
  • 优先级类可用于指示 Pod 的重要性。 如果无法计划 Pod,计划程序将尝试抢占(逐出)低优先级 Pod,以便计划可能的挂起 Pod。
  • 使用 Kubernetes 排斥和容许将资源密集型应用程序放在特定节点上,并避免出现干扰邻居问题。 将节点资源保留给需要它们的工作负载使用,但不允许在节点上计划其他工作负载。
  • 使用节点选择器、节点亲和性或 Pod 间亲和性来控制节点上的 Pod 计划。 使用 Pod 间亲和性与反亲和性设置,归置具有琐碎通信的 Pod,将 Pod 放置在不同节点上,避免在同一节点上运行相同 Pod 类型的多个实例。

服务网格注意事项

尽管服务网格注意事项并非与 AKS 中的多租户完全相关,但我们认为它们是部署此解决方案时的重要要求:

  • 请考虑使用 AKS 群集中的开源服务网格(例如 Istio、Linkerd、Consul 或开放式服务网格),以便通过相互 TLS 提高微服务的可观测性、可靠性和安全性。 还可以实施流量分解策略(例如蓝/绿部署和 canary 部署)。 简而言之,服务网格是一种专用的基础结构层,可实现安全、快速和可靠的服务间通信。 若要查看 AKS 集成的 Istio 加载项,请参阅: Istio 服务网格 AKS 加载项

  • 请考虑采用 Dapr 来构建可复原、微服务无状态和有状态应用程序。 可以使用任何编程语言和开发人员框架。

DevOps 注意事项

  • 使用 DevOps 系统(例如 GitHub ActionsAzure DevOps),将工作负载部署到 Azure Kubernetes Service (AKS),并在 CI/CD 管道中使用 Helm 图表。 有关详细信息,请参阅构建并部署到 Azure Kubernetes 服务

  • 在应用程序生命周期管理中引入 A/B 测试和 canary 部署,以便在应用程序可供所有用户使用之前对其进行适当测试。 可以使用多种方法在同一服务的不同版本之间拆分流量。

  • 作为替代方法,可以使用服务网格实现提供的流量拆分功能。 有关详细信息,请参阅:

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

监视注意事项

尽管监视注意事项并非与 Azure Kubernetes 服务 (AKS) 中的多租户完全相关,但我们认为它们是部署此解决方案时的重要要求:

  • 请考虑使用 Azure 集成的 监视选项 来监视 AKS 群集和工作负荷的运行状况。
  • 配置所有 PaaS 服务(例如 Azure 容器注册表和 Key Vault),以将诊断日志和指标收集到 Azure Monitor Log Analytics 中。

成本优化

此体系结构的成本取决于配置方面,如下所示:

  • 服务层
  • 可伸缩性,表示为支持给定需求,服务动态分配的实例数
  • 自动化脚本
  • 灾难恢复级别

评估这些方面后,请访问 Azure 定价计算器来估算成本。 此外,有关更多定价优化选项,请参阅 Microsoft Azure 架构良好的框架中的成本优化原则

部署此方案

可在 GitHub 上获得该方案的源代码。 还可以在此 GitHub 存储库中找到演示应用程序,如下图所示。

显示此 AGIC 与 AKS 体系结构的部署的图片。

下载此体系结构的 Visio 文件

先决条件

对于联机部署,你必须拥有现有的 Azure 帐户。 如果需要,请在开始之前创建一个免费 Azure 帐户

部署到 Azure

  1. 确保你拥有 Azure 订阅信息。

  2. 首先克隆工作台 GitHub 存储库

    git clone https://github.com/Azure-Samples/aks-agic.git
    
  3. 按照 README.md 文件中提供的说明进行操作。

作者

本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。

主要作者:

后续步骤

Azure Kubernetes 服务

Azure 应用程序网关

Azure 应用程序网关入口控制器

Azure 应用程序网关 WAF

架构指南

参考体系结构