ASP.NET Core on Kubernetes 部署的粘性会话
Sticky session for ASP.NET Core on Kubernetes deployment
我尝试将具有 Identity 的 ASP.NET Core 1 应用程序移植到 Kubernetes。登录不起作用,我收到了不同的错误,例如 The anti-forgery token could not be decrypted。问题是我正在使用具有三个副本集的部署,以便进一步的请求由不知道防伪令牌的不同 pods 提供服务。使用 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 上允许粘性会话需要什么?
发现我犯了两个逻辑错误:
- 粘性 sessions 不能这样工作
我假设 Kubernetes 会查看 cookie 并创建一些 cookie 哈希到 pods 的映射。但是相反,生成了另一个 session 并附加到我们的 http header。 nginx.ingress.kubernetes.io/session-cookie-name
只是那些生成的 cookie 的名称。所以默认情况下,不需要更改它们。
- 右边的范围object
注解必须存在于入口,而不是部署(愚蠢的 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
这按预期工作。
我尝试将具有 Identity 的 ASP.NET Core 1 应用程序移植到 Kubernetes。登录不起作用,我收到了不同的错误,例如 The anti-forgery token could not be decrypted。问题是我正在使用具有三个副本集的部署,以便进一步的请求由不知道防伪令牌的不同 pods 提供服务。使用 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 上允许粘性会话需要什么?
发现我犯了两个逻辑错误:
- 粘性 sessions 不能这样工作
我假设 Kubernetes 会查看 cookie 并创建一些 cookie 哈希到 pods 的映射。但是相反,生成了另一个 session 并附加到我们的 http header。 nginx.ingress.kubernetes.io/session-cookie-name
只是那些生成的 cookie 的名称。所以默认情况下,不需要更改它们。
- 右边的范围object
注解必须存在于入口,而不是部署(愚蠢的 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
这按预期工作。