Azure 上的 Kubernetes:为不同的服务分配不同的外部 IP
Kubernetes on Azure: assign different external IP to different services
我使用 Azure 容器服务在 Azure 上创建了一个 Kubernets 集群示例设置,它的工作做得很好。我在 Kubernetes 中设置了几个容器和服务,没问题。
让我感到困惑的是,如果我 运行 几个 nginx 容器并想通过不同的外部 IP 公开它,我不能那样做对于我所知道和理解的。
Azure approach 是我可以设置服务并设置 type: LoadBalancer
并且当我创建它时,Azure 将 "connect" LoadBalancer 连接到我的服务的客户端节点。
但是这样我只能将一个外部IP附加到我的所有服务,这不是我需要的。在我的例子中,当我 运行 几个 nginx 容器时,我想在不同的 IP 上公开它的 80/tcp 端口,这样我就可以在 DNS 中使用这些 IP,而不是在单个 IP 的不同端口上。
我该如何克服呢? 请帮忙!
查看您链接的 Azure 文档,它似乎与它在任何云上应该做的并没有什么不同。我想你想念应该如何使用它。
当您创建任何类型的服务时,它旨在提供没有区别的服务。如果它指向多个端点,它会对 LoadBalance 流量执行此操作并提供 HA。在每个端点的 IP 基础上将其暴露在外部的原因为零。
但是,如果您需要在不同的 IP 上公开 不同的 服务,您只需将这两个服务都创建为 LoadBalancer 服务类型,并且每个 svc 都应该接收其唯一的外部负载均衡器(因此IP).
您描述的行为(一个负载均衡器,多个外部暴露的服务)听起来更接近您可以通过 Ingress/IngressController 实现的结果。
在 Azure 容器服务中,要将 kubernetes 服务暴露到 Internet,我们应该使用 Azure Load balancer。正如 Radek 所说,一个 pod 中有多个容器,并使用相同的负载均衡器来保持 HA。
如果你想把几个不同Public IP地址的容器暴露到Internet,我们可以创建几个pods,然后把它们暴露到Internet,这样,不同[=31]的容器=] IP 地址。
pod、container、node的关系,是这样的:
我们在一个 pod 中创建多个容器,在一个节点(主机)中创建多个 pods,多个 pods 为一项服务工作。一项服务作为一个集群工作,一项服务具有一个 public IP 地址。
因此,如果您想创建多个具有不同 public 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 设置(两个 public IP 地址):
我使用 Azure 容器服务在 Azure 上创建了一个 Kubernets 集群示例设置,它的工作做得很好。我在 Kubernetes 中设置了几个容器和服务,没问题。
让我感到困惑的是,如果我 运行 几个 nginx 容器并想通过不同的外部 IP 公开它,我不能那样做对于我所知道和理解的。
Azure approach 是我可以设置服务并设置 type: LoadBalancer
并且当我创建它时,Azure 将 "connect" LoadBalancer 连接到我的服务的客户端节点。
但是这样我只能将一个外部IP附加到我的所有服务,这不是我需要的。在我的例子中,当我 运行 几个 nginx 容器时,我想在不同的 IP 上公开它的 80/tcp 端口,这样我就可以在 DNS 中使用这些 IP,而不是在单个 IP 的不同端口上。
我该如何克服呢? 请帮忙!
查看您链接的 Azure 文档,它似乎与它在任何云上应该做的并没有什么不同。我想你想念应该如何使用它。
当您创建任何类型的服务时,它旨在提供没有区别的服务。如果它指向多个端点,它会对 LoadBalance 流量执行此操作并提供 HA。在每个端点的 IP 基础上将其暴露在外部的原因为零。
但是,如果您需要在不同的 IP 上公开 不同的 服务,您只需将这两个服务都创建为 LoadBalancer 服务类型,并且每个 svc 都应该接收其唯一的外部负载均衡器(因此IP).
您描述的行为(一个负载均衡器,多个外部暴露的服务)听起来更接近您可以通过 Ingress/IngressController 实现的结果。
在 Azure 容器服务中,要将 kubernetes 服务暴露到 Internet,我们应该使用 Azure Load balancer。正如 Radek 所说,一个 pod 中有多个容器,并使用相同的负载均衡器来保持 HA。
如果你想把几个不同Public IP地址的容器暴露到Internet,我们可以创建几个pods,然后把它们暴露到Internet,这样,不同[=31]的容器=] IP 地址。
pod、container、node的关系,是这样的:
我们在一个 pod 中创建多个容器,在一个节点(主机)中创建多个 pods,多个 pods 为一项服务工作。一项服务作为一个集群工作,一项服务具有一个 public IP 地址。
因此,如果您想创建多个具有不同 public 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 设置(两个 public IP 地址):