【问题标题】:Kubernetes on Azure: assign different external IP to different servicesAzure 上的 Kubernetes:为不同的服务分配不同的外部 IP
【发布时间】:2017-07-26 16:15:38
【问题描述】:

我使用 Azure 容器服务在 Azure 上创建了一个 Kubernetes 集群的示例设置,它完成了它的工作。我在 Kubernetes 中设置了几个容器和服务,没问题。

让我感到困惑的是,例如,如果我运行几个 nginx 容器并想通过不同的外部 IP 公开它,就我所知道和理解的而言,我无法做到这一点。 p>

Azure approach 是我可以设置 Service 并设置 type: LoadBalancer 并且在我创建它时 Azure 会将附加到客户端节点的 LoadBalancer“连接”到我的服务。

但这样我只能将 一个 外部 IP 附加到我的 所有 服务,这不是我需要的。在我的示例中,当我运行多个 nginx 容器时,我想在不同的 IP 上公开其 80/tcp 端口,这样我就可以在 DNS 中使用这些 IP,而不是在单个 IP 的不同端口上。

我该如何克服呢? 请帮忙!

【问题讨论】:

    标签: azure kubernetes external


    【解决方案1】:

    在 Azure 容器服务中,要将 Kubernetes 服务公开到 Internet,我们应该使用 Azure 负载均衡器。正如 Radek 所说,一个 pod 中的多个容器,并使用同一个负载均衡器来保持 HA。

    如果你想将多个具有不同公共 IP 地址的容器暴露到互联网上,我们可以创建多个 pod,并将它们暴露到互联网上,这样就形成了具有不同公共 IP 地址的容器。

    pod、容器和节点的关系,如下图:

    我们在一个 pod 中创建多个容器,在一个节点(主机)中创建多个 pod,多个 pod 为一项服务工作。一个服务作为一个集群工作,一个服务有一个公共 IP 地址。

    所以,如果你想创建多个具有不同公共 IP 地址的 nginx 容器,我们可以创建多个服务来归档:

    在一个服务中创建一个或两个 nginx 容器,并将多个服务公开到 Internet。

    root@k8s-master-7273A780-0:~# kubectl run jasonnginx --replicas=1 --image nginx
    root@k8s-master-7273A780-0:~# kuberctl run mynginx --replicas=2 --image nginx
    root@k8s-master-7273A780-0:~# kubectl expose deployments mynginx --port=80 --type=LoadBalancer
    root@k8s-master-7273A780-0:~# kubectl expose deployments jasonnginx --port=80 --type=LoadBalancer
    root@k8s-master-7273A780-0:~# kubectl get svc
    NAME         CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
    jasonnginx   10.0.114.116   52.168.176.18   80:30153/TCP   5m
    kubernetes   10.0.0.1       <none>          443/TCP        15m
    mynginx      10.0.205.127   13.82.102.171   80:31906/TCP   6m
    root@k8s-master-7273A780-0:~# kubectl get pods
    NAME                          READY     STATUS    RESTARTS   AGE
    jasonnginx-1417538491-v79mw   1/1       Running   0          20m
    mynginx-1396894033-78njj      1/1       Running   0          21m
    mynginx-1396894033-pmhjh      1/1       Running   0          21m
    

    我们可以通过 Azure 门户找到负载均衡器前端 IP 设置(两个公共 IP 地址):

    【讨论】:

    • 问题是:例如,如果我删除服务,然后将其重新创建为一个完整的汇总过程,我是否会为相同的服务获得 相同的 IP,还是 IP?有什么方法可以确保特定的 IP(比如我已经在 Azure 门户中订购的那个)绑定到 Kubernetes 内的特定服务?
    • @Alexander 我们删除这个服务后,Azure会回收这个公共IP地址,我们不能保留这个IP地址。在我们新建另一个服务后,我们将获得一个新的 IP 地址。目前,我们无法指定公共 IP 地址。
    • @jason-ye-msft 所以 Kubernetes 和 Azure 之间有一些影子连接,我作为用户无法控制,所以如果我不这样做,我无论如何都无法删除 Kubernetes 中的服务不想丢失IP?可能有任何文档吗?
    • 奇怪的是,我在 Azure 上的 Kubernetes 中创建了几个服务(因此 LoadBalacer 为这些服务获得了额外的 IP),然后删除了这些服务,Azure 不会将这些 IP 释放回池中。到目前为止,我不知道“垃圾收集”是否会发生在某个时刻(可能是每小时或每天)。
    • @Alexander 据我所知,我们应该等待几分钟,Azure 会发布这些 IP。
    【解决方案2】:

    查看您链接的 Azure 文档,它似乎与在任何云上应该做的完全不同。我想你错过了理解它应该如何使用。

    当您创建任何类型的服务时,它旨在提供没有区别的服务。如果它指向多个端点,它会对 LoadBalance 流量执行此操作并提供 HA。以每个端点为基础的 IP 对外暴露的原因为零。

    但是,如果您需要在不同的 IP 上公开不同的服务,您只需将这两个服务都创建为 LoadBalancer 服务类型,并且每个 svc 都应该接收其唯一的外部负载平衡器(因此是 IP)。

    您描述的行为(一个负载均衡器,多个暴露在外部的服务)听起来更接近于您可以使用 Ingress/IngressController 完成的操作。

    【讨论】:

    • 好主意,虽然我发现我无法控制 IP 获取。也就是说,当我添加另一个 svc 时,Azure 负载均衡器会为我的新服务获得另一个 IP(如果我运行 5 个使用端口 80/tcp 的服务,它会获得 5 个新 IP),而我无法控制甚至不知道哪个是将给定的外部 IP 连接到提供者服务的规则。因此,如果我删除并重新创建相同的服务,我无法控制是否使用新的或相同的 IP。你看,很难使用这个“随机”IP。你的做法是什么?
    • 为了服务外部流量,我使用 Ingress/IngressController,这意味着我有效地使用 LoadBalancer 服务(nginx 入口控制器)公开了一项服务,而所有其他服务都通过 Ingress 公开。这意味着它们都显示在具有基于名称的虚拟主机的同一 IP 上。
    • 另外,在某些情况下,您可以使用loadBalancerIP: &lt;ip&gt; 来控制您在 LB 服务上分配的 IP,但 dnto 知道它在 Azure 上的情况
    猜你喜欢
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多