2017-08-29 96 views
2

我已经在k8s上部署了envoy容器作为Istio部署。 每个Envoy代理容器都作为K8s的容器内应用程序容器旁边的“sidecar”安装。从Envoy后面的容器与Redis服务器通信

我能够从应用程序内启动HTTP通信,但在尝试联系Redis服务器(另一个特使代理的另一个容器)时,我无法连接并从envoy接收HTTP/1.1 400 Bad Request消息。

在检查特使的日志我可以看到以下消息每当这个连接通过特使:HTTP/1.1" 0 - 0 0 0 "_"."_"."_"."_""

据我明白,Redis命令被使用纯TCP传输的w/o 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 

感谢

回答

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

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

底线,只是删除port name形式Redis的服务,它应该解决的问题:)