本指南介绍如何使用 Terraform 和 Azure DevOps 在中心辐射型网络拓扑中创建专用 AKS 群集。 Azure 防火墙用于检查传入和传出 Azure Kubernetes 服务 (AKS) 群集的流量。 群集由与中心虚拟网络对等互连的一个或多个分支虚拟网络托管。
体系结构
下载此体系结构的 Visio 文件。
工作流
Terraform 模块用于部署一个包含四个子网的新虚拟网络,这些子网托管:
- AKS 群集 (AksSubnet)。
- 跳板虚拟机 (VM) 和专用终结点 (VmSubnet)。
- 应用程序网关 WAF2 (AppGatewaySubnet)。
- Azure Bastion (AzureBastionSubnet)。
AKS 群集使用用户定义的托管标识来创建其他资源,例如 Azure 中的负载均衡器与托管磁盘。 使用 Terraform 模块,可以选择部署具有以下功能的 AKS 群集:
- 适用于 Azure 磁盘和 Azure 文件的容器存储接口 (CSI)
- AKS 托管的 Microsoft Entra 集成
- Azure RBAC 用于 Kubernetes 授权
- 取代服务主体的托管标识
- Azure 网络策略
- Azure Monitor 容器见解
- 应用程序网关入口控制器
- IP 动态分配和增强版子网支持
AKS 群集由以下池组成:
- 仅托管关键系统 Pod 和服务的系统节点池
- 托管用户工作负载和项目的用户节点池
一个 VM 部署在托管该 AKS 群集的虚拟网络中。 将 AKS 部署为专用群集时,系统管理员可以使用此 VM 通过 Kubernetes 命令行工具管理群集。 VM 的启动诊断日志存储在 Azure 存储帐户中。
Azure Bastion 主机通过 SSL 提供与跳板 VM 之间具有更高安全性的 SSH 连接。 Azure 容器注册表用于生成、存储和管理容器映像与项目(例如 Helm 图表)。
AKS 没有提供内置解决方案来保护群集和外部网络之间的入口和出口流量。
因此,本文中介绍的体系结构包括一个 Azure 防火墙,它使用 DNAT 规则、网络规则和应用程序规则控制入站和出站流量。 防火墙还通过基于威胁情报的筛选来保护工作负荷。 Azure 防火墙和 Bastion 部署到与托管专用 AKS 群集的虚拟网络对等互连的中心虚拟网络。 路由表和用户定义的路由将出站流量从 AKS 群集路由到 Azure 防火墙。
注意
强烈建议使用 Azure 防火墙的高级 SKU,因为它提供高级威胁防护。
在 AKS 上运行的工作负载将密钥保管库用作机密存储,以通过 Microsoft Entra 工作负载 ID、机密存储 CSI 驱动程序或 Dapr 检索密钥、证书和机密。 Azure 专用链接使 AKS 工作负载能够通过虚拟网络中的专用终结点访问 Azure Key Vault 等 Azure PaaS 服务。
拓扑包括这些服务的专用终结点和专用 DNS 区域:
托管 AKS 群集的虚拟网络与前面描述的专用 DNS 区域之间存在虚拟网络链接。
Log Analytics 工作区用于从 Azure 服务收集诊断日志和指标。
组件
Azure 防火墙是一种云原生的智能网络防火墙安全服务,用于为 Azure 中运行的云工作负载提供威胁防护。 它是一个服务形式的完全有状态防火墙,具有内置的高可用性和不受限制的云可伸缩性。 它提供东西流量和南北流量检查。
容器注册表是基于开源 Docker Registry 2.0 的托管专用 Docker 注册表服务。 可以将 Azure 容器注册表与现有容器开发和部署管道配合使用,也可使用容器注册表任务在 Azure 中生成容器映像。
Azure Kubernetes 服务通过减少 Azure 的运营开销,简化了在 Azure 中部署托管 Kubernetes 群集的过程。 作为一个托管的 Kubernetes 服务,Azure 可以自动处理运行状况监视和维护等关键任务。 由于 Kubernetes 主节点由 Azure 管理,因此你只需要管理和维护代理节点。
Key Vault 以更高的安全性存储机密(例如 API 密钥、密码、证书和加密密钥)并控制对这些机密的访问。 Key Vault 也可用来轻松预配、管理和部署公用和专用传输层安全性/安全套接字层 (TLS/SSL) 证书,以用于 Azure 以及内部连接资源。
Azure Bastion 是在虚拟网络中预配的完全托管的平台即服务 (PaaS)。 Azure Bastion 直接从 Azure 门户通过 TLS 为虚拟网络中的 VM 提供安全性更高的远程桌面协议 (RDP) 和安全外壳 (SSH) 连接。
Azure 虚拟机提供了一种可缩放的按需计算资源,可用于灵活地进行虚拟化。
Azure 虚拟网络是 Azure 专用网络的基本构建基块。 通过 Azure 虚拟网络,Azure 资源(如 VM)能够以更高的安全性彼此通信、与 Internet 通信以及与本地网络通信。 Azure 虚拟网络类似于本地的传统网络,但具有 Azure 基础结构的优势,例如可缩放性、可用性和隔离性。
虚拟网络接口允许 Azure VM 与 Internet、Azure 及本地资源进行通信。 可以将多个网络接口卡添加到一个 Azure VM,以便子 VM 可以具有其自己的专用网络接口设备和 IP 地址。
Azure 托管磁盘在 Azure VM 上提供由 Azure 管理的块级存储卷。 超级磁盘、高级固态硬盘 (SSD)、标准 SSD 和标准硬盘驱动器 (HDD) 均可供使用。
Blob 存储是适用于云的对象存储解决方案。 Blob 存储最适合存储巨量的非结构化数据。
专用链接可用于通过虚拟网络中的专用终结点访问 Azure PaaS 服务(例如 Blob 存储和 Key Vault)。 还可以使用它访问你拥有的或由 Microsoft 合作伙伴提供的 Azure 托管服务。
备选方法
可以使用 Azure 市场中的第三方防火墙,而不是 Azure 防火墙。 如果这样做,你应负责正确配置防火墙,以检查并允许或拒绝来自 AKS 群集的入站和出站流量。
方案详细信息
AKS 群集部署在虚拟网络上,可以进行管理或自定义。 但无论如何,群集都对虚拟网络外部服务具有出站依赖关系。 为了便于管理和操作,AKS 群集节点需要访问与这些出站依赖项相关的特定端口和完全限定的域名 (FQDN)。 这包括访问你自己群集的 Kubernetes API 服务器、下载和安装群集组件,以及从 Microsoft 容器注册表拉取容器映像。 这些出站依赖项是使用 FQDN 定义的,并且缺少静态地址,因此无法使用网络安全组锁定出站流量。 因此,AKS 群集提供不受限制的出站(出口)Internet 访问,默认情况下允许节点和服务根据需要访问外部资源。
但是,在生产环境中,通常需要保护 Kubernetes 群集免受数据泄露和其他不希望的网络流量的影响。 所有网络流量(包括传入和传出)都应根据安全规则进行控制。 为了实现这一目标,需要限制出口流量,同时仍然允许访问必要的端口和地址,以执行日常群集维护任务、出站依赖关系和工作负荷要求。
一个简单的解决方案是使用可基于域名控制出站流量的防火墙设备。 防火墙在受信任的网络和 Internet 之间创建了一道屏障。 使用 Azure 防火墙根据目标的 FQDN、协议和端口限制出站流量,从而提供精细的出口流量控制。 它还允许列出与 AKS 群集的出站依赖项关联的 FQDN,这在网络安全组中是不可能的。 同样,部署到共享外围网络的 Azure 防火墙上的基于威胁情报的筛选器可以控制入口流量并提高安全性。 此筛选功能可以生成警报,并拒绝传入和传出已知恶意 IP 地址和域的流量。
可以使用 Terraform 和 Azure DevOps 在中心辐射型网络拓扑中创建专用 AKS 群集。 Azure 防火墙用于检查传入和传出 Azure Kubernetes 服务 (AKS) 群集的流量。 群集由与中心虚拟网络对等互连的一个或多个分支虚拟网络托管。
Azure 防火墙支持使用三种不同的 SKU 来满足各种客户用例和偏好:
- 建议使用 Azure 防火墙高级版来保护高度敏感的应用程序,例如付款处理。 它支持恶意软件和 TLS 检查等高级威胁防护功能。
- 对于寻求第 3 层至第 7 层防火墙并需要自动缩放以处理最高 30 Gbps 的峰值流量期的客户,建议使用 Azure 防火墙标准版。 它支持威胁情报、DNS 代理、自定义 DNS 和 Web 类别等企业功能。
- 对于吞吐量需求低于 250 Mbps 的客户,建议使用 Azure 防火墙基本版。
下表显示了三个 Azure 防火墙 SKU 的功能。 有关详细信息,请参阅 Azure 防火墙定价。
默认情况下,AKS 群集具有不受限制的出站 Internet 访问权限。 此级别的网络访问权限允许 AKS 群集中运行的节点和服务根据需要访问外部资源。 如果要限制出口流量,则必须保持有限数量的端口和地址可供访问,以使正常的群集维护任务可以继续执行。 为来自 AKS 等 Kubernetes 群集的出站流量提供安全性的最简单方法是,使用可以根据域名控制出站流量的软件防火墙。 Azure 防火墙可以根据目标的完全限定的域名 (FQDN) 限制出站 HTTP 和 HTTPS 流量。 你还可配置防火墙和安全规则,以允许这些必需的端口和地址。 有关详细信息,请参阅控制 AKS 中群集节点的出口流量。
同样,可以通过在部署到共享外围网络的 Azure 防火墙上启用基于威胁情报的筛选来控制入口流量并提高安全性。 此筛选功能可以发出警报,并拒绝传入和传出已知恶意 IP 地址和域的流量。
可能的用例
此方案解决了提高进出 Kubernetes 群集的入站和出站流量的安全性的需求。
避免非对称路由
在此解决方案中,Azure 防火墙将部署到中心虚拟网络,并且专用 AKS 群集将部署到分支虚拟网络。 Azure 防火墙使用网络和应用程序规则集合来控制出口流量。 在这种情况下,需要将 AKS 上运行的任何服务公开的任何公共终结点的入口流量配置为通过 Azure 防火墙使用的公共 IP 地址之一进入系统。
数据包抵达防火墙的公共 IP 地址,但通过专用 IP 地址返回到防火墙(使用默认路由)。 这是个问题。 为避免此问题,请为防火墙的公共 IP 地址创建另一个用户定义的路由,如下图所示。 发往防火墙公共 IP 地址的数据包将通过 Internet 来路由。 此配置可以避免使用默认路由将数据包发送到防火墙的专用 IP 地址。
若要将 AKS 工作负载的流量路由到中心虚拟网络中的 Azure 防火墙,需要:
- 创建路由表并将其关联到托管群集工作器节点的每个子网。
- 创建用户定义的路由,将 0.0.0.0.0/0 CIDR 的流量转发到 Azure 防火墙的专用 IP 地址。 对于“下一个跃点类型”,请指定“虚拟设备”。
有关详细信息,请参阅教程:使用 Azure 门户部署和配置 Azure 防火墙。
有关详细信息,请参阅:
在使用 Azure DevOps 的情况下将工作负载部署到专用 AKS 群集
如果使用 Azure DevOps,请注意,你将无法使用 Azure DevOps Microsoft 托管的代理将工作负载部署到专用 AKS 群集。 它们无权访问其 API 服务器。 若要将工作负载部署到专用 AKS 群集,需要在专用 AKS 群集所在的虚拟网络中或在对等虚拟网络中预配和使用 Azure DevOps自托管代理。 在后一种情况下,请确保在节点资源组中 AKS 群集的专用 DNS 区域与托管 Azure DevOps 自托管代理的虚拟网络之间创建虚拟网络链接。
可以在虚拟机上部署单个 Windows 或 Linux Azure DevOps 代理,也可以使用虚拟机规模集。 有关详细信息,请参阅 Azure 虚拟机规模集代理。 作为替代方法,可以将 Azure Pipelines 中的自托管代理设置为通过 Docker 运行于 Windows Server Core 容器(适用于 Windows 主机)或 Ubuntu 容器(适用于 Linux 主机)中。 将其部署为在专用 AKS 群集中具有一个或多个副本的 Pod。 有关详细信息,请参阅:
- Self-hosted Windows agents(自托管 Windows 代理)
- Self-hosted Linux agents(自托管 Linux 代理)
- 在 Docker 中运行自托管代理
如果托管专用 AKS 群集节点池的子网配置为通过路由表和用户定义的路由将出口流量路由到 Azure 防火墙,请确保创建适当的应用程序和网络规则。 这些规则需要允许代理访问外部站点,以便在代理虚拟机上下载和安装 Docker、Kubectl、Azure CLI 和 Helm 等工具。 有关详细信息,请参阅在 Docker 中运行自承载代理。
或者,可以在托管 AKS 群集的虚拟网络或对等互连虚拟网络中配置托管 DevOps 池 (MDP)。 开发团队可以使用托管 DevOps 池创建针对其特定需求量身定制的 Azure DevOps 代理池。 它会实现安全最佳做法,提供平衡成本和性能的选项,为最常见的方案提供路径,并显著减少创建和维护自定义池所用的时间。 有关详细信息,请参阅 Microsoft 托管 DevOps 池体系结构概述。
可以从虚拟网络中的托管 DevOps 池添加代理,允许 CI/CD 管道与专用 AKS 群集的 Kubernetes API 服务器交互,并访问 Azure 资源(如 Azure 容器注册表),这些资源已禁用公共网络访问,并且只能通过在同一虚拟网络或对等网络中定义的专用终结点访问。 有关详细信息,请参阅配置托管 DevOps 池网络。
在公共标准负载均衡器前使用 Azure 防火墙
Terraform 模块中的资源定义使用 lifecycle 元参数来自定义当 Azure 资源在 Terraform 控制范围之外发生更改时的操作。 ignore_changes 参数用于指示 Terraform 忽略给定资源属性(如标记)的更新。 Azure 防火墙策略资源定义包含一个生命周期块,以防止 Terraform 在规则集合或单个规则被创建、更新或删除时更新资源。 同样,Azure 路由表包含一个生命周期块,以防止 Terraform 在用户定义的路由被创建、删除或更新时更新资源。 这样,你就可以在 Terraform 控制范围之外管理 Azure 防火墙策略的 DNAT、应用程序和网络规则以及 Azure 路由表的用户定义路由。
与本文关联的示例包含一个 Azure DevOps CD 管道,该管道演示如何使用在自托管代理上运行的 Azure DevOps 管道将工作负载部署到专用 AKS 群集。 该示例使用公共 Helm 图表部署 Bitnami redmine 项目管理 Web 应用程序。 此图显示了示例的网络拓扑:
下面是消息流:
- 对 AKS 托管的 Web 应用程序的请求将发送到 Azure 防火墙通过公共 IP 配置公开的公共 IP。 公共 IP 和公共 IP 配置都专用于此工作负载。
- Azure 防火墙 DNAT 规则将 Azure 防火墙公共 IP 地址和端口转换为节点资源组中 AKS 群集的 Kubernetes 公共标准负载均衡器中的工作负载使用的公共 IP 和端口。
- 负载均衡器将请求发送到在 AKS 群集的某个代理节点上运行的某个 Kubernetes 服务 Pod。
- 响应消息将通过用户定义的路由发送回原始调用方。 Azure 防火墙公共 IP 是地址前缀,“Internet”是“下一个跃点类型”。
- 任何工作负载发起的出站调用都通过默认的用户定义路由路由到 Azure 防火墙的专用 IP 地址。 “0.0.0.0/0”是地址前缀,“虚拟设备”是“下一个跃点类型”。
有关详细信息,请参阅在 AKS 群集的公共标准负载均衡器前使用 Azure 防火墙。
在内部标准负载均衡器前使用 Azure 防火墙
在与本文相关的示例中,ASP.NET Core 应用程序由 AKS 群集作为服务托管,并以 NGINX 入口控制器为前端。 NGINX 入口控制器通过内部负载均衡器公开,该负载均衡器在托管 AKS 群集的分支虚拟网络中具有专用 IP 地址。 有关详细信息,请参阅在 AKS 中创建内部虚拟网络的入口控制器。 在元数据部分中设置了 service.beta.kubernetes.io/azure-load-balancer-internal: "true"
注释的情况下部署 NGINX 入口控制器(或更常见的 LoadBalancer
或 ClusterIP
服务)时,会在节点资源组下创建一个名为 kubernetes-internal
的内部标准负载均衡器。 有关详细信息,请参阅将内部负载均衡器与 AKS 配合使用。 如下图所示,测试 Web 应用程序通过专用 Azure 公共 IP 由 Azure 防火墙公开。
下面是消息流:
- 对 AKS 托管的测试 Web 应用程序的请求将发送到 Azure 防火墙通过公共 IP 配置公开的公共 IP。 公共 IP 和公共 IP 配置都专用于此工作负载。
- Azure 防火墙 DNAT 规则将 Azure 防火墙公共 IP 和端口转换为节点资源组中 AKS 群集的内部标准负载均衡器中的 NGINX 入口控制器使用的专用 IP 和端口。
- 内部负载均衡器将请求发送到在 AKS 群集的某个代理节点上运行的某个 Kubernetes 服务 Pod。
- 响应消息将通过用户定义的路由发送回原始调用方。 “0.0.0.0/0”是地址前缀,“虚拟设备”是“下一个跃点类型”。
- 任何工作负载发起的出站调用都路由到用户定义的路由的专用 IP 地址。
有关详细信息,请参阅在内部标准负载均衡器前使用 Azure 防火墙。
注意事项
这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负荷质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架。
下面的某些注意事项是一般建议,这些建议并非特定于使用 Azure 防火来改进对 AKS 群集的保护。 我们认为它们是此解决方案的基本要求。 这适用于安全性、性能、可用性和可靠性、存储、服务网格和监视注意事项。
安全性
安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅安全性支柱概述。
Azure 平台会提供已改进的保护来应对各种威胁,如网络入侵和分布式拒绝服务 (DDoS) 攻击。 应使用 Web 应用程序防火墙 (WAF) 为公开公共 HTTPS 终结点的任何 AKS 托管的 Web 应用程序和服务提供保护。 你需要提供保护来防御 SQL 注入、跨站点脚本和其他 Web 攻击等常见威胁。 为此,请使用 Open Web Application Security Project (OWASP) 规则和自定义规则。 Web 应用程序防火墙为 Web 应用程序提供已改进的集中保护,使其免受常见攻击和漏洞的侵害。 可以将 Azure WAF 与 Azure 应用程序网关、Azure Front Door 和 Azure 内容分发网络一同部署。
DDoS 攻击是将应用程序移动到云的组织所面临的最大的可用性和安全性问题之一。 DDoS 攻击尝试耗尽应用程序的资源,使应用程序对于合法用户不可用。 DDoS 攻击的目标可以是任何可通过 Internet 公开访问的终结点。 Azure 中的每项资产都会通过 Azure DDoS 基础结构防护受到保护,无需额外费用。 全球部署的 Azure 网络的规模和容量通过始终开启的监视和实时缓解措施来更好地防御常见网络层攻击。 DDoS 基础结构防护不需要对用户配置或应用程序做出任何更改。 它会帮助保护所有 Azure 服务,包括 Azure DNS 等 PaaS 服务。
Azure DDoS 网络保护与应用程序设计最佳做法相结合,提供增强的 DDoS 缓解功能来更全面地防御 DDoS 攻击。 应在任何外围虚拟网络上启用 Azure DDOS 网络保护。
以下是一些额外的安全注意事项:
- 为 AKS 工作负载使用的任何 PaaS 服务(例如 Key Vault、Azure 服务总线和 Azure SQL 数据库)创建专用终结点。 应用程序和这些服务之间的流量将不会暴露到公共 Internet 上。 AKS 群集虚拟网络和 PaaS 服务实例之间的流量通过专用终结点流经 Microsoft 主干网络,但通信不通过 Azure 防火墙。 此机制提供更好的安全性和更好的保护来防止数据泄露。 有关详细信息,请参阅什么是 Azure 专用链接?。
- 在 AKS 群集前面使用应用程序网关时,请使用 Web 应用程序防火墙策略来帮助保护 AKS 上运行的面向公众的工作负载免受攻击。
- 通过控制哪些组件之间可以相互通信,来使用网络策略隔离和保护服务内通信。 默认情况下,Kubernetes 群集中的所有 Pod 都可以无限制地发送和接收流量。 要提高安全性,可以使用 Azure 网络策略或 Calico 网络策略来定义规则,控制不同微服务之间的通信流。 有关详细信息,请参阅网络策略。
- 不公开到 AKS 节点的远程连接。 在管理虚拟网络中创建堡垒主机或跳转盒。 使用堡垒主机将流量路由到 AKS 群集。
- 请考虑在生产环境中使用专用 AKS 群集,或者至少通过使用 AKS 中的授权 IP 地址范围来确保安全访问 API 服务器。 在公共群集上使用授权的 IP 地址范围时,允许 Azure 防火墙网络规则集合中的所有出口 IP 地址。 群集内操作使用 Kubernetes API 服务器。
- 如果在 Azure 防火墙中启用 DNS 代理,Azure 防火墙可以处理来自一个或多个虚拟网络中的 DNS 查询并将其转发到你选择的 DNS 服务器。 此功能至关重要,对网络规则中可靠的 FQDN 筛选而言是必需的。 可以在 Azure 防火墙和“防火墙策略”设置中启用 DNS 代理。 若要详细了解 DNS 代理日志,请参阅 Azure 防火墙日志和指标。
- 在应用程序网关前面使用 Azure 防火墙时,可以配置 Kubernetes 入口资源以通过 HTTPS 公开工作负载,并为每个租户使用单独的子域和数字证书。 应用程序网关入口控制器 (AGIC) 将自动配置应用程序网关侦听器以实现安全套接字层 (SSL) 终止。
- 可以在服务代理(如 NGINX 入口控制器)前使用 Azure 防火墙。 此控制器为 Kubernetes 服务提供反向代理、可配置的流量路由和 TLS 终止。 Kubernetes 入口资源用于配置各个 Kubernetes 服务的入口规则和路由。 借助入口控制器和入口规则,可以使用单个 IP 地址将流量路由到 Kubernetes 群集中的多个服务。 可以使用获得承认的证书颁发机构生成 TLS 证书。 或者,可以使用 Let's Encrypt 自动生成具有动态公共 IP 地址或具有静态公共 IP 地址的 TLS 证书。 有关详细信息,请参阅创建 HTTPS 入口控制器并在 AKS 中使用自己的 TLS 证书。
- Azure 防火墙操作员与群集和工作负载团队之间的严格协调对于初始群集部署是必要的,并且必须随着工作负载和群集需求的演变而持续进行。 当你配置由工作负载用来向客户端进行身份验证的身份验证机制(如 OAuth 2.0 和 OpenID 连接)时,尤其如此。
- 使用以下准则来帮助保护本文中所述的环境:
可用性和可靠性
可靠性可确保应用程序符合你对客户的承诺。 有关详细信息,请参阅可靠性支柱概述。
此处的可用性和可靠性注意事项并不特定于 AKS 中的多租户。 我们认为它们是此解决方案的基本要求。 请考虑以下用来优化 AKS 群集和工作负载的可用性的方法。
区域内复原
- 在部署期间,可将 Azure 防火墙配置为跨多个可用性区域,以提高可用性。 有关运行时间百分比,请参阅Azure 防火墙 SLA。 还可以因邻近之故将 Azure 防火墙与特定区域相关联,尽管此配置会影响 SLA。 在可用性区域中部署防火墙无需额外费用,包括可用性区域间数据传输。
- 请考虑跨一个地区中的所有可用性区域部署 AKS 群集的节点池。 在节点池前面使用 Azure 标准负载均衡器或应用程序网关。 如果单个数据中心的服务发生中断,此拓扑可提供更好的复原能力。 群集节点将分布到一个地区内的三个单独可用性区域中的多个数据中心。
- 在容器注册表中启用区域冗余以实现地区内复原能力和高可用性。
- 使用 Pod 拓扑分布约束来控制如何将 Pod 分布到各故障域(如地区、可用性区域和节点)中的 AKS 群集。
- 请考虑对托管任务关键型工作负载的 AKS 群集使用运行时间 SLA。 运行时间 SLA 是一个可选功能,用于为群集启用具有财务支持的更高 SLA。 对于使用可用性区域的群集,运行时间 SLA 可保证 Kubernetes API 服务器终结点的高可用性。 还可以将其用于不使用可用性区域但 SLA 较低的群集。 有关 SLA 的详细信息,请参阅运行时间 SLA。 AKS 跨更新域和容错域使用主节点副本,以确保满足 SLA 要求。
灾难恢复和业务连续性
- 请考虑将解决方案部署到地域内至少两个配对的 Azure 区域。 将全局负载均衡器(如 Azure 流量管理器或 Azure Front Door)与主动/主动或主动/被动路由方法配合使用来保证业务连续性和灾难恢复 (DR)。
- Azure 防火墙是一项区域服务。 如果跨两个或更多区域部署解决方案,则需要在每个区域中都创建一个 Azure 防火墙。 可以创建一个全局 Azure 防火墙策略,以包括组织强制要求的适用于所有区域中心的规则。 可以将此策略用作区域 Azure 策略的父策略。 使用非空父策略创建的策略从父策略继承所有规则集合。 继承自父策略的网络规则集合始终优先于作为新策略的一部分定义的网络规则集合。 相同的逻辑也适用于应用程序规则集合。 但是,不管是否继承,网络规则集合始终在应用程序规则集合之前进行处理。 有关标准策略和高级策略的详细信息,请参阅 Azure 防火墙管理器策略概述。
- 请确保在 QA 环境中编写、记录并定期测试任何区域故障转移过程。 这样做有助于避免在核心服务受到主要区域中的服务中断影响时出现不可预知的问题。 这些测试还会检查 DR 方法是否满足 RPO/RTO 目标,以及故障转移所需的最终手动过程和干预。
- 请务必测试故障回复过程,以验证它们是否按预期工作。
- 将容器映像存储在容器注册表中。 将注册表异地复制到每个 AKS 区域。 有关详细信息,请参阅 Azure 容器注册表中的异地复制。
- 如果可能,请避免在容器中存储服务状态, 而是使用支持多区域复制的 Azure PaaS。
- 如果使用 Azure 存储,请准备并测试将存储从主要区域迁移到备份区域的过程。
卓越运营
卓越运营涵盖了部署应用程序并使其在生产环境中保持运行的运营流程。 有关详细信息,请参阅卓越运营支柱概述。
DevOps
- 通过在持续集成和持续交付 (CI/CD) 管道中使用 Helm 图表,将工作负载部署到 AKS。 使用 DevOps 系统,例如 GitHub Actions 或 Azure DevOps。 有关详细信息,请参阅构建并部署到 Azure Kubernetes 服务。
- 为了在应用程序可供所有用户使用之前对其进行适当测试,请在应用程序生命周期管理中使用 A/B 测试和 canary 部署。 可以使用多种方法在同一服务的不同版本之间拆分流量。 作为替代方法,可以使用服务网格实现提供的流量拆分功能。 有关详细信息,请参阅 Linkerd 流量拆分和 Istio 流量管理。
- 使用 Azure 容器注册表或其他容器注册表(例如 Docker Hub)来存储部署到群集的专用 Docker 映像。 AKS 可以使用其 Microsoft Entra 标识对 Azure 容器注册表进行身份验证。
- 在单独的预生产环境中测试工作负载的入口和出口,该环境反映了生产环境的网络拓扑和防火墙规则。 分阶段推出策略将帮助你在将新功能或网络规则发布到生产环境之前检测出任何网络或安全问题。
监视
Azure 防火墙与 Azure Monitor 完全集成,用于记录防火墙处理的传入和传出流量。 有关详细信息,请参阅 Azure 防火墙基于威胁情报的筛选。
以下监视注意事项并不特定于 AKS 中的多租户,但我们认为它们是此解决方案的基本要求。
- 使用 Container Insights 监视 AKS 群集和工作负载的运行状态。
- 配置所有 PaaS 服务(例如容器注册表和 Key Vault),以收集诊断日志和指标。
成本优化
所得体系结构的成本取决于以下配置详细信息:
- 服务层
- 可伸缩性(为了支持给定需求而由服务动态分配的实例数)
- 自动化脚本
- 灾难恢复级别
评估这些配置详细信息后,请使用 Azure 定价计算器来估算成本。 有关更多定价优化选项,请参阅 Microsoft Azure 架构良好的框架中的成本优化原则。
部署此方案
可在 GitHub 中获得该方案的源代码。 此解决方案是开源的,并随附 MIT 许可证。
先决条件
若要进行联机部署,你必须拥有一个 Azure 帐户。 如果没有订阅,请在开始之前创建一个免费 Azure 帐户。 在使用 Azure DevOps 部署 Terraform 模块之前,需要满足以下要求:
- 将 Terraform 状态文件存储在 Azure 存储帐户中。 有关使用存储帐户存储远程 Terraform 状态、状态锁定和静态加密的详细信息,请参阅在 Azure 存储中存储 Terraform 状态。
- 创建 Azure DevOps 项目。 有关详细信息,请参阅在 Azure DevOps 中创建项目。
- 创建与 Azure 订阅的 Azure DevOps 服务连接。 创建服务连接时,可以使用服务主体身份验证 (SPA) 或 Azure 托管服务标识。 在上述任一情况下,请确保 Azure DevOps 用于连接到 Azure 订阅的服务主体或托管标识分配有整个订阅的所有者角色。
部署到 Azure
准备好你的 Azure 订阅信息。
-
git clone https://github.com/Azure-Samples/private-aks-cluster-terraform-devops.git
按照 README.md 文件中提供的说明进行操作。
作者
本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。
主要作者:
- Paolo Salvatori | 首席服务工程师
要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。
后续步骤
查看 Microsoft Azure 架构良好的框架中适用于 AKS 的建议和最佳做法:
Azure 防火墙
- 什么是 Azure 防火墙?
- Azure 防火墙策略规则集
- 配置 Azure 防火墙规则
- Azure 防火墙 DNS 代理详细信息
- Azure 防火墙高级版功能
- 基于 Azure 防火墙威胁智能的筛选
Azure Kubernetes 服务
- 创建专用 Azure Kubernetes 服务群集
- 多租户和群集隔离的最佳做法
- 有关 Azure Kubernetes 服务 (AKS) 中的基本计划程序功能的最佳做法
- 有关高级计划程序功能的最佳做法
- 身份验证和授权的最佳做法
- 有关 Azure Kubernetes 服务 (AKS) 中的群集安全性和升级的最佳做法
- Azure Kubernetes 服务 (AKS) 中容器映像管理和安全性的最佳做法
- Azure Kubernetes 服务 (AKS) 中的网络连接和安全的最佳做法
- 有关 Azure Kubernetes 服务 (AKS) 中的存储和备份的最佳做法
- Azure Kubernetes 服务 (AKS) 中实现业务连续性和灾难恢复的最佳做法
- Azure Kubernetes 服务 (AKS) 第 2 天操作指南
相关资源
架构指南
- Azure Kubernetes 服务 (AKS) 解决方案历程
- AKS 群集最佳做法
- Azure Kubernetes 服务 (AKS) 第 2 天操作指南
- 在边缘计算选项中选择 Kubernetes