当前位置: 首页 > 知识库问答 >
问题:

Kubernetes不在集群中的节点之间进行负载平衡

柴声
2023-03-14

我按照此处找到的指南设置了一个 4 节点 Kubernetes 集群:https://www.tecmint.com/install-a-kubernetes-cluster-on-centos-8/

它有一个主节点和3个工作节点。

我正在运行一个名为“hello world”的部署,它基于bashofmann/rancher演示映像,有20个副本。我还创建了一个名为hello world的nodeport服务,它将nodeport 30213映射到每个pod上的端口8080。

基本细节见下文:

# kubectl get all
NAME                               READY   STATUS    RESTARTS   AGE
pod/hello-world-655b948488-22dq4   1/1     Running   0          112m
pod/hello-world-655b948488-2fd7f   1/1     Running   0          112m
pod/hello-world-655b948488-2hrtw   1/1     Running   0          112m
pod/hello-world-655b948488-5h4ns   1/1     Running   0          112m
pod/hello-world-655b948488-5zg9w   1/1     Running   0          112m
pod/hello-world-655b948488-7kcsp   1/1     Running   0          112m
pod/hello-world-655b948488-c5m67   1/1     Running   0          112m
pod/hello-world-655b948488-dswcv   1/1     Running   0          112m
pod/hello-world-655b948488-fbtx6   1/1     Running   0          112m
pod/hello-world-655b948488-g7bxp   1/1     Running   0          112m
pod/hello-world-655b948488-gfb4v   1/1     Running   0          112m
pod/hello-world-655b948488-j6lz9   1/1     Running   0          112m
pod/hello-world-655b948488-jthnq   1/1     Running   0          112m
pod/hello-world-655b948488-pm5b8   1/1     Running   0          112m
pod/hello-world-655b948488-qt7gs   1/1     Running   0          112m
pod/hello-world-655b948488-s2hjv   1/1     Running   0          112m
pod/hello-world-655b948488-vcjzz   1/1     Running   0          112m
pod/hello-world-655b948488-vprgn   1/1     Running   0          112m
pod/hello-world-655b948488-x4b9n   1/1     Running   0          112m
pod/hello-world-655b948488-ztfh7   1/1     Running   0          112m

NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/hello-world   NodePort    10.110.212.243   <none>        8080:30213/TCP   114m
service/kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP          2d2h

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-world   20/20   20           20          112m

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-world-655b948488   20        20        20      112m

# kubectl get nodes -o wide
NAME          STATUS   ROLES                  AGE    VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                 CONTAINER-RUNTIME
k8s-master    Ready    control-plane,master   2d2h   v1.21.3   192.168.188.190   <none>        CentOS Linux 8   4.18.0-305.10.2.el8_4.x86_64   docker://20.10.7
k8s-worker1   Ready    <none>                 2d2h   v1.21.3   192.168.188.191   <none>        CentOS Linux 8   4.18.0-305.10.2.el8_4.x86_64   docker://20.10.7
k8s-worker2   Ready    <none>                 2d2h   v1.21.3   192.168.188.192   <none>        CentOS Linux 8   4.18.0-305.10.2.el8_4.x86_64   docker://20.10.7
k8s-worker3   Ready    <none>                 2d2h   v1.21.3   192.168.188.193   <none>        CentOS Linux 8   4.18.0-305.10.2.el8_4.x86_64   docker://20.10.7

我发现群集未在三个工作节点之间进行负载平衡。如果我打开我的Web浏览器并转到 http://192.168.188.191:30213 那么它将加载网站,但只有在k8s-worker1上的pods提供时才加载。同样,如果我去 http://192.168.188.192:30213 那么它会加载网站,但只有当k8s-worker2上的pods提供时。

这个特定容器/吊舱图像的一点是,它将显示在任何给定时间哪个吊舱正在为我的网站请求提供服务。页面刷新并循环浏览集群中的所有可用pod。我可以看到,每当页面成功刷新时,它只会由k8s-worker1上的一个pod提供服务。它还会显示存在多少副本。我应该看到20个,但我最多只能看到8个副本。

它永远不会加载由任何其他工作节点上的任何 Pod 提供的网站。从 k8s-master 中,我可以发出“curl --不安全 http://192.168.188.191:30213”命令,并在大约 33% 的时间内得到响应。其余时间它会失败。我相信这是因为它试图对其他工作节点的请求进行负载平衡,但这些请求失败了。

由于我对这个东西还很陌生,所以我不知道该看什么。副本集是否有问题?

每个工作节点都打开了以下防火墙规则:

# firewall-cmd --list-ports
6443/tcp 2379-2380/tcp 10250/tcp 10251/tcp 10252/tcp 10255/tcp 6783/tcp 6783/udp 6784/udp 443/tcp

我是否需要打开更多端口?我是否应该打开3000-32767的所有端口?这似乎是一个可能的安全漏洞。

共有1个答案

王宏扬
2023-03-14

您所面临的行为可能由您为pod负载平衡创建的服务类型给出:您使用了类型NodePort。

提到kubernetes的官方文档,NodePort类型是在每个节点的IP上的静态端口(在您的示例中是30213)上公开服务。在这种情况下,通过向节点发出请求,您可以连贯地看到始终相同的节点和该节点上调度的POD数量,在您提到的示例中:8(请注意,该数量可能会随POD分布而变化)。

如果您想对所有pod进行负载平衡,您应该使用一种服务类型:LoadBalancer或ClusterIp入口。

请注意,我提到的两个选项都要求集群能够具有外部 IP,该 IP 在 kubernetes 作用域之外进行外部负载平衡。如果您使用的是托管 kubernetes 安装(例如 GKE、EKS、AKS),您将“免费”拥有它。由于您使用的是自定义群集安装,因此对于负载平衡,您可以查看 MetalLB 项目。

 类似资料:
  • 我创建了一个部署,它导致跨2个节点存在4个吊舱。 然后,我通过一个服务公开这些pod,该服务将产生以下集群IP和podendpoint: 如果通过集群IP在内部访问服务,请求将在两个节点和所有pod之间平衡,而不仅仅是在单个节点上的pod之间平衡(例如,像通过节点端口访问一样)。 我知道kubernetes使用IP表来平衡单个节点上跨吊舱的请求,但我找不到任何文档来解释kubernetes如何平衡

  • 我有一个名为“backend-app”的应用程序部署在几个不同节点上的pod中运行。我还有一个服务,它将“backend-app”公开为其他集群内部pod作为我的“前端应用程序”pod访问。 如果我使用 DNS 从不同的应用部署(称为“前端应用”)连接到“后端应用”,是否会将请求负载均衡到每个节点上的每个“后端应用”Pod? 听起来NodePort服务只会连接到一个节点,而不会对我对其他节点的请求

  • 我在3个节点上进行了压力测试,但只有一个CPU很高,其他的都很低。Ignite集群使用TCP发现,我有一个jdbc连接,例如:jdbc:Ignite:Thin://172.16.14.15、172.16.14.16、172.16.14.17/

  • 假设我在一个集群中有3个ActiveMQ Artemis代理: 经纪人_01 在给定的时间点,我有每个经纪人的消费者数量: 经纪人有50名消费者 让我们假设在这个给定的时间点,有70条消息要发送到集群中的一个队列。 我们期望集群完成负载平衡,以便Broker_01将接收50条消息,Broker_0210条消息,Broker_0310条消息,但目前我们正在经历70条消息通过所有3个代理随机分发。 是

  • 我安装了一个kubernetes集群。我想为我的一个微服务使用外部数据库(在我的集群之外),但这个外部数据库被设置为集群,没有自己的负载均衡器。 有没有办法创建一个内部负载平衡器服务,让kubernetes始终将微服务定向到正在运行的实例? 我看到您可以设置loadbalancer类型的服务,我如何使用它?我尝试创建它,但我看到loadbalancer服务是用NodePort创建的。它可以在没有节

  • 我必须手动在MS Azure中创建Kubernetes群集,而不是使用AKS。因此: > 我在一个可用性集中创建了2个VM:一个用于k8s master,第二个用于k8s节点。 我创建了外部负载均衡器并将2个VM添加到后端池。 我使用kubes祈祷创建了k8s集群。 我创建了部署和负载均衡器服务: 但LoadBalancer服务外部IP始终处于挂起状态: 此外,telnet azure\u loa