我尝试将具有身份的ASP.NET Core 1应用程序移植到Kubernetes。登录无法正常工作,我遇到了其他错误,例如 The anti-forgery token could not be decrypted 。问题是我正在使用具有三个副本集的部署,以便进一步的请求由不了解反伪造令牌的不同Pod服务。使用$var = '.txt'
# [regex]::Escape() yields '\.txt', which ensures
# that '.txt' doesn't also match '_txt"
'a_txt a.txt' -replace ('a' + [regex]::Escape($var)), 'a.csv'
可以正常工作。
在同一问题中,我发现了sticky session documentation,似乎可以解决我的问题。 Cookie名称replicas: 3
来自我的浏览器工具。
.AspNetCore.Identity.Application
无论在cookie名称上是否带有前导点,该操作均不起作用。我也尝试添加以下注释
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
在具有ASP.NET Core的Kubernetes上允许粘性会话需要什么?
答案 0 :(得分:0)
发现我犯了两个逻辑错误:
我假设Kubernetes将调查cookie并创建一些cookie哈希到pod的映射。但是,会生成另一个会话并将其附加到我们的http标头中。 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
这按预期工作。