使用 ingress-gce 在 kubernetes 集群上实现粘性

使用 ingress-gce 在 kubernetes 集群上实现粘性

我正在尝试在 kubernetes 集群上实现粘性,但每次访问负载均衡器时,我都会被重定向到不同的 pod。我将会话亲和性设置为“ClientIP”,并尝试使用“生成的 Cookie”。

我已设置以下后端服务:

apiVersion: v1
kind: Service
metadata:
  annotations:
    beta.cloud.google.com/backend-config: '{"ports": {"80":"test-backendconfig"}}'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"beta.cloud.google.com/backend-config":"{\"ports\": {\"80\":\"test-backendconfig\"}}"},"labels":{"app":"test","tier":"frontend"},"name":"test","namespace":"default"},"spec":{"ports":[{"name":"backend-port","port":80,"targetPort":5000}],"selector":{"app":"test","tier":"frontend"},"sessionAffinity":"ClientIP","type":"NodePort"}}
  creationTimestamp: 2018-12-31T18:01:26Z
  labels:
    app: test
    tier: frontend
  name: test
  namespace: default
  resourceVersion: "..."
  selfLink: /api/v1/namespaces/default/services/test
  uid: ...
spec:
  clusterIP: 10.**.***.***
  externalTrafficPolicy: Cluster
  ports:
  - name: backend-port
    nodePort: 32385
    port: 80
    protocol: TCP
    targetPort: 5000
  selector:
    app: test
    tier: frontend
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
  type: NodePort
status:
  loadBalancer: {}

答案1

这里的问题似乎是服务看到的客户端 IP 是负载均衡器 IP(这假设您正在使用带有节点端口服务的入口)。本文进一步讨论了这个问题并提供了解决方法。

或者,您可以使用网络端点组这实际上将允许前端负载均衡器将流量直接发送到容器后端,从而提高会话亲和性。您仍然无法将会话亲和性定义包含在 GKE 的入口配置中,但您可以在创建 L7LB 资源后对其进行编辑以启用会话亲和性

我还建议创建一个功能要求与 Google 合作向入口资源添加注释,以配置 LB 会话亲和性,从而将此功能内置到 GKE 中(通常不建议在创建 GKE 资源后在 k8s 之外对其进行修改)

相关内容