Kubernetes使用Ingress做代理引发的PHP session问题

这篇是关于Kubernetes使用Ingress做代理引发的PHP session问题。

在Kubernetes上部署了一个PHP传统站点,使用session做会话保持,nginx和php-fpm副本数都是1,但是登录后一刷新页面登录状态就失效,快的时候一次,慢的时候也就两三次。

多番排查无果,包括修改php.ini中的session配置,以及在程序中使用Redis存储session,问题依旧。

最后突然想起来nginx前面还有一层ingress,副本数是2,于是减少到1,问题不再出现,但这不能从根本上解决,ingress重启后问题还是会出现。

最简单的源头上的解决方法:修改ingress的默认配置。

需要修改的是Ingress的Service配置,把sessionAffinityNone改成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。

Leave a Comment

豫ICP备19001387号-1