多主机 Kubernetes 入口控制器

Posted

技术标签:

【中文标题】多主机 Kubernetes 入口控制器【英文标题】:Multiple Host Kubernetes Ingress Controller 【发布时间】:2018-07-22 05:24:42 【问题描述】:

我已经研究 Kubernetes 几个星期了,并且使用 kube-lego nginx 示例 (https://github.com/jetstack/kube-lego) 已使用 DigitalOcean 上的 Rancher 成功地将服务部署到 Kubernetes 集群。

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

使用示例(乐高)NGINX 入口控制器设置,我能够将 DNS 应用到我的 K8s 集群的公开 IP 地址,并显示生成的站点。

不过,我不知道如何允许多个主机让 Ingress Controller 为相同的部署提供服务,从而为集群提供 HA Ingress。 (通过应用外部负载平衡器服务、geo-ip 或你有什么)。

Rancher(稳定版)允许我添加多个主机,我一次增加了 3 到 5 个,并且 Kubernetes 已配置并部署在所有主机上。此外,我将定义许多副本和/或部署(如上所列),它们将分布在集群中并且可以按预期访问。我什至指定了 Ingress Controller 的多个副本,但当然它们都被安排在同一个主机上,只给了我一个 Ingress 的 IP 地址。

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

也许我遗漏了一些东西,但是如果 K8s 多主机应该提供 HA,并且带有 Ingress Controller 的主机出现故障,那么服务将在其他主机上重新调度,但一切的 IP 地址是指向将是死的,因此会中断。有什么方法可以让同一组部署/服务拥有多个 IP 地址?

【问题讨论】:

【参考方案1】:

我今天对我的设置进行了更多调查,我想我发现了我遇到困难的原因。 “LoadBalancer”经常被提到与云提供商一起使用(在两个文档中,以及@fiunchinho 描述的内容中)。我将它与 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)发送到任何节点,并通过检查 Host 标头并根据需要进行定向来让它们成功满足我的请求。

这些 LB 也可以在 Rancher UI 的“Infrastructure Stack”菜单下进行设置。我已成功移除单个 LB,并重新添加了一个启用“始终在每个主机上运行此容器的一个实例”选项的负载。

配置完成后,我可以向任何主机请求任何 Ingress,并获得响应,无论容器被安排在哪个主机上。

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

太酷了!

【讨论】:

【参考方案2】:

入口控制器的部署与任何常规 pod 一样。这意味着您可以拥有任意数量的副本,这些副本将分布在您的所有节点中。

您需要一个 Service 对象来为入口控制器分组所有 pod。

然后你只需要将 Service 暴露给集群外部。如果您在云提供商上,您可以这样做using a LoadBalancer service。或者你可以只使用a NodePort service。

关键是该服务将平衡您的入口控制器在运行在不同 kubernetes 节点上的所有 pod 之间接收的流量。如果其中一个节点出现故障,那并不重要,因为还有其他节点包含入口控制器 pod。

【讨论】:

感谢您的回复!我没有时间用你的附加观点重新测试这种情况。我会跟进的。 这是非常有用的信息,它有助于重申我走在正确的轨道上。原来我的问题是 Rancher 如何调度 LoadBalancers

以上是关于多主机 Kubernetes 入口控制器的主要内容,如果未能解决你的问题,请参考以下文章

云原生DevOps:Kubernetes编排工具

Nginx 入口控制器返回 404 Kubernetes

具有多个入口资源对象的 Kubernetes nginx 入口控制器

Kubernetes第零篇:认识kubernetes

kubernetes / IPVS 和 IPTABLES

kubernetes / IPVS 和 IPTABLES