【问题标题】:Communicating with Redis server from a container behind Envoy从 Envoy 后面的容器与 Redis 服务器通信
【发布时间】:2017-08-29 10:43:26
【问题描述】:

我已经在 k8s 上部署了 envoy 容器作为 Istio 部署的一部分。 每个 Envoy 代理容器都作为“sidecar”安装在 k8s 的 pod 中的应用容器旁边。

我能够从应用程序内部发起 HTTP 流量,但是当我尝试联系 Redis 服务器(具有另一个 envoy 代理的另一个容器)时,我无法连接并接收来自 envoy 的 HTTP/1.1 400 Bad Request 消息。

检查 envoy 的日志时,只要此连接通过 envoy,我就会看到以下消息: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

谢谢

【问题讨论】:

    标签: http tcp kubernetes istio envoyproxy


    【解决方案1】:

    进入 envoy(istio 代理):

    kubectl exec -it my-pod -c proxy bash
    

    查看 envoy 配置:

    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 部署文件)中,会生成不处理行 TCP 的 http_connection_manager 过滤器。

    istio docs:

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

    底线,只需从 Redis 服务中删除 port name 即可解决问题:)

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 2013-05-08
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2014-09-26
      相关资源
      最近更新 更多