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

Azure Kubernetes 服务 (AKS) 中的 Static Egress Gateway 可将 Pod 出站流量经由具有固定源 IP 地址的专用网关节点池进行路由。 本文介绍如何启用该功能、配置网关、路由 Pod 流量以及监视或删除配置。

限制和注意事项

  • 带有 Azure CNI Pod 子网的群集不支持静态出口网关。
  • 静态出口网关支持仅限 IPv4 的群集,在双堆栈群集中不受支持。
  • Kubernetes 网络策略不会应用于带有注解的 Pod 经由网关节点池路由的流量。 其他群集流量不受影响。
  • 仅将网关节点池用于出站流量,不要用于通用工作负载。
  • 不能将 Windows 节点池用作网关节点池。
  • 无法通过为 hostNetwork Pod 添加注解来使用网关节点池。
  • 如果 Pod 与 StaticGatewayConfiguration 资源位于同一命名空间,则它们只能使用网关节点池。

Prerequisites

  • Azure CLI 2.75.0 或更高版本。 运行 az version 来查找已安装的版本。 如需进行安装或升级,请参阅安装 Azure CLI

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

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

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

若要在现有群集上启用静态出口网关,请运行以下命令:

az aks update --name <cluster-name> --resource-group <resource-group> --enable-static-egress-gateway

创建网关节点池

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

前缀大小 可用的 IP 地址 最大网关节点数
/28 16 16
/29 8 8
/30 4 4
/31 2 2
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。 应了解具体的需求并相应地进行计划,以确保适当的性能和成本平衡。

缩放网关节点池

在其公共 IP 前缀容量范围内手动扩缩容网关节点池。 网关节点池不支持集群自动扩缩程序。

az aks nodepool scale --cluster-name <cluster-name> \
  --name <nodepool-name> \
  --resource-group <resource-group> \
  --node-count <desired-node-count>

创建 StaticGatewayConfiguration 资源

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

领域 Required Description
gatewayNodepoolName 是的 用于处理出口流量的网关节点池的名称。
excludeCidrs 绕过网关并使用 Pod 主网络接口的目标 CIDR。
publicIpPrefixId 现有公共 IP 前缀的资源 ID。 如果省略,控制器将创建前缀。
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

将清单另存为 static-gateway-configuration.yaml,然后应用它:

kubectl apply -f static-gateway-configuration.yaml

等待控制器填充 .status.egressIpPrefix ,然后才能创建或重启带批注的工作负荷。 运行以下命令,直到返回分配的前缀:

kubectl get staticgatewayconfiguration <gateway-config-name> \
    --namespace <namespace> \
    --output jsonpath='{.status.egressIpPrefix}'

提示

如果省略 publicIpPrefixId,控制器将创建公共 IP 前缀。 运行 kubectl describe StaticGatewayConfiguration <gateway-config-name> --namespace <namespace> 并在状态中检查 Egress Ip Prefix。 若要使用现有前缀,请在其中指定其资源 ID publicIpPrefixId ,并向 AKS 群集标识授予网络参与者角色。

使用专用 IP 地址配置静态出口网关

重要

静态专用 IP 支持为预览版,需要运行 Kubernetes 版本 1.34 或更高版本的群集。

如果需要将出口流量保留在专用地址上,请创建使用 VirtualMachines VM 集类型的网关节点池。 节点公共 IP 默认处于禁用状态。 StaticGatewayConfiguration以下步骤中的资源单独禁用出口的公共 IP 预配。

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

提示

指定 --vnet-subnet-id 从自定义子网分配网关节点的专用 IP 地址。 单独的子网可以改进网络隔离和 IP 地址规划。

重要

专用 IP 模式不会创建出站路由。 在为工作负载添加注释之前,请先通过结合 Azure 防火墙 或其他网络虚拟设备使用用户定义路由,或使用 ExpressRoute,配置从网关节点池子网到预期目标的路由。 有关详细信息,请参阅在 AKS 中使用出站类型自定义群集出口。 仅指定 --vnet-subnet-id 并不能提供出站连接。

provisionPublicIps: false 设置为禁用公共 IP 预配,并在 StaticGatewayConfiguration 的整个生命周期内保留分配给网关节点的私有 IP。 gatewayNodepoolName 值必须与您使用 --vm-set-type VirtualMachines 创建的网关节点池匹配。

apiVersion: egressgateway.kubernetes.azure.com/v1alpha1
kind: StaticGatewayConfiguration
metadata:
  name: <gateway-config-name>
  namespace: <namespace>
spec:
  gatewayNodepoolName: <nodepool-name>
  provisionPublicIps: false

将清单另存为 static-gateway-configuration.yaml,然后应用它:

kubectl apply -f static-gateway-configuration.yaml

在创建或重启带批注的工作负荷之前,请运行以下命令,直到 .status.egressIpPrefix 包含分配的专用 IP 地址:

kubectl get staticgatewayconfiguration <gateway-config-name> \
  --namespace <namespace> \
  --output jsonpath='{.status.egressIpPrefix}'

运行 kubectl describe StaticGatewayConfiguration <gateway-config-name> -n <namespace>时,该 egressIpPrefix 字段会显示这些静态专用 IP 的逗号分隔列表。 继续对工作流的其余部分使用相同的 API 和清单,包括 StaticGatewayConfiguration 资源和 Pod 注释。

为 Pod 添加注解以使用网关配置

若要通过网关节点池路由来自特定 Pod 的流量,请将 kubernetes.azure.com/static-gateway-configuration 批注添加到 Pod 模板。 将注解值设置为同一命名空间中某个 StaticGatewayConfiguration 资源的 metadata.name

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 配置为使其流量经由所选的网关节点池进行路由。

创建 Pod 时,CNI 插件会配置网关。 如果您在添加注解时没有替换现有 Pod,请重启工作负载。 例如,使用以下命令重启部署:

kubectl rollout restart deployment <deployment-name> --namespace <namespace>

监控静态出口网关配置

若要监视配置,请检索完整的 StaticGatewayConfiguration 资源:

kubectl get staticgatewayconfiguration <gateway-config-name> \
  --namespace <namespace> \
  --output yaml

在本 status 部分中,验证以下字段:

  • egressIpPrefix 包含分配的公共 IP 前缀或专用 IP 地址。
  • gatewayServerProfile.ipgatewayServerProfile.port 标识网关终结点。
  • gatewayServerProfile.publicKey 包含 WireGuard 配置的公钥,用于定义 Pod 与网关节点池之间的加密隧道。

删除网关节点池

在删除网关节点池之前,请从 Pod 模板中删除网关注释,并替换现有 Pod,或删除使用该池的工作负荷。 然后,删除每个引用该节点池的 StaticGatewayConfiguration。 该命令会在控制器的清理终结器完成后才返回:

kubectl delete staticgatewayconfiguration <gateway-config-name> \
  --namespace <namespace> \
  --wait=true \
  --timeout=5m

删除引用节点池的所有配置后,删除网关节点池:

az aks nodepool delete --cluster-name <cluster-name> \
  --name <nodepool-name> \
  --resource-group <resource-group>

禁用静态出口网关功能

如果不再需要静态出口网关,请禁用该功能并卸载操作员:

  1. 删除每一个 StaticGatewayConfiguration ,并等待其清理完成。

  2. 删除每个网关节点池。

    az aks nodepool delete --cluster-name <cluster-name> \
      --name <nodepool-name> \
      --resource-group <resource-group>
    
  3. 禁用静态出口网关。

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