Kubernetes:来自另一个 pod 的 kafka pod rechability 问题
Kubernetes: kafka pod rechability issue from another pod
我知道以下信息不足以追踪问题,但我仍然需要一些解决方案。
我们有 Amazon EKS 集群。
目前我们面临Kafka pod可达性问题
环境:
- 可用区 ap-south-1a,1b 共有 10 个节点
- 我有一个三副本的Kafka集群(Helm图表安装)
- 我有一个zookeeper的三副本(Helm图表安装)
- Kafka 在端口 19092 上使用外部通告侦听器
- Kafka 有内部网络负载均衡器服务
- 我已经部署了一个测试 pod 来检查 Kafka pod 的可达性。
- 我们正在为广告侦听器使用基于云图的 DNS
工作:
- 当我从 ec2 运行 telnet 命令时,如
telnet 10.0.1.45 19092
。它按预期工作。 IP 10.0.1.45
是一个负载均衡器 ip。
- 当我 运行 来自 ec2 的 telnet 命令时,如
telnet 10.0.1.69 31899
。它按预期工作。 IP10.0.1.69
是一个实际的节点ip,31899是nodeport.
问题:
- 当我 运行 来自 test-pod 的相同命令时。喜欢
telnet 10.0.1.45 19092
。它有时会工作,有时会出现 telnet: Unable to connect to remote host: Connection timed out
之类的错误
问题与 kube-proxy 有关。我们需要帮助来解决这个问题。
谁能帮忙指导一下?
我可以重启 kube-proxy 吗?会影响其他pods/deployments吗?
我认为这个问题是由 AWS 的 NLB 仅 TCP 性质引起的(如评论中所述)。
简而言之,your pod-to-pod communication fails when hairpin is needed。
要确认这是根本原因,您可以验证当 telnet 工作时,kafka pod 和 client pod 不在 同一个 EC2 节点中。当它们在同一个 EC2 服务器中时,telnet 失败。
有(至少)两种方法可以解决这个问题:
- 使用K8s内部网络 - 参考k8s Service的URL
每个 K8s 服务都有 its own DNS FQDN 供内部使用(意味着仅使用 k8s 网络,无需到达 LoadBalancer 并再次返回 k8s)。您可以通过 LB 远程登录而不是 NodePort。
IE。假设您的 kafka 服务名为 kafka
。然后你就可以telnet kafka.svc.cluster.local
(在kafka服务暴露的端口上)
- 使用K8s anti-affinity确保客户端和kafka永远不会在同一个节点上调度。
哦,如 this answer 中所述,您可能需要使该服务 headless。
我知道以下信息不足以追踪问题,但我仍然需要一些解决方案。
我们有 Amazon EKS 集群。
目前我们面临Kafka pod可达性问题
环境:
- 可用区 ap-south-1a,1b 共有 10 个节点
- 我有一个三副本的Kafka集群(Helm图表安装)
- 我有一个zookeeper的三副本(Helm图表安装)
- Kafka 在端口 19092 上使用外部通告侦听器
- Kafka 有内部网络负载均衡器服务
- 我已经部署了一个测试 pod 来检查 Kafka pod 的可达性。
- 我们正在为广告侦听器使用基于云图的 DNS
工作:
- 当我从 ec2 运行 telnet 命令时,如
telnet 10.0.1.45 19092
。它按预期工作。 IP10.0.1.45
是一个负载均衡器 ip。 - 当我 运行 来自 ec2 的 telnet 命令时,如
telnet 10.0.1.69 31899
。它按预期工作。 IP10.0.1.69
是一个实际的节点ip,31899是nodeport.
问题:
- 当我 运行 来自 test-pod 的相同命令时。喜欢
telnet 10.0.1.45 19092
。它有时会工作,有时会出现telnet: Unable to connect to remote host: Connection timed out
之类的错误
问题与 kube-proxy 有关。我们需要帮助来解决这个问题。
谁能帮忙指导一下? 我可以重启 kube-proxy 吗?会影响其他pods/deployments吗?
我认为这个问题是由 AWS 的 NLB 仅 TCP 性质引起的(如评论中所述)。
简而言之,your pod-to-pod communication fails when hairpin is needed。
要确认这是根本原因,您可以验证当 telnet 工作时,kafka pod 和 client pod 不在 同一个 EC2 节点中。当它们在同一个 EC2 服务器中时,telnet 失败。
有(至少)两种方法可以解决这个问题:
- 使用K8s内部网络 - 参考k8s Service的URL
每个 K8s 服务都有 its own DNS FQDN 供内部使用(意味着仅使用 k8s 网络,无需到达 LoadBalancer 并再次返回 k8s)。您可以通过 LB 远程登录而不是 NodePort。
IE。假设您的 kafka 服务名为 kafka
。然后你就可以telnet kafka.svc.cluster.local
(在kafka服务暴露的端口上)
- 使用K8s anti-affinity确保客户端和kafka永远不会在同一个节点上调度。
哦,如 this answer 中所述,您可能需要使该服务 headless。