2017-08-29 107 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的服務,它應該解決的問題:)