【问题标题】:Kubernetes not load balancing across nodes in the clusterKubernetes 没有跨集群中的节点进行负载均衡
【发布时间】:2021-10-03 15:40:20
【问题描述】:

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

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

我正在运行一个名为“hello-world”的部署,该部署基于具有 20 个副本的 bashofmann/rancher-demo 映像。我还创建了一个名为 hello-world 的节点端口服务,它将节点端口 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

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

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

它永远不会加载任何其他工作节点上的任何 pod 提供的网站。从 k8s-master 我可以发出“curl --insecure 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 的所有端口吗?这似乎是一个可能的安全漏洞。

【问题讨论】:

  • 你在服务上设置externalTrafficPolicy: Local了吗?
  • @coderanger "kubectl describe service hello-world" 显示“外部流量策略:集群”
  • @LovedeepSharma 我去 192.168.188.190:30213 时根本没有任何网站。

标签: kubernetes kubernetes-pod


【解决方案1】:

您面临的行为可能是由您为负载平衡您的 pod 创建的服务类型决定的:您使用了类型 NodePort

提到official kubernetes documentation 类型 NodePort 是在静态端口(在您的情况下为 30213)上的每个节点的 IP 上公开服务。在这种情况下,通过向节点发出请求,您始终可以一致地看到相同的节点以及在该节点上调度的 pod 数量,在您提到的示例中:8(请注意,此数字可能会因 pod 分布而异) .

如果您想对所有 pod 进行负载平衡,您应该使用服务类型:LoadBalancerClusterIp + Ingress

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

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多