为了账号安全,请及时绑定邮箱和手机立即绑定

Kubernetes 集群中只有 1 个 pod 处理所有请求

Kubernetes 集群中只有 1 个 pod 处理所有请求

Go
慕村9548890 2023-07-31 16:11:12
以下是 minikube Kubernetes 的清单文件,用于部署和服务:apiVersion: apps/v1kind: Deploymentmetadata:  name: hello-deploymentspec:  selector:    matchLabels:      app: hello  replicas: 3  template:    metadata:      labels:        app: hello    spec:      containers:      - name: hello        image: hello_hello        imagePullPolicy: Never        ports:        - containerPort: 4001          protocol: TCP---apiVersion: v1kind: Servicemetadata:  name: hellospec:  selector:    app: hello  ports:  - port: 4001    nodePort: 30036    protocol: TCP  type: NodePort以及一个用 Golang 编写的简单 HTTP 服务器package mainimport (    http "net/http"    "github.com/gin-gonic/gin")func main() {    r := gin.Default()    r.GET("/ping", func(c *gin.Context) {        c.JSON(200, gin.H{            "message": "pong",        })    })    server := &http.Server{        Addr:    ":4001",        Handler: r,    }    server.ListenAndServe()}当我向IP:30036/ping发出多个请求,然后打开 pod 的日志时,我可以看到 3 个 pod 中只有 1 个处理所有请求。如何让其他 Pod 响应请求?
查看完整描述

3 回答

?
MM们

TA贡献1886条经验 获得超2个赞

您正在使用 NodePort 公开服务,因此没有反向代理,但您直接连接到您的 Pod。这是一个不错的选择。(稍后您可能想使用 Ingress)

您看到的是只有一个 Pod 处理您的请求。您希望每个请求都负载均衡到不同的 pod。你的假设是正确的,但是负载均衡不是发生在HTTP请求层,而是发生在TCP层。

因此,当您拥有持久的 TCP 连接并重新使用它时,您将不会体验到您期望的负载平衡。由于建立 TCP 连接的延迟时间相当昂贵,因此通常会进行优化以避免重复打开新的 TCP 连接:HTTP keep-alive。

大多数框架和客户端默认启用 Keep Alive,Go 也是如此。尝试s.SetKeepAlivesEnabled(false)看看是否可以解决您的问题。(仅推荐用于测试!)

您还可以使用多个不同的客户端,通过命令行使用curl 或在Postman 中禁用keep-alive。


查看完整回答
反对 回复 2023-07-31
?
ibeautiful

TA贡献1993条经验 获得超5个赞

在 Kubernetes 集群中,发送到 k8s 服务的请求通过kube-proxy进行路由。

默认kube-proxy模式是Iptalbles从 Kubernetes v1.2 开始的,它允许服务和后端 Pod 之间更快的数据包解析。后端 Pod 之间的负载平衡直接通过iptables rules.

也许您没有生成足够的负载,而一个 pod 无法处理,这就是您从 路由到同一个 pod 的原因kube-proxy


查看完整回答
反对 回复 2023-07-31
?
当年话下

TA贡献1890条经验 获得超9个赞

我尝试使用请求标头,它解决了负载平衡问题,其中所有请求仅命中单个副本,而对于演示或测试,能够将请求分发到所有副本非常有用

连接:保持活动 连接:关闭

该请求总是到达同一个 pod

curl -H "Connection: keep-alive" http://your-service:port/path

但是,使用close,请求会平衡到所有 pod

curl -H "Connection: close" http://your-service:port/path


查看完整回答
反对 回复 2023-07-31
  • 3 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信