Google-Cloud-Platform

使用 ingress-gce 在 Kubernetes 集群上實現粘性

  • January 2, 2019

我試圖在 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: {}

似乎這裡的問題是服務看到的客戶端 IP 是負載均衡器 IP(這假設您正在使用節點埠服務的入口)。本文更多地討論了這個問題並提供了一種解決方法。

或者,您可以使用網路端點組,這基本上允許前端負載均衡器將流量直接發送到容器後端,從而提高會話親和性。您仍然無法將會話親和性定義包含到 GKE 的入口配置中,但您可以在創建 L7LB 資源後對其進行編輯以啟用會話親和性

我還建議向 Google 創建一個功能請求,以向入口資源添加註釋以配置 LB 會話親和性以將此功能內置到 GKE 中(通常不建議在創建 k8s 之外修改 GKE 資源)

引用自:https://serverfault.com/questions/947204