负载分布:所有 HTTP 请求都被重定向到 k8 集群中的单个 pod

Load distribution: All HTTP requests are getting redirected to a single pod in a k8 cluster

我创建了一个非常简单的 spring 启动应用程序,只有一个 REST 服务。此应用程序被转换为 docker 图像 ("springdockerimage:1") 并部署在具有 3 个副本的 Kubernetes 集群中。我的“部署”定义内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springapp
  labels:
   app: distributiondemo
spec:
 selector:
   matchLabels:
     app: distributiondemo
 replicas: 3
 template:
   metadata:
     labels:
       app: distributiondemo
   spec:
     containers:
      - name: spring-container
        image: springdockerimage:1

我已经为我的上述部署创建了如下服务:

apiVersion: v1
kind: Service
metadata:
  name: springservice
  labels:
    app: distributiondemo
spec:
  selector:
    app: distributiondemo
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    name: spring-port
    nodePort: 32000
  type: NodePort

部署上述两个 YAML(部署和服务)文件后,我注意到一切都已按预期部署,即创建了 3 个副本,我的服务也有 3 个端点。下面的截图是相同的证明:

由于我使用 minikube 进行本地测试,我正在端口转发并以 kubectl 端口转发部署方式访问应用程序。apps/springapp 40002:8080 .

但我注意到的一件事是我所有的 HTTP 请求都被重定向到一个 pod。

while true ; do curl http://localhost:40002/docker-java-app/test ;done

我不知道我做错了什么。任何帮助,将不胜感激。谢谢。

负载平衡可能不适用于端口转发的端口,因为它可能会直接将流量重定向到 pod(阅读更多内容 )。 K8s 服务是该功能将为您提供负载平衡功能。

因此您可以尝试以下任一方法

  1. 使用http://your_service_dns_name:8080/docker-java-app/test
  2. 使用http://service_cluster_ip:8080/docker-java-app/test
  3. 使用http://any_host_ip_from_k8s_cluster:32000/docker-java-app/test

只有当您从属于 K8s 集群的主机访问这些 url 时,选项 1 和 2 才有效。选项 3 只需要从您正在访问的主机连接到目标主机和端口 url.