【问题标题】:Problems configuring Ingress with cookie affinity使用 cookie 亲和性配置 Ingress 时出现问题
【发布时间】:2019-09-10 10:27:51
【问题描述】:

我正在寻找如何在 GKE 中使用 cookie 亲和性,为此使用 Ingress。

我找到了以下链接:https://cloud.google.com/kubernetes-engine/docs/how-to/configure-backend-service

我创建了一个包含以下内容的 yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-bsc-deployment
spec:
  selector:
    matchLabels:
      purpose: bsc-config-demo
  replicas: 3
  template:
    metadata:
      labels:
        purpose: bsc-config-demo
    spec:
      containers:
      - name: hello-app-container
        image: gcr.io/google-samples/hello-app:1.0
---
apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: my-bsc-backendconfig
spec:
  timeoutSec: 40
  connectionDraining:
    drainingTimeoutSec: 60
  sessionAffinity:
    affinityType: "GENERATED_COOKIE"
    affinityCookieTtlSec: 50
---
apiVersion: v1
kind: Service
metadata:
  name: my-bsc-service
  labels:
    purpose: bsc-config-demo
  annotations:
    beta.cloud.google.com/backend-config: '{"ports": {"80":"my-bsc-backendconfig"}}'
spec:
  type: NodePort
  selector:
    purpose: bsc-config-demo
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-bsc-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: my-bsc-service
          servicePort: 80
---

一切似乎都很顺利。当我检查创建的 Ingress 时,我看到了 2 个后端服务。其中一个配置了 cookie,但另一个没有。

如果我创建部署,并从 GCP 的控制台创建服务和入口,则只会出现一个后端服务。

有人知道为什么使用 yaml 我得到 2,但从控制台执行却只得到一个?

提前致谢

奥斯卡

【问题讨论】:

  • YAML 定义和控制台最后都应该发出相同的请求。因此,要么在您的 YAML 中包含的 UI 中没有“映射”的内容,要么请求不同。请分享在控制台中复制它的步骤。
  • 嗨。我在控制台中所做的是: - 选择部署并单击 Expose。我选择 NodePort 作为服务。 - 创建服务后,我选择它并单击“创建入口” - 在那里我选择之前创建的服务作为后端服务并创建入口 - 创建入口后,我选择后端服务(只有一个,没有2) 并使用 cookie 配置会话亲和性

标签: cookies kubernetes google-kubernetes-engine kubernetes-ingress affinity


【解决方案1】:

你的定义很好。

您有两个后端的原因是您的入口没有定义默认后端。 GCE LB 需要一个默认后端,因此在创建 LB 期间,将第二个后端添加到 LB 中作为默认后端(该后端只提供 404 响应)。默认后端不使用 backendConfig。

这应该不是问题,但如果您想确保只使用您的后端,请通过添加 spec.backend 在入口定义中定义默认后端值:

apiVersion:扩展/v1beta1 种类:入口 元数据: 名称:我的 bsc 入口 规格: 后端: 服务名称:my-bsc-service 服务端口:80 规则: - 网址: 路径: - 小路: /* 后端: 服务名称:my-bsc-service 服务端口:80

但是,就像我说的,您不需要定义它,额外的后端不会真正发挥作用,也不需要会话关联(反正只有一个 pod)。如果您好奇,有问题的默认后端 pod 在 kube-system 命名空间中称为 l7-default-backend-[replicaSet_hash]-[pod_hash]

【讨论】:

  • 这正是问题所在。在 yaml 中设置默认后端服务后,只会创建一个。谢谢!!
【解决方案2】:

您可以像

一样在入口启用 cookie
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-sticky
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

spec:
  rules:
  - host: ingress.example.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /

您可以像这样创建服务:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  sessionAffinity: ClientIP

如果您使用的是 traefik 入口而不是 nginx 和默认 GKe 入口,您可以像这样编写服务

apiVersion: v1
kind: Service
metadata:
  name: session-affinity
  labels:
    app: session-affinity
  annotations:
    traefik.ingress.kubernetes.io/affinity: "true"
    traefik.ingress.kubernetes.io/session-cookie-name: "sticky"
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: session-affinity-demo

【讨论】:

  • 您好,我需要在服务中使用“sessionAffinity:ClientIP”来处理与 cookie 的关联性吗?我已经尝试不使用该行,并从 GKE 检查 Ingress 对象,我看到 2 个后端服务,并且两者都没有为会话关联配置 cookie
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多