2017-08-29 11 views
2

k8経由のIstio展開の一環として、エンボイコンテナを展開しました。 各Envoyプロキシコンテナは、k8のポッド内のアプリコンテナの横に「サイドカー」としてインストールされます。Envoyの背後にあるコンテナからのRedisサーバーとの通信

アプリケーション内からHTTPトラフィックを開始できますが、Redisサーバー(別の特権プロキシを持つ別のコンテナ)に接続しようとすると、envoyに接続してHTTP/1.1 400 Bad Requestメッセージを受信できません。特使のログを調べるとき

は、私は次のようなメッセージを見ることができたときに特使を通過し、この接続:HTTP/1.1" 0 - 0 0 0 "_"."_"."_"."_""

私の知る限り理解し、Redisのは、HTTP O/W純粋なTCPトランスポートを使用して送信されるコマンド。 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" 
       ] 
      } 
      ] 
     } 
     } 

は、Redisのサービスport name(Kubernetesデプロイメントファイル)へhttpを追加し、行TCPを処理しないhttp_connection_managerフィルタを生成します。

istio docsを参照してください:

Kubernetesサービスが適切にIstioサービスを機能させるために必要されています。 IstioのL7ルーティング機能を利用するには、サービスポートに名前を付ける必要があります。これらの名前はhttpまたはgrpcプレフィックスで始まる必要があります。名前:http-fooまたは名前:httpは良好です。名前のないポートまたはhttpまたはgrpcプレフィックスを持たないポートを持つサービスは、L4トラフィックとしてルーティングされます。

ボトムライン、ちょうどサービスのRedis port nameフォームを削除し、それが問題を解決する必要があります:)

関連する問題