You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis通过Traefik代理出现ERR unknown command `PROXY`错误求助

解决Traefik代理Redis时出现的ERR unknown command PROXY及响应顺序异常问题

问题根源分析

  • Proxy Protocol不兼容:你的Traefik IngressRouteTCP配置里开启了proxyProtocol: version:1,但Redis默认未启用Proxy Protocol支持。Traefik会在建立连接后向Redis发送PROXY协议头,而Redis将其识别为无效的Redis命令,因此抛出ERR unknown command PROXY错误。
  • 错误使用HTTP中间件处理TCP流量:stripPrefix是HTTP专属中间件,无法用于TCP路由(IngressRouteTCP),这会导致Traefik对TCP流量的处理逻辑混乱,进而引发响应顺序异常。

修复步骤

1. 移除TCP路由中的HTTP中间件

编辑ingress-redis-service的IngressRouteTCP配置,删除middlewares部分——TCP流量不需要HTTP的路径前缀处理:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: ingress-redis-service
spec:
  entryPoints:
    - websecure
  routes:
  - match: HostSNI(`*`)
    priority: 10
    # 移除不适用的HTTP中间件配置
    services:
    - name: redis-service
      port: 6379
      weight: 10
      terminationDelay: 400
      proxyProtocol:
        version: 1

2. 适配Proxy Protocol配置(二选一)

方案A:保留Proxy Protocol并配置Redis支持

如果需要传递客户端真实IP,修改Redis Deployment配置,添加启动参数开启Proxy Protocol,并指定允许的代理IP段(生产环境建议限定为Traefik集群IP):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:     
        - name: redis
          image: redistimeseries:1.4.10
          securityContext:
            runAsUser: 101          
          ports:
            - containerPort: 6379
          # 添加Redis启动参数开启Proxy Protocol
          args:
            - --proxy-protocol
            - --proxy-protocol-allowlist 0.0.0.0/0 # 生产环境替换为Traefik的IP段
          resources:  
            requests:
              cpu: 0.3
              memory: 2000Mi
            limits:
              cpu: 0.5
              memory: 3000Mi
          volumeMounts:
          - mountPath: /data
            name: redis
      volumes:
      - name: redis
        persistentVolumeClaim:
          claimName: pvc-gluster-redis

方案B:关闭Traefik的Proxy Protocol

如果不需要传递客户端IP,直接移除Traefik中的proxyProtocol配置即可:

# 修改IngressRouteTCP的services部分
services:
- name: redis-service
  port: 6379
  weight: 10
  terminationDelay: 400
  # 移除Proxy Protocol配置

3. 验证修复

应用修改后的配置:

kubectl apply -f redis-deployment.yaml
kubectl apply -f ingress-redis-service.yaml

重新用redis-cli连接测试:

.\redis-cli.exe -h my-traefik-ip -p 443
my-traefik-ip :443> PING
PONG

此时PROXY命令错误会消失,响应顺序也恢复正常。

内容的提问来源于stack exchange,提问作者devopsmaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:50:21