7

私の目標は、Web アプリケーション (Kubernetes 1.4 クラスターにデプロイされている) が、最初に HTTP 要求を行ったクライアントの IP を認識できるようにすることです。ベアメタル クラスタでアプリケーションを実行する予定であるため、GCE とservice.alpha.kubernetes.io/external-traffic: OnlyLocal1.4 で導入されたサービス アノテーションは適用できません。

代替案を探していると、私の目標を達成するためにイングレスを設定することを提案しているこの質問が見つかりました。そこで、Ingress とNginX Ingress Controllerをセットアップしました。デプロイはスムーズに進み、イングレス アドレスとポート 80 を介して Web アプリに接続できました。 Ingress を介して IP が適切に渡されていません。動作させるには、上記に加えて何を設定する必要があるか教えてください。

私のイングレスの設定:

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

1 に答える 1

5

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

ただし、これが機能するには、上流のサーバー (myWebAppこの場合はサービスを意味します) もこのプロトコルをサポートする必要があります。アップストリーム アプリケーションでも Nginx を使用している場合は、公式ドキュメントに記載されているように、サーバー構成でプロキシ プロトコルのサポートを有効にすることができます。

Nginx Ingress Controller のドキュメントによると、この機能は Kubernetes ConfigMap を使用して Ingress Controller で有効にできます。

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

--nginx-configmap=<insert-configmap-name>コマンドライン引数にフラグを追加して、Ingress コントローラー マニフェストで ConfigMap の名前を指定します。

于 2016-09-29T17:27:16.940 に答える