web-dev-qa-db-ja.com

ingress-gceを使用してkubernetesクラスターでスティッキネスを実現

Kubernetesクラスターでスティッキネスを実現しようとしていますが、ロードバランサーにアクセスするたびに別のポッドにリダイレクトされます。セッションアフィニティを「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: {}
3
Daniel Barkan

ここでの問題は、サービスが認識するクライアントIPがロードバランサーIPであるということのようです(これは、Nodeポートサービス)で入力を使用していることを前提としています)。 この記事 この問題をもう少し議論し、回避策を提供します。

または、 Network Endpoint Groups を使用することもできます。これにより、基本的にフロントエンドのロードバランサーがトラフィックをコンテナーのバックエンドに直接送信できるようになり、セッションの親和性が向上します。 GKEの入力構成にセッションアフィニティ定義を含めることはできませんが、作成されたL7LBリソースを編集して セッションアフィニティを有効にする

また、Googleで 機能リクエスト を作成して入力リソースにアノテーションを追加し、この機能がGKEに組み込まれるようにLBセッションアフィニティを構成することをお勧めします(通常、k8s以外のGKEリソースを変更することはお勧めしません作成されました)

2
Patrick W