在 Azure Kubernetes 服务 (AKS) 中配置静态出口网关

AKS 中的静态出口网关提供了一种简化的解决方案,用于为来自 AKS 工作负载的出站流量配置固定源 IP 地址。 借助此功能,可以通过专用的“网关节点池”路由出口流量。 通过使用静态出口网关,可以有效地管理和控制出站 IP 地址,并确保 AKS 工作负载可以使用预定义 IP 安全且一致地与外部系统通信。

本文提供了在 AKS 群集中设置静态出口网关节点池的分步说明,支持你为 Kubernetes 工作负载的出站流量配置固定源 IP 地址。

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

限制和注意事项

  • 带有 Azure CNI Pod 子网的群集不支持静态出口网关。

  • Kubernetes 网络策略不适用于通过网关节点池离开群集的流量。

    • 这不应影响群集流量控制,因为只有从带批注的 Pod 路由到网关节点池的出口流量才会受到影响。
  • 网关节点池不适用于常规用途工作负载,并且应仅用于出口流量。

  • 不能将 Windows 节点池用作网关节点池。

  • 不能向 hostNetwork Pod 添加注释以使用网关节点池。

开始之前

安装 Azure CLI aks-preview 扩展

  1. 使用 az extension add 命令安装 aks-preview 扩展。

    az extension add --name aks-preview
    
  2. 使用 az extension update 命令更新到扩展的最新版本。

    az extension update --name aks-preview
    

注册 StaticEgressGatewayPreview 功能标志

  1. 使用 az feature register 命令注册 StaticEgressGatewayPreview 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "StaticEgressGatewayPreview"
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "StaticEgressGatewayPreview"
    
  3. 当状态反映为已注册时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册。

    az provider register --namespace Microsoft.ContainerService
    

使用静态出口网关创建或更新 AKS 群集

必须先为 AKS 群集启用静态出口网关功能,然后才能创建和管理网关节点池。 可以在创建新群集或使用 az aks update 更新现有群集时执行此操作。

az aks create -n <cluster-name> -g <resource-group> --enable-static-egress-gateway

创建网关节点池

启用该功能后,请创建专用网关节点池。 此节点池回通过指定的公共 IP 前缀处理出口流量。 --gateway-prefix-size 是要应用于网关节点池节点的公共 IP 前缀的大小。 允许的范围为 28-31

az aks nodepool add --cluster-name <cluster-name> \
    --name <nodepool-name> \
    --resource-group <resource-group> \
    --mode gateway \
    --node-count <number-of-nodes> \
    --gateway-prefix-size <prefix-size>

备注

  • 节点数必须符合所选前缀大小允许的容量。 例如,/30 前缀最多支持 4 个节点,并且至少需要 2 个节点才能实现高可用性。 由于无法动态调整节点计数,因此请根据由前缀大小设置的固定限制规划节点。
  • 可以使用 --vm-size 参数定义要在网关节点池中使用的 VM 的 SKU。 应了解具体的需求并相应地进行计划,以确保适当的性能和成本平衡。

缩放网关节点池(可选)

如有必要,可以在前缀大小定义的限制内调整网关节点池的大小,但它不支持自动缩放。

az aks nodepool scale --cluster-name <cluster-name> -n <nodepool-name> --node-count <desired-node-count>

创建静态网关配置

通过创建 StaticGatewayConfiguration 自定义资源定义网关配置。 此配置指定了要使用的节点池和公共 IP 前缀。

apiVersion: egressgateway.kubernetes.azure.com/v1alpha1
kind: StaticGatewayConfiguration
metadata:
  name: <gateway-config-name>
  namespace: <namespace>
spec:
  gatewayNodepoolName: <nodepool-name>
  excludeCidrs:  # Optional
  - 10.0.0.0/8
  - 172.16.0.0/12
  - 169.254.169.254/32
  publicIpPrefixId: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/publicIPPrefixes/<prefix-name> # Optional

提示

如果未设置 publicIpPrefixId,将会自动创建公共 IP 前缀。 运行 kubectl describe StaticGatewayConfiguration <gateway-config-name> -n <namespace> 时,可以在状态中看到“出口 IP 前缀”。 这是新创建的公共 IP 前缀。 还可以通过在 publicIpPrefixId 参数中指定现有公共 IP 前缀的资源 ID 来使用现有公共 IP 前缀。 在这种情况下,需要向 AKS 群集的标识授予“网络参与者”角色。

批注 Pod 以使用网关配置

要通过网关节点池路由来自特定 Pod 的流量,请批注部署配置中的 Pod 模板。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <deployment-name>
  namespace: <namespace>
spec:
  template:
    metadata:
      annotations:
        kubernetes.azure.com/static-gateway-configuration: <gateway-config-name>

备注

每个节点上的 CNI 插件将自动配置 Pod,以通过所选网关节点池路由其流量。

监视和管理网关配置

部署后,可以通过 AKS 群集监视网关配置的状态。 StaticGatewayConfiguration 资源中的状态部分会进行更新,以包括分配的 IP 和 WireGuard 配置等详细信息。

删除网关节点池(可选)

要移除网关节点池,请确保在删除之前对所有关联配置进行相应的处理。

az aks nodepool delete --cluster-name <cluster-name> -n <nodepool-name>

禁用静态出口网关功能(可选)

如果不再需要静态出口网关,则可以禁用该功能并卸载操作员。 请务必首先删除所有网关节点池。

az aks update -n <cluster-name> -g <resource-group> --disable-static-egress-gateway

通过执行这些步骤,可以在 AKS 群集中有效地设置和管理静态出口网关配置,从而实现来自工作负载的受控且一致的出口流量。