3

我一直在尝试通过 Terraform 管理 Azure Kubernetes 服务 (AKS) 实例。当我按照本 MS 教程通过 Azure CLI 创建 AKS 实例,然后按照MS 教程安装具有静态公共 IP 的入口控制器时,一切正常。此方法隐式创建服务主体 (SP)。

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

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

不确定这是否是红鲱鱼,但其他用户在针对第二个教程打开的问题的上下文中抱怨了类似的问题。他们的修复似乎总是“拆除你的集群并重试”,但在这种情况下这不是一个可接受的解决方案。我需要一个可重现的工作集群,而azurerm_kubernetes_cluster目前不允许使用隐式创建的 SP 构建 AKS 实例。

4

2 回答 2

6

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

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

编辑 2019-05-23

写这篇文章后,我们发现了一个使用 MC_* 资源组的解决方法还不够好的用例。我向 MS 开了一张支持票,他们指导我使用这个解决方案。将以下注释添加到您的 LoadBalancer(或 Ingress 控制器),并确保 AKS SP 在Network Contributor目标资源组中至少具有权限(myResourceGroup在下面的示例中):

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

这为我们彻底解决了。

于 2019-05-13T19:20:21.247 回答
1

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

Derek 是对的,您完全可以使用与预配 AKS 群集的位置不同的资源组中的现有 IP。有文档页面。只需确保您已完成以下两个步骤:

  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
于 2021-03-09T00:05:32.793 回答