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

在同一个问题中,我发现了 sticky session documentation这似乎是我问题的解决方案。 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 上允许粘性 session 需要什么?

请您参考如下方法:

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

  • 粘性 session 不能以这种方式工作

  • 我假设 Kubernetes 会查看 cookie 并创建一些 cookie 哈希到 pod 的映射。但相反,会生成另一个 session 并将其附加到我们的 http header 。 nginx.ingress.kubernetes.io/session-cookie-name只是那些生成的 cookie 的名称。所以默认情况下,不需要更改它们。
  • 作用域到正确的对象

  • 注释必须出现在入口上,而不是部署上(愚蠢的 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 
    

    这按预期工作。


    评论关闭
    IT序号网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!