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

Zvi*_*ika 5 tcp http kubernetes istio envoyproxy

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

我能够从应用程序内部启动 HTTP 流量,但是当尝试联系 Redis 服务器(另一个具有另一个特使代理的容器)时,我无法连接和接收 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
Run Code Online (Sandbox Code Playgroud)

谢谢

Eff*_*'an 2

进入 Envoy(istio 代理):

\n\n
kubectl exec -it my-pod -c proxy bash\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看 Envoy 配置:

\n\n
cat /etc/envoy/envoy-rev2.json\n
Run Code Online (Sandbox Code Playgroud)\n\n

您将看到它生成一个 TCP 代理过滤器,仅处理 TCP 流量。雷迪斯示例:

\n\n
"address": "tcp://10.35.251.188:6379",\n  "filters": [\n    {\n      "type": "read",\n      "name": "tcp_proxy",\n      "config": {\n        "stat_prefix": "tcp",\n        "route_config": {\n          "routes": [\n            {\n              "cluster": "out.cd7acf6fcf8d36f0f3bbf6d5cccfdb5da1d1820c",\n              "destination_ip_list": [\n                "10.35.251.188/32"\n              ]\n            }\n          ]\n        }\n      }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

请参阅istio 文档

\n\n
\n

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

\n
\n\n

底线,只需删除port nameRedis 服务即可解决问题:)

\n