多主机 Kubernetes 入口控制器
Multiple Host Kubernetes Ingress Controller
我已经研究 Kubernetes 几周了,并且使用 kube-lego NGINX 示例 (https://github.com/jetstack/kube-lego) 已经使用 Rancher on DigitalOcean 成功地将服务部署到 Kubernetes 集群。
我已经部署了示例静态站点、Wordpress、Laravel、Craft CMS 等。所有这些都使用自定义命名空间、部署、机密、具有外部注册表的容器、服务和入口定义。
使用示例 (lego) NGINX Ingress Controller 设置,我能够将 DNS 应用于我的 K8s 集群的公开 IP 地址,并显示生成的站点。
不过,我不知道的是如何允许多个主机让 Ingress Controller 为相同的部署提供服务,从而为集群提供 HA Ingress。 (通过应用外部负载平衡器服务,或 geo-ip,或你有什么)。
Rancher(稳定版)允许我添加多个主机,我一次启动了 3 到 5 个,并且 Kubernetes 在所有主机上进行了配置和部署。此外,我将定义许多副本 and/or 部署(如上所列),它们将分布在集群中并可按预期进行访问。我什至指定了 Ingress Controller 的多个副本,但当然它们都被安排在同一台主机上,只给我一个 Ingress 的 IP 地址。
那么我如何允许多个主机(每个主机都有自己的 public 面向 IP 地址)允许进入集群?我还读过有关设置多个 Ingress Controller 的内容,但是您必须指定 deployment/services 由哪个 Ingress Controller 提供服务,这完全违背了目的。
也许我遗漏了一些东西,但是如果 K8s 多主机应该提供 HA,并且带有 Ingress Controller 的主机宕机,那么服务将在其他主机上重新调度,但是 IP 地址所有指向的东西都会死,因此会中断。有什么方法可以将多个 IP 地址分配给同一组 deployment/services?
入口控制器的部署方式与任何常规 pod 一样。这意味着您可以拥有任意数量的副本,这些副本将分布在您的所有节点中。
您需要一个 Service
对象,该对象将入口控制器的所有 pods 分组。
然后你只需要将 Service
暴露给集群外部。你可以做到 using a LoadBalancer
service if you are on a cloud provider. Or you can use just a NodePort
service.
重点是该服务将平衡您的入口控制器在不同 kubernetes 节点上 运行 的所有 pods 之间接收的流量。如果其中一个节点出现故障,这并不重要,因为还有其他节点包含入口控制器 pods.
我今天进一步调查了我的设置,我想我发现了我遇到困难的原因。 "LoadBalancer" 经常被提及用于与云提供商一起使用(在两个文档和@fiunchinho 描述的内容中)。我将它与 Rancher 设置一起使用,它会自动在主机上为您创建一个 HA-Proxy LoadBalancer 入口。
默认情况下,它只会安排在其中一台主机上。您可以指定您希望它在全球范围内安排购买,提供 io.rancher.scheduler.global: "true"
的 'annotation'。
像这样:
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)发送到任何节点,并让它们通过检查主机成功满足我的请求 header,并指导 as-needed.
这些 LB 也可以在 "Infrastructure Stack" 菜单下的 Rancher UI 中设置。我已经成功删除了单个 LB,并且 re-added 一个启用了 "Always run one instance of this container on every host" 选项。
配置完成后,我可以为任何 Ingresses 向任何主机发出请求,并获得响应,无论容器被安排在哪个主机上。
https://rancher.com/docs/rancher/v1.6/en/rancher-services/load-balancer/
太酷了!
我已经研究 Kubernetes 几周了,并且使用 kube-lego NGINX 示例 (https://github.com/jetstack/kube-lego) 已经使用 Rancher on DigitalOcean 成功地将服务部署到 Kubernetes 集群。
我已经部署了示例静态站点、Wordpress、Laravel、Craft CMS 等。所有这些都使用自定义命名空间、部署、机密、具有外部注册表的容器、服务和入口定义。
使用示例 (lego) NGINX Ingress Controller 设置,我能够将 DNS 应用于我的 K8s 集群的公开 IP 地址,并显示生成的站点。
不过,我不知道的是如何允许多个主机让 Ingress Controller 为相同的部署提供服务,从而为集群提供 HA Ingress。 (通过应用外部负载平衡器服务,或 geo-ip,或你有什么)。
Rancher(稳定版)允许我添加多个主机,我一次启动了 3 到 5 个,并且 Kubernetes 在所有主机上进行了配置和部署。此外,我将定义许多副本 and/or 部署(如上所列),它们将分布在集群中并可按预期进行访问。我什至指定了 Ingress Controller 的多个副本,但当然它们都被安排在同一台主机上,只给我一个 Ingress 的 IP 地址。
那么我如何允许多个主机(每个主机都有自己的 public 面向 IP 地址)允许进入集群?我还读过有关设置多个 Ingress Controller 的内容,但是您必须指定 deployment/services 由哪个 Ingress Controller 提供服务,这完全违背了目的。
也许我遗漏了一些东西,但是如果 K8s 多主机应该提供 HA,并且带有 Ingress Controller 的主机宕机,那么服务将在其他主机上重新调度,但是 IP 地址所有指向的东西都会死,因此会中断。有什么方法可以将多个 IP 地址分配给同一组 deployment/services?
入口控制器的部署方式与任何常规 pod 一样。这意味着您可以拥有任意数量的副本,这些副本将分布在您的所有节点中。
您需要一个 Service
对象,该对象将入口控制器的所有 pods 分组。
然后你只需要将 Service
暴露给集群外部。你可以做到 using a LoadBalancer
service if you are on a cloud provider. Or you can use just a NodePort
service.
重点是该服务将平衡您的入口控制器在不同 kubernetes 节点上 运行 的所有 pods 之间接收的流量。如果其中一个节点出现故障,这并不重要,因为还有其他节点包含入口控制器 pods.
我今天进一步调查了我的设置,我想我发现了我遇到困难的原因。 "LoadBalancer" 经常被提及用于与云提供商一起使用(在两个文档和@fiunchinho 描述的内容中)。我将它与 Rancher 设置一起使用,它会自动在主机上为您创建一个 HA-Proxy LoadBalancer 入口。
默认情况下,它只会安排在其中一台主机上。您可以指定您希望它在全球范围内安排购买,提供 io.rancher.scheduler.global: "true"
的 'annotation'。
像这样:
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)发送到任何节点,并让它们通过检查主机成功满足我的请求 header,并指导 as-needed.
这些 LB 也可以在 "Infrastructure Stack" 菜单下的 Rancher UI 中设置。我已经成功删除了单个 LB,并且 re-added 一个启用了 "Always run one instance of this container on every host" 选项。
配置完成后,我可以为任何 Ingresses 向任何主机发出请求,并获得响应,无论容器被安排在哪个主机上。
https://rancher.com/docs/rancher/v1.6/en/rancher-services/load-balancer/
太酷了!