【问题标题】:how to create multiple loadbalancer ip addresses on one ingress controller on Azure AKS如何在 Azure AKS 的一个入口控制器上创建多个负载均衡器 IP 地址
【发布时间】:2018-08-10 23:29:21
【问题描述】:

我试图在一个 k8s 集群上设置多个服务,前面有一个 Ingress 控制器,它为所有服务执行 tls 终止。 这是一个很好的例子:https://github.com/kubernetes/contrib/blob/master/ingress/controllers/nginx/examples/multi-tls/multi-tls.yaml

我最初遵循这个示例:https://github.com/brunoterkaly/ingress,然后将其扩展为具有多个 tls 服务。

通过在 Azure 上公开我的 nginx 复制控制器 AKS 会自动创建一个负载均衡器和一个公共 IP 地址,我可以在其中应用一条 A 记录: kubectl expose rc nginx-ingress-rc --port="80,443" --type="LoadBalancer"

但是,我还想要第二条 A 记录,它指向相同的 IP 地址(我猜?),这样我就可以从不同的域访问我的入口控制器。我不知道如何让 AKS 为此创建第二个?

【问题讨论】:

    标签: azure nginx kubernetes-ingress azure-aks


    【解决方案1】:

    也许这有点太晚了,而不是原始帖子所要求的。非正式地,您可以为入口控制器创建多个服务,从而映射多个 IP。仅限LoadBalancer类型的单个k8s服务的限制,它只能引用单个IP地址。

    就我而言,我的 AKS 集群具有许多命名空间和可通过不同 URL 访问的不同应用程序。由于历史原因,每个 URL 都有不同的公共 IP 地址:

    例子:

    first.example.com -> 1.2.3.4
    second.example.com -> 5.6.7.8
    ...we could go on, IPs are just made up!
    

    我想将 nginx 入口安装到 AKS 中,以处理所有命名空间的路由,而不是使用专用 LoadBalancer 和反向代理对处理每个应用程序。为此,我遵循了here 所述的步骤,并在入口部署过程中(使用 helm)仅提供了一个 IP 为 controller.service.loadBalancerIP=”1.2.3.4”

    执行此步骤后,我可以看到这些服务:

    PS C:\> kubectl get service -n ingress-nginx
    NAME                                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
    ingress-nginx-controller               LoadBalancer   10.0.141.84    1.2.3.4         80:30065/TCP,443:31444/TCP   14h
    ingress-nginx-controller-admission     ClusterIP      10.0.168.127   <none>          443/TCP                      14h
    

    之后我手动创建了另一个服务ingress-nginx-controller-second,其选择器标签完全相同,下一个loadBalancerIP: 5.6.7.8

    执行此步骤后,我可以看到这些服务:

    PS C:\> kubectl get service -n ingress-nginx
    NAME                                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
    ingress-nginx-controller               LoadBalancer   10.0.141.84    1.2.3.4         80:30065/TCP,443:31444/TCP   14h
    ingress-nginx-controller-admission     ClusterIP      10.0.168.127   <none>          443/TCP                      14h
    ingress-nginx-controller-second        LoadBalancer   10.0.204.118   5.6.7.8         80:31275/TCP,443:32751/TCP   10m
    

    现在,如果我列出我为两个应用程序定义的示例入口,您会看到,它们都显示了相同的第一个公共 IP。这是因为该 IP 被入口用作发布 IP。尽管如此,路由工作得很好,因为第二个服务将所有流量转发到同一个 ingress-nginx-controller,并且您可以像往常一样基于不同的主机/路径进行路由。

    PS C:\Users\sk1u04h9> kubectl get ingress -A
    NAMESPACE   NAME             CLASS    HOSTS                ADDRESS   PORTS     AGE
    first       first-ingress    <none>   first.example.com    1.2.3.4   80, 443   14h
    second      second-ingress   <none>   second.example.com   1.2.3.4   80, 443   5m
    

    我希望这对尝试迁移到 nginx 入口的人有所帮助,而无需预先将所有 URL 指向单个公共 IP。如果需要,您可以在此迁移步骤之后请求所有 URL 仅指向一个 IP,然后您当然可以删除所有 ingress-nginx-controller-* 服务,这将不再需要。

    【讨论】:

      【解决方案2】:

      同时我更了解 Ingress。入口控制器只创建一个IP地址,可以支持基于路径和主机的路由。有关示例,请参阅https://docs.microsoft.com/en-us/azure/aks/ingress。 我只需要为与 Azure 公共 IP 地址关联的 A 记录配置不同的 CNAME 记录。如果我想为我的服务使用多个 *.cloudapp.azure.com fqdn,我一开始想要实现的目标,我必须使用 Azure DNS。

      【讨论】:

      • 我正在尝试做同样的事情,但有点迷失了。您能否详细说明如何使用 AKS 在 1 个 nginx-ingress-controller 上使用 2 个 DNS 记录。提前谢谢
      • nginx-ingress-controller 获得了一条 DNS 记录,我只使用了 cloudapp.azure.com 一条。然后对于我的所有服务,我创建指向入口 DNS 名称的 CNAME 记录。例如:service1.costco.com -> costco-ingress.cloudapp.azure.com service2.costco.com -> costco-ingress.cloudapp.azure.com 然后在您的入口控制器中,您可以在主机名 (service1. costco.com 和 service2.costco.com)并将它们路由到不同的 k8s 服务。你也可以做基于路径的路由,或者混合它们(例如 service1.costco.com/api 去 api 服务和 service1.costco.com/ui 去 ui)。
      猜你喜欢
      • 2021-11-07
      • 1970-01-01
      • 2021-10-02
      • 2022-01-03
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多