3

我尝试将带有 Identity 的 ASP.NET Core 1 应用程序移植到 Kubernetes。登录不起作用,我收到了不同的错误,例如The anti-forgery token could not be decrypted。问题是我正在使用具有三个副本集的部署,以便进一步的请求由不知道防伪令牌的不同 pod 提供服务。使用replicas: 3它有效。

在同一个问题中,我发现了一个粘性会话文档,这似乎可以解决我的问题。cookie 名称.AspNetCore.Identity.Application来自我的浏览器工具。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp-k8s-test
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: ".AspNetCore.Identity.Application"
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: myapp-k8s
    spec:
      containers:
      - name: myapp-app
        image: myreg/myapp:0.1
        ports:
        - containerPort: 80
        env:
        - name: "ASPNETCORE_ENVIRONMENT"
          value: "Production"
      imagePullSecrets:
      - name: registrypullsecret

这不起作用,无论是否在 cookie 名称处有前导点。我还尝试添加以下注释

kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/session-cookie-hash: sha1

使用 ASP.NET Core 在 Kubernetes 上允许粘性会话需要什么?

4

1 回答 1

3

发现我犯了两个逻辑错误:

  1. 粘性会话不能以这种方式工作

我假设 Kubernetes 会查看 cookie 并创建一些 cookie 哈希到 pod 的映射。但相反,会生成另一个会话并将其附加到我们的 http 标头。nginx.ingress.kubernetes.io/session-cookie-name只是那些生成的 cookie 的名称。因此,默认情况下,不需要更改它们。

  1. 范围到正确的对象

注释必须出现在入口上,而不是部署上(愚蠢的 c&p 错误)

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myapp-k8s-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-hash: sha1

spec:
  tls:
  - hosts:
    - myapp-k8s.local
  rules:
  - host: myapp-k8s.local
    http:
      paths:
      - path: /
        backend:
          serviceName: myapp-svc
          servicePort: 80

这按预期工作。

于 2019-03-14T16:41:23.133 回答