【问题标题】:Azure AKS Public IP in Non-standard Resource Group非标准资源组中的 Azure AKS 公共 IP
【发布时间】:2019-09-30 11:04:12
【问题描述】:

我一直在尝试通过 Terraform 管理 Azure Kubernetes 服务 (AKS) 实例。当我根据this MS tutorial 通过 Azure CLI 创建 AKS 实例,然后根据this MS tutorial 安装具有静态公共 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 状态无限期地保持“”,我在任何日志中都找不到任何关于原因的信息。是否有日志可以告诉我为什么我的 IP 仍处于待处理状态?

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

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

【问题讨论】:

  • 您可以标记您的答案以帮助其他会员。

标签: azure terraform azure-aks terraform-provider-azure service-principal


【解决方案1】:

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

无论如何,默认 AKS 配置要求在该隐式资源组中创建公共 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

这完全为我们解决了。

【讨论】:

  • 这并不完全正确,只要设置正确,您就可以使用同一订阅中任何资源组的 IP 地址
  • 是的,@4c74356b41。我跟进了 MS,这需要在负载均衡器或入口控制器上添加注释。我已经编辑了我的原始帖子以包含此解决方案。
  • 没有。改变了我对赞成投票的想法,因为您没有指导我找到解决方案,而只是报告说有一个解决方案,这不是很有帮助。我只跟进了 MS 的支持票,因为我们发现了一个我最初的解决方法没有解决的用例。
  • 好吧,我不知道你是如何配置你的东西的,所以我不知道如何修复它,但很明显,如果配置正确,一切正常,所以你需要修复 SP 权限
  • SP 权限从一开始就很好。这是我修复的第一件事。问题是缺少注释。我已经编辑了答案以包含注释。不过,感谢您再次提及 SP 权利。我也会将其添加到我的答案中。 (您对此表示赞成。:)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2018-07-29
    • 2020-05-17
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多