非标准资源组中的 Azure AKS Public IP

Azure AKS Public IP in Non-standard Resource Group

我一直在尝试通过 Terraform 管理 Azure Kubernetes 服务 (AKS) 实例。当我根据 this MS tutorial, then install an ingress controller with a static public IP, per this MS tutorial 通过 Azure CLI 创建 AKS 实例时,一切正常。此方法隐式创建服务主体 (SP)。

当我通过 Terraform 创建一个与 AKS 集群完全相同的副本时,我不得不明确提供服务主体。我已经为这个新的 SP "Contributor" 授予了对集群的整个资源组的访问权限,当我进入创建入口控制器的步骤时(使用上面教程 2 提供的相同命令:helm install stable/nginx-ingress --set controller.replicaCount=2 --set controller.service.loadBalancerIP="XX.XX.XX.XX"),入口服务出现,但它从未获得其 public IP。 IP 状态无限期地保持“”,我在任何日志中都找不到任何关于原因的信息。是否有日志可以告诉我为什么我的 IP 仍处于待处理状态?

同样,我相当确定,除了 SP,Terraform AKS 集群与根据 MS 教程创建的集群完全相同。 运行 terraform plan 发现两者之间没有区别。有谁知道我的 AKS SP 可能需要什么许可或者我在这里可能还缺少什么?奇怪的是,我找不到通过 Azure 门户分配给隐式创建的主体的任何权限,但我想不出任何其他可能导致此行为的原因。

不确定这是否是转移注意力,但其他用户在针对第二个教程打开的问题的上下文中抱怨过类似的问题。他们的解决方案似乎总是 "tear down your cluster and retry",但在这种情况下这不是可接受的解决方案。我需要一个可重现的工作集群,azurerm_kubernetes_cluster 目前不允许使用隐式创建的 SP 构建 AKS 实例。

为了后代,我要回答我自己的问题。原来问题出在我创建静态 public IP 的资源组。 AKS 群集使用两个资源组:您在其中显式创建群集的组,以及由群集隐式创建的第二个组。第二,隐式资源组总是获得一个以 "MC_" 开头的名称(名称的其余部分是显式 RG、集群名称和区域的派生词)。

无论如何,默认的 AKS 配置要求在该隐式资源组中创建 public IP。假设您使用 Terraform 创建了 AKS 集群,其名称将在 ${azurerm_kubernetes_cluster.NAME.node_resource_group}.

中导出

编辑 2019-05-23

自撰写本文以来,我们发现了一个用例,使用 MC_* 资源组的变通方法不足以解决这个问题。我向 MS 开了一张支持票,他们指示我去 this solution。将以下注释添加到您的 LoadBalancer(或 Ingress 控制器),并确保 AKS SP 在目标资源组中至少具有 Network Contributor 权限(在下面的示例中为 myResourceGroup):

metadata:
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-resource-group: myResourceGroup

这为我们彻底解决了这个问题。

我现在还不能发表评论,所以把这个添加作为答案。

Derek 是对的,您完全可以使用来自不同于预配 AKS 群集的资源组的现有 IP。 There is the documentation page。只需确保您已完成以下两个步骤:

  1. 将 AKS 服务主体的“网络参与者”角色分配添加到现有静态 IP 所在的资源组。

  2. 使用以下命令将 service.beta.kubernetes.io/azure-load-balancer-resource-group: myResourceGroup 添加到入口控制器:

kubectl annotate service ingress-nginx-controller -n ingress service.beta.kubernetes.io/azure-load-balancer-resource-group=datagate

安装 Helm Chart 时设置静态 IP 资源组

这是 nginx-controller 的最小 helm 安装命令,当静态 IP 位于与集群管理节点资源组不同的资源组中时,该命令有效。

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.replicaCount=1 \
  --set controller.service.externalTrafficPolicy=Local \
  --set controller.service.loadBalancerIP=$ingress_controller_ip \
  --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"=$STATIC_IP_ROSOURCE_GROUP

关键是最后覆盖提供静态IP的资源组

另外请注意,如果您的根路径没有 return 成功的 http 响应,您可能需要自定义负载均衡器健康探测。为此,我们额外添加以下内容(将 /healthz 替换为您的探测 EP):

附加说明:运行状况探测端点

--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz

版本

Kubernetes 1.22.6
ingress-nginx-4.1.0
ingress-nginx/controller:v1.2.0