这篇是关于Kubernetes使用Ingress做代理引发的PHP session问题。
在Kubernetes上部署了一个PHP传统站点,使用session做会话保持,nginx和php-fpm副本数都是1,但是登录后一刷新页面登录状态就失效,快的时候一次,慢的时候也就两三次。
多番排查无果,包括修改php.ini
中的session配置,以及在程序中使用Redis存储session,问题依旧。
最后突然想起来nginx前面还有一层ingress,副本数是2,于是减少到1,问题不再出现,但这不能从根本上解决,ingress重启后问题还是会出现。
最简单的源头上的解决方法:修改ingress的默认配置。
需要修改的是Ingress的Service配置,把sessionAffinity
从None
改成ClientIP
,最终效果如下
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/version: 1.0.0
k8s.kuboard.cn/managed-by-kuboard: 'true'
name: ingress-nginx-controller-nginx
namespace: ingress-nginx
resourceVersion: '371328'
spec:
clusterIP: 10.109.211.9
clusterIPs:
- 10.109.211.9
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- appProtocol: http
name: http
nodePort: 32466
port: 80
protocol: TCP
targetPort: http
- appProtocol: https
name: https
nodePort: 30976
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx-nginx
app.kubernetes.io/name: ingress-nginx
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
type: NodePort
由于我用的是Kuboard自带的Ingress,所以要修改的是
Service:ingress-nginx / ingress-nginx-controller-nginx
,位于集群管理->网络->IngressClass
中,点击你所安装的Ingress就能看到了。
修改后需要重启下Ingress。