Google-Cloud-Platform
使用 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: {}
似乎這裡的問題是服務看到的客戶端 IP 是負載均衡器 IP(這假設您正在使用節點埠服務的入口)。本文更多地討論了這個問題並提供了一種解決方法。
或者,您可以使用網路端點組,這基本上允許前端負載均衡器將流量直接發送到容器後端,從而提高會話親和性。您仍然無法將會話親和性定義包含到 GKE 的入口配置中,但您可以在創建 L7LB 資源後對其進行編輯以啟用會話親和性
我還建議向 Google 創建一個功能請求,以向入口資源添加註釋以配置 LB 會話親和性以將此功能內置到 GKE 中(通常不建議在創建 k8s 之外修改 GKE 資源)