入口规则未在 pods 之间平均分配流量,

Ingress rule not distribute traffic equally between pods,

我们在 GKE 中启用了水平 pod 自动缩放,我们的 pods 位于 clusterIP 类型服务后面,我们正在使用 NGINX Ingress 控制器将 public 流量路由到该服务。 在监控使用情况时,我们注意到 pods 之间的流量分布不均。它将流量路由到一个 pod。但是每当我们手动删除那个特定的 pod 时,它会将流量路由到另一个可用的 pod。

有什么方法可以启用入口规则来平均分配流量

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/load-balance: round_robin
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.org/proxy-connect-timeout: 30s
    nginx.org/proxy-read-timeout: 20s
  generation: 11
  name: test-ingress
  namespace: default
spec:
  rules:
  - host: gateway.example.com
    http:
      paths:
      - backend:
          serviceName: gateway-443
          servicePort: 443
        path: /
      - backend:
          serviceName: gateway-80
          servicePort: 80
        path: /

服务清单

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/neg: '{"ingress":true}'
    serviceloadbalancer/lb.cookie-sticky-session: "false"
    serviceloadbalancer/lb.host: gateway.example.com
    serviceloadbalancer/lb.sslTerm: "true"
  labels:
    name: gateway-default
    port: gateway-default-8243
  name: gateway-8243
  namespace: default
spec:
  clusterIP: 10.20.215.122
  ports:
  - name: pass-through-https
    port: 443
    protocol: TCP
    targetPort: 8243
  selector:
    name: gatway-default
  sessionAffinity: ClientIP
  type: ClusterIP

您的 Ingress 应该有一个服务名称,在您的情况下是“gateway-443”和“gateway-80”,但在 metadata.name 中服务中指定的实际名称是“gateway-8243”。

(如果这是故意的,请 post 其他资源的 YAML,以便我查看整个设置。)

另请查看 this page,其中有很多关于如何实现您想要做的事情的好例子。

终于,我找到了问题所在,原因是设置 sessionAffinity: ClientIP,

仅当您想要确保来自特定客户端的连接每次都传递到同一个 Pod 时,您应该将会话亲和力设置为 ClientsIP,它会根据客户端的 IP 地址路由流量。要在 pods 之间平均分配流量,您可以使用值“None”或删除此 sessionAffinity 参数,因为默认值为 none.

参考资料,

https://kubernetes.io/docs/concepts/services-networking/service/#proxy-mode-userspace