我一直试图通过Terraform管理Azure Kubernetes服务(AKS)实例。当我根据this MS tutorial通过Azure CLI创建AKS实例,然后根据this MS tutorial安装具有静态公共IP的入口控制器时,一切正常。此方法隐式创建服务主体(SP)。
当我通过Terraform创建AKS集群的其他完全相同的副本时,我被迫明确提供服务主体。当我进入创建入口控制器的步骤(使用上面教程2中提供的相同命令:helm install stable/nginx-ingress --set controller.replicaCount=2 --set controller.service.loadBalancerIP="XX.XX.XX.XX"
)时,我已经向集群的整个资源组授予了这个新的SP“贡献者”访问权限,即入口服务出现,但它从未获得其公共IP。 IP状态将无限期保持为“
同样,我可以肯定的是,除了SP之外,Terraform AKS集群与基于MS教程创建的集群完全相同。运行terraform plan
不会发现两者之间的差异。有谁知道我的AKS SP可能需要什么权限,或者我可能在这里还缺少什么?奇怪的是,我找不到通过Azure门户分配给隐式创建的主体的任何权限,但是我没有想到可能导致此行为的任何其他原因。
不确定是不是红色鲱鱼,但是其他用户在针对第二个教程提出的问题中抱怨了类似的问题。他们的修复程序似乎总是“拆除群集并重试”,但是在这种情况下,这不是可接受的解决方案。我需要一个可复制的工作群集,并且azurerm_kubernetes_cluster当前不允许使用隐式创建的SP构建AKS实例。
答案 0 :(得分:0)
为了后代,我将回答自己的问题。事实证明,问题出在我创建静态公共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
这完全为我们解决了。
答案 1 :(得分:0)
我现在还不能评论,所以把这个补充作为答案。
Derek 是对的,您可以完全使用来自不同于预配 AKS 群集的资源组的现有 IP。 There is the documentation page。只需确保您已完成以下两个步骤:
将 AKS 服务主体的“网络贡献者”角色分配添加到现有静态 IP 所在的资源组。
使用以下命令将 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