首页 文章

从Envoy后面的容器与Redis服务器通信

提问于
浏览
3

我已经将envoy容器部署为k8s上的Istio部署的一部分 . 每个Envoy代理容器都安装为k8s pod中app容器旁边的“sidecar” .

我'm able to initiate HTTP traffic from within the application, but when trying to contact Redis server (another container with another envoy proxy), I' m无法连接并接收来自envoy的 HTTP/1.1 400 Bad Request 消息 .

在检查特使的日志时,只要此连接通过特使,我就会看到以下消息: HTTP/1.1" 0 - 0 0 0 "_"."_"."_"."_""

据我所知,Redis命令是使用纯TCP传输而不是HTTP发送的 . Envoy有可能期望只看到HTTP流量并拒绝仅TCP流量吗?假设我的理解是正确的,有没有办法使用Istio更改此行为并接受和处理通用TCP流量?

以下是我的相关部署yaml文件:

apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: default
  labels:
    component: redis
    role: client
spec:
  selector:
    app: redis
  ports:
  - name: http
    port: 6379
    targetPort: 6379
    protocol: TCP
  type: ClusterIP

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: redis-db
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:3.2-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 6379

谢谢

1 回答

  • 0

    进入特使(istio代理):

    kubectl exec -it my-pod -c proxy bash
    

    看特使配置:

    cat /etc/envoy/envoy-rev2.json
    

    您将看到它生成一个TCP代理筛选器,它只处理TCP流量 . Redis示例:

    "address": "tcp://10.35.251.188:6379",
      "filters": [
        {
          "type": "read",
          "name": "tcp_proxy",
          "config": {
            "stat_prefix": "tcp",
            "route_config": {
              "routes": [
                {
                  "cluster": "out.cd7acf6fcf8d36f0f3bbf6d5cccfdb5da1d1820c",
                  "destination_ip_list": [
                    "10.35.251.188/32"
                  ]
                }
              ]
            }
          }
    

    在您的情况下,将 http 添加到Redis服务 port name (Kubernetes部署文件)中,生成 http_connection_manager 过滤器,该过滤器不处理行TCP .

    istio docs

    正常运作的Istio服务需要Kubernetes服务 . 必须命名服务端口,并且这些名称必须以http或grpc前缀开头,以利用Istio的L7路由功能,例如:名称:http-foo或名称:http很好 . 具有非命名端口或没有http或grpc前缀的端口的服务将路由为L4流量 .

    底线,只需删除 port name 表格Redis服务,它应该解决问题:)

相关问题