2016-09-29 8 views
4

私の目標は、Webアプリケーション(Kubernetes 1.4クラスタにデプロイされたもの)に、もともとHTTPリクエストを行ったクライアントのIPを表示させることです。ベアメタルクラスタ上でアプリケーションを実行する予定であるため、1.4で導入されたGCEとservice.alpha.kubernetes.io/external-traffic: OnlyLocalサービスアノテーションは当てはまりません。IngressでリモートクライアントIPを維持する

代替手段をお探しの場合は、目標を達成するためにIngressを設定することを提案しているthis questionが見つかりました。そこで、Ingressとthe NginX Ingress Controllerを設定しました。デプロイメントはスムーズに進み、Ingress Addressとポート80経由で私のWebアプリケーションに接続することができました。しかし、ログではまだクラスタ内部IP(172.16.0.0/16から)の範囲が表示されます。これは、外部クライアントIPはIngress経由で正しく渡されていません。上記に加えて設定する必要があることを教えてください。

マイ進入設定:層4プロキシとして

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: myWebApp 
spec: 
    backend: 
    serviceName: myWebApp 
    servicePort: 8080 

答えて

3

、nginxのは、実際のIPパケットの元の送信元IPアドレスを保持することができません。 Proxy protocolを使用してこの問題を回避することができます(リンクはHAProxyのドキュメントを指しますが、Nginxもこれをサポートしています)。

しかし、これを実行するには、アップストリームサーバー(場合によってはmyWebAppサービス)もこのプロトコルをサポートする必要があります。アップストリームアプリケーションでNginxも使用されている場合は、in the official documentationのように、サーバー構成でプロキシプロトコルのサポートを有効にすることができます。

Nginx Ingress Controller's documentationによると、この機能はKubernetes ConfigMapを使用して入コントローラで有効にすることができます。

apiVersion: v1 
kind: ConfigMap 
metadata: 
    name: nginx-ingress-controller 
data: 
    use-proxy-protocol: "true" 

は、コマンドに--nginx-configmap=<insert-configmap-name>フラグを追加することによって、あなたのIngressコントローラマニフェストでConfigMapの名前を指定します。行引数。

関連する問題