【问题标题】:Load distribution: All HTTP requests are getting redirected to a single pod in a k8 cluster负载分配:所有 HTTP 请求都被重定向到 k8 集群中的单个 pod
【发布时间】:2021-03-03 15:38:11
【问题描述】:

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

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 port-forward deployment.apps/springapp 40002:8080 访问应用程序。

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

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

我没有找到我做错的地方。任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: kubernetes load-balancing minikube kubernetes-pod kube-proxy


    【解决方案1】:

    负载平衡可能不适用于端口转发的端口,因为它可能会将流量直接重定向到 pod(阅读更多 here)。 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 的主机连接到目标主机和端口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2020-02-23
      • 2021-03-02
      • 2021-09-28
      • 2018-05-05
      • 2014-06-30
      相关资源
      最近更新 更多