前回の投稿で、NGINX Ingress Controllerを作成してIPアクセス制御する方法を検証しました。
インターネットから直接アクセスする場合にはこれで良いのですが、フロントエンドポイントがLoad Balancerではなく、
- Application Gateway
- Front Door
といったレイヤー7のロードバランサーや、インターネットトラフィックを制御するコンポーネントが前段としてある場合は追加の設定が必要です。その理由はこれらがHTTPヘッダーを書き変えてしまい、バックエンドで取得できる送信元IPアドレスはこれら前段にあるコンポーネントのものになり、リクエストを送信したクライアントのものではなくなってしまうためです。
Front Door側の設定
まず、Front DoorとAKSを接続するためには以下の設定を施します。AKSのエンドポイントはLoad Balancerになっているため、これを指定します。
- バックエンドの追加で、ホストの種類に「パブリックIPアドレス」を選択する。
- ホスト名に、該当するIPアドレスのリソースを選択する。
この時点でIngress Controllerでアクセス制御していない場合は、Front DoorのURLで普通にアプリケーションにアクセスできることになります。ですが前回のapp1はアクセス制御しているので、Front Doorを通してアクセスすると、ホワイトリストのIPアドレスと異なるため以下のようにNGINXがエラーを返します。
NGINX Ingress Controllerの設定
Front Doorが書き換える前のアクセス元IPアドレスは、X-Forwarded-Forヘッダーに格納されているため、この値を取得するようにIngress Controllerを構成する必要があります。NGINX Ingress Controllerの場合はConfigMapで設定を加えます。
大まかな手順は下のとおりです。
- Ingress Controllerのリソースが使用するConfigMapを確認する。
- ConfigMapに環境変数を追加する。
HelmでNGINX Ingress Controllerをデプロイすると、実は取得対象のConfigMapも指定されているのですが、ConfigMap自体は作成されません。したがって指定された名前で、自分でConfigMapを作成します。
ConfigMapの指定を確認
Ingress Controllerのリソースを確認し、describeします。
kubectl -n ingress-basic get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-ingress-ingress-nginx-controller 1/1 1 1 4d5h
kubectl -n ingress-basic describe deployments.apps nginx-ingress-ingress-nginx-controller
(中略)
Containers:
controller:
(中略)
Args:
/nginx-ingress-controller
(中略)
--ingress-class=nginx
--configmap=$(POD_NAMESPACE)/nginx-ingress-ingress-nginx-controller
一番下の --configmap=
の部分がConfigMapの指定です。
ConfigMapの作成
確認したnameとnamespaceで、ConfigMapを作成します。この際、X-Forwarded-Forを使用するために、use-forwarded-headers環境変数を設定します。
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-ingress-ingress-nginx-controller #前述のdescribe結果から指定
namespace: ingress-basic #前述のdescribe結果から指定
data:
use-forwarded-headers: "true" #Forwardedヘッダーを使用する設定
デプロイします。
kubectl apply -f configmap.yaml
これでIngress Controllerが元の送信元IPアドレスを見てくれるようになります。
動作確認
改めてFront Doorを通して、app1にホワイトリストのIPアドレスからアクセスします。
無事アクセスできるようになりました!