如何在Azure AKS服务中使用现有的LoadBalancer?

时间:2019-06-25 08:38:12

标签: azure-aks

我用Terraform创建了一个AKS集群。我希望集群具有LoadBalancer和静态公共IP,并且希望它们预先存在于我的Ingress Controller / LoadBalancer服务定义中,因为我不希望Kubernetes清单动态创建/删除它们。 / p>

因此,根据documentation recommendations,我还根据Terraform在节点资源组中使用SKU basic在节点资源组中创建了LoadBalancer和静态公共IP,并将公共IP附加到LB。

然后,我创建了一个类型为LoadBalancer的服务:

---                                                                                                                                                                                                                                            
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  type: LoadBalancer
  loadBalancerIP: 8.8.8.8 (the public static IP allocated by Terraform)
  selector:
    name: my-pods-selector
  ports:
    - name: my-port
      protocol: TCP 
      port: 1234
      targetPort: 1234

服务然后停留在PENDING状态,并且describe告诉我:

$ kubectl describe svc my-service
[...]
Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   EnsuringLoadBalancer        5s (x9 over 15m)  service-controller  Ensuring load balancer
  Warning  CreatingLoadBalancerFailed  4s (x9 over 15m)  service-controller  Error creating load balancer (will retry): failed to ensure load balancer for service my-service: timed out waiting for the condition

我无法在describe命令输出中找到有关该错误的更多信息:

Error creating load balancer (will retry): failed to ensure load balancer for service my-service: timed out waiting for the condition

此外,如果不是预先创建LoadBalancer,而是仅创建公共IP,则会动态创建LoadBalancer,一切都会顺利进行。

问题是:如何成功使Azure(我缺少哪个配置参数?)使用预先存在的LB?

  • Kubernetes版本:1.13.5

2 个答案:

答案 0 :(得分:1)

  

我希望集群具有LoadBalancer和静态公共IP,并且   我希望这些对象预先存在于我的Ingress Controller中/   LoadBalancer服务定义,因为我不希望这样   由Kubernetes清单动态创建/删除。

不幸的是,您不能将具有静态公共IP的预先存在的Load Balancer用于AKS群集中的服务。您可以在Github中查看相同的issue。如建议所示:

  

您需要让AKS在Azure中为以下对象创建负载均衡器资源   您的服务,而不是尝试在它们之前手动创建它们   然后在AKS中使用它们。只需通过创建服务即可   Kubernetes API,并让网络插件创建和配置   适当的Azure资源。

我建议您可以使用静态分配方法自己创建公共IP。然后使用Load Balancer类型和静态公共IP创建服务。

答案 1 :(得分:0)

使用--sku Standard创建静态IP。如果没有--sku,则使用SKU Basic创建标准IP。

基本静态IP不能用于负载均衡器。 查看活动日志,您会看到如下警告:

  

标准sku负载均衡器   /subscriptions/55aa..../resourceGroups/MC_kubernetes-dev-kubernetes-dev-cluster_northeurope/providers/Microsoft.Network/loadBalancers/kubernetes   无法引用基本sku publicIP   / subscriptions / 55aa .... / resourceGroups / MC_kubernetes-dev_kubernetes-dev-cluster_northeurope / providers / Microsoft.Network / publicIPAddresses / kubernetes-dev-public-ip。

STATICIP=$(az network public-ip create --resource-group <MC_your-RG> --name Your-public-ip-name --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv)

现在将此IP分配给您的负载均衡器服务