Traefik / Nginx -(入口控制器)如何将请求转发到配置了相同端口号的两个不同服务。?
How does Traefik / Ngnix - (Ingress Controllers) forwards request to two different services having configured with same port number.?
基本上我使用 docker-compose 进行了以下 Hdfs 集群设置:
IP 为 192.168.1.1 的节点 1 的服务部署如下:
Namenode1:9000
HMaster1: 8300
ZooKeeper1:1291
IP 为 192.168.1.2 的节点 2 的服务部署如下:
Namenode2:9000
ZooKeeper2:1291
Traefik / Ngnix -(入口控制器)如何将请求转发到配置了相同端口号的两个不同服务?
有几个关于 kubernetes 中入口和负载平衡如何工作的很棒的教程,例如this one by Mark Betz。作为一般规则,考虑服务和工作负载而不是工作负载 运行 所在的特定节点会有所帮助。
部署在 Kubernetes 中的工作负载(所谓的 Pod
)有自己的内部 IP 地址,称为 ClusterIP
。该 pod 可以打开一个或多个端口,就在那个 pod-owned ip 地址上。
如果您现在有几个 pods 来分配负载,例如就像 5 个 Web 服务器进程或后端逻辑一样,客户端(在集群内)很难跟踪所有这些 pod IP,因为它们也会在 pod 更新或因崩溃而重新启动时发生变化。这就是为什么 Kubernetes 有一个所谓的 services
的概念。这些提供稳定的 DNS 名称和 IP,然后透明地“转发”到健康 pods 之一。因此,您的客户端只需要知道 DNS 名称,而不需要跟踪特定的 pod IP。
如果你现在想把这样的 service
暴露给 public,有不同的方法。您可以将服务设置为 type: LoadBalancer
,然后在您的云提供商上设置一些负载均衡器基础设施并将流量路由到节点,然后再路由到 pods - 或者 - 您已经有一个入口控制器,并且只需根据主机名和路径定义路由。入口控制器本身就是这样一种负载均衡服务,带有附加的云负载均衡器,还有一些 pods(例如 traefik 或 nginx 容器),然后相应地路由您的数据包。
所以回到你最初的问题:如果你想公开一个具有多个 pods 同类的服务,那么你首先要创建一个 Service
与你的 [=10] 相匹配的资源=]s 使用 selector
,然后创建一个 ingress
资源,该资源提供 hostname/path 并引用此服务。入口控制器将获取这些入口资源并相应地配置 traefik 或 nginx。入口控制器并不真正关心主机 IP 和端口号,因为它作用于内部 kubernetes ClusterIP,所以当你有入口时,你甚至不需要(也不应该)直接公开这样的服务.
我希望这能回答您关于通过入口控制器公开两个工作负载的问题。详情请查看the Kubernetes docs on Ingresses. Based on the services you named (zookeeper, hdfs) load balancing and ingresses might not be what you need for that case. Zookeeper instances should be internal in most cases and need to be adressed individually, so you might want to check out headless services, for this use case. Also check the Kubernetes docs for a way to run zookeeper.
基本上我使用 docker-compose 进行了以下 Hdfs 集群设置:
IP 为 192.168.1.1 的节点 1 的服务部署如下:
Namenode1:9000
HMaster1: 8300
ZooKeeper1:1291
IP 为 192.168.1.2 的节点 2 的服务部署如下:
Namenode2:9000
ZooKeeper2:1291
Traefik / Ngnix -(入口控制器)如何将请求转发到配置了相同端口号的两个不同服务?
有几个关于 kubernetes 中入口和负载平衡如何工作的很棒的教程,例如this one by Mark Betz。作为一般规则,考虑服务和工作负载而不是工作负载 运行 所在的特定节点会有所帮助。
部署在 Kubernetes 中的工作负载(所谓的 Pod
)有自己的内部 IP 地址,称为 ClusterIP
。该 pod 可以打开一个或多个端口,就在那个 pod-owned ip 地址上。
如果您现在有几个 pods 来分配负载,例如就像 5 个 Web 服务器进程或后端逻辑一样,客户端(在集群内)很难跟踪所有这些 pod IP,因为它们也会在 pod 更新或因崩溃而重新启动时发生变化。这就是为什么 Kubernetes 有一个所谓的 services
的概念。这些提供稳定的 DNS 名称和 IP,然后透明地“转发”到健康 pods 之一。因此,您的客户端只需要知道 DNS 名称,而不需要跟踪特定的 pod IP。
如果你现在想把这样的 service
暴露给 public,有不同的方法。您可以将服务设置为 type: LoadBalancer
,然后在您的云提供商上设置一些负载均衡器基础设施并将流量路由到节点,然后再路由到 pods - 或者 - 您已经有一个入口控制器,并且只需根据主机名和路径定义路由。入口控制器本身就是这样一种负载均衡服务,带有附加的云负载均衡器,还有一些 pods(例如 traefik 或 nginx 容器),然后相应地路由您的数据包。
所以回到你最初的问题:如果你想公开一个具有多个 pods 同类的服务,那么你首先要创建一个 Service
与你的 [=10] 相匹配的资源=]s 使用 selector
,然后创建一个 ingress
资源,该资源提供 hostname/path 并引用此服务。入口控制器将获取这些入口资源并相应地配置 traefik 或 nginx。入口控制器并不真正关心主机 IP 和端口号,因为它作用于内部 kubernetes ClusterIP,所以当你有入口时,你甚至不需要(也不应该)直接公开这样的服务.
我希望这能回答您关于通过入口控制器公开两个工作负载的问题。详情请查看the Kubernetes docs on Ingresses. Based on the services you named (zookeeper, hdfs) load balancing and ingresses might not be what you need for that case. Zookeeper instances should be internal in most cases and need to be adressed individually, so you might want to check out headless services, for this use case. Also check the Kubernetes docs for a way to run zookeeper.