多主机Kubernetes Ingress控制器

6

我已经学习了几周的Kubernetes,并使用kube-lego NGINX示例(https://github.com/jetstack/kube-lego)成功地在DigitalOcean上使用Rancher部署了Kubernetes集群中的服务。

我已经部署了示例静态站点、WordPress、Laravel、Craft CMS等,所有这些都使用自定义命名空间、部署、密钥、外部注册表的容器、服务和Ingress定义。

使用示例(lego)NGINX Ingress Controller设置,我能够将DNS应用于我的K8s集群的公开IP地址,并显示结果网站。

然而,我不知道如何允许多个主机有Ingress控制器为同一部署提供服务,从而为集群提供HA Ingress(通过应用外部负载均衡器服务、geo-ip或其他方式)。

Rancher(stable)允许我添加多个主机,我每次启动3到5个,Kubernetes配置并部署在所有主机上。此外,我会定义许多副本或部署(如上所述),它们将分布在整个集群中,并且可以像预期的那样访问。我甚至指定了多个Ingress Controller的副本,但它们都被调度到同一主机上,从而只给我一个Ingress的IP地址。

那么我如何允许多个主机(每个主机都有自己的公共IP地址)允许进入集群?我也阅读了关于设置多个Ingress Controller的内容,但是您必须指定哪些部署/服务由哪个Ingress Controller提供服务,这完全违背了目的。

也许我错过了什么,但如果K8s多主机应该提供HA,并且具有Ingress Controller的主机出现故障,则服务将重新调度到其他主机上,但所有东西都指向的IP地址将会失效,从而导致停机。是否有任何方法可以为相同的部署/服务提供多个IP地址?

2个回答

5
我今天进一步调查了我的设置,我想我找到了为什么我遇到困难的原因。在文档和@fiunchinho的描述中,"LoadBalancer"经常被提及用于云提供商。我正在使用它与Rancher设置,它会自动为您在主机上创建一个HA-Proxy LoadBalancer入口。

默认情况下,它只会在主机上安排它。您可以通过提供一个注释io.rancher.scheduler.global: "true"来指定您希望全局调度。

就像这样:

annotations:
  # Create load balancers on every host in the environment
  io.rancher.scheduler.global: "true"

http://rancher.com/docs/rancher/v1.6/en/rancher-services/load-balancer/

我更喜欢使用LoadBalancer而不是NodePort,因为我想要能够将端口80(以及未来的端口443)发送到任何节点,并通过检查主机头并根据需要进行定向来成功满足我的请求。
这些负载均衡器也可以在Rancher UI的“基础结构堆栈”菜单下设置。我已成功删除了单个LB,并添加了一个启用了“始终在每个主机上运行此容器的一个实例”的选项的LB。
配置完成后,我可以向任何Ingress的任何主机发出请求,并获得响应,无论容器安排在哪个主机上。

https://rancher.com/docs/rancher/v1.6/en/rancher-services/load-balancer/

太酷了!


2

类似于常规的Pod一样,Ingress Controller也是部署在Kubernetes集群中的。这意味着你可以拥有任意数量的副本,并将它们分布在所有节点之间。

你需要一个Service对象来组合所有Ingress Controller的Pod。

然后,你只需要将该Service暴露到集群外部即可。如果你在云提供商上,则可以使用一个LoadBalancer服务来实现。或者,你可以仅使用一个NodePort服务

关键是该服务将在不同的Kubernetes节点上运行的所有Ingress Controller Pod之间平衡接收到的流量。如果其中一个节点故障,那没关系,因为还有其他节点包含Ingress Controller Pod。


谢谢回复!我还没有时间用你的观点重新测试这种情况。我会在测试后跟进。 - CenterOrbit
这些信息非常有帮助,它让我确定我走在了正确的道路上。结果发现我的问题是Rancher如何调度负载均衡器。 - CenterOrbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接